Project settings are easier to audit when defaults and overrides are explicit named values.

Program

Play the script to pick a runtime profile and see the final settings summary.

profile_index
config_defaults.R
Replay: real traced execution (multi-file project)
profile_index <- 1
profiles <- c("dev", "test", "prod")
sample_sizes <- c(dev = 10, test = 100, prod = 1000)
profile <- profiles[profile_index]
sample_size <- sample_sizes[[profile]]
label <- paste(profile, sample_size, sep = ":")
cat(label, "\n", sep = "")
profile_index <- 2
profiles <- c("dev", "test", "prod")
sample_sizes <- c(dev = 10, test = 100, prod = 1000)
profile <- profiles[profile_index]
sample_size <- sample_sizes[[profile]]
label <- paste(profile, sample_size, sep = ":")
cat(label, "\n", sep = "")
profile_index <- 3
profiles <- c("dev", "test", "prod")
sample_sizes <- c(dev = 10, test = 100, prod = 1000)
profile <- profiles[profile_index]
sample_size <- sample_sizes[[profile]]
label <- paste(profile, sample_size, sep = ":")
cat(label, "\n", sep = "")
  1. profile_index ← 1

    1profile_index <- 12profiles <- c("dev", "test", "prod")
    values this step1profile_index
  2. profiles ← dev, test, prod

    1profile_index <- 12profiles <- c("dev", "test", "prod")3sample_sizes <- c(dev = 10, test = 100, prod = 1000)
    values this stepdev, test, prodprofiles
  3. sample_sizes ← dev=10, test=100, prod=1000

    2profiles <- c("dev", "test", "prod")3sample_sizes <- c(dev = 10, test = 100, prod = 1000)4profile <- profiles[profile_index]
    values this stepdev=10, test=100, prod=1000sample_sizes
  4. profile ← dev

    3sample_sizes <- c(dev = 10, test = 100, prod = 1000)4profile <- profiles[profile_index]5sample_size <- sample_sizes[[profile]]
    values this stepdevprofiledev, test, prodprofiles1profile_index
  5. sample_size ← 10

    4profile <- profiles[profile_index]5sample_size <- sample_sizes[[profile]]6label <- paste(profile, sample_size, sep = ":")
    values this step10sample_sizedevprofile
  6. label ← dev:10

    5sample_size <- sample_sizes[[profile]]6label <- paste(profile, sample_size, sep = ":")7cat(label, "\n", sep = "")
    values this stepdev:10labeldevprofile10sample_size
  7. cat(label, " ", sep = "")

    6label <- paste(profile, sample_size, sep = ":")7cat(label, "\n", sep = "")
    outputdev:10
    values this stepdev:10label
  1. profile_index ← 2

    1profile_index <- 22profiles <- c("dev", "test", "prod")
    values this step2profile_index
  2. profiles ← dev, test, prod

    1profile_index <- 22profiles <- c("dev", "test", "prod")3sample_sizes <- c(dev = 10, test = 100, prod = 1000)
    values this stepdev, test, prodprofiles
  3. sample_sizes ← dev=10, test=100, prod=1000

    2profiles <- c("dev", "test", "prod")3sample_sizes <- c(dev = 10, test = 100, prod = 1000)4profile <- profiles[profile_index]
    values this stepdev=10, test=100, prod=1000sample_sizes
  4. profile ← test

    3sample_sizes <- c(dev = 10, test = 100, prod = 1000)4profile <- profiles[profile_index]5sample_size <- sample_sizes[[profile]]
    values this steptestprofiledev, test, prodprofiles2profile_index
  5. sample_size ← 100

    4profile <- profiles[profile_index]5sample_size <- sample_sizes[[profile]]6label <- paste(profile, sample_size, sep = ":")
    values this step100sample_sizetestprofile
  6. label ← test:100

    5sample_size <- sample_sizes[[profile]]6label <- paste(profile, sample_size, sep = ":")7cat(label, "\n", sep = "")
    values this steptest:100labeltestprofile100sample_size
  7. cat(label, " ", sep = "")

    6label <- paste(profile, sample_size, sep = ":")7cat(label, "\n", sep = "")
    outputtest:100
    values this steptest:100label
  1. profile_index ← 3

    1profile_index <- 32profiles <- c("dev", "test", "prod")
    values this step3profile_index
  2. profiles ← dev, test, prod

    1profile_index <- 32profiles <- c("dev", "test", "prod")3sample_sizes <- c(dev = 10, test = 100, prod = 1000)
    values this stepdev, test, prodprofiles
  3. sample_sizes ← dev=10, test=100, prod=1000

    2profiles <- c("dev", "test", "prod")3sample_sizes <- c(dev = 10, test = 100, prod = 1000)4profile <- profiles[profile_index]
    values this stepdev=10, test=100, prod=1000sample_sizes
  4. profile ← prod

    3sample_sizes <- c(dev = 10, test = 100, prod = 1000)4profile <- profiles[profile_index]5sample_size <- sample_sizes[[profile]]
    values this stepprodprofiledev, test, prodprofiles3profile_index
  5. sample_size ← 1000

    4profile <- profiles[profile_index]5sample_size <- sample_sizes[[profile]]6label <- paste(profile, sample_size, sep = ":")
    values this step1000sample_sizeprodprofile
  6. label ← prod:1000

    5sample_size <- sample_sizes[[profile]]6label <- paste(profile, sample_size, sep = ":")7cat(label, "\n", sep = "")
    values this stepprod:1000labelprodprofile1000sample_size
  7. cat(label, " ", sep = "")

    6label <- paste(profile, sample_size, sep = ":")7cat(label, "\n", sep = "")
    outputprod:1000
    values this stepprod:1000label

Follow the Profile

  1. profile_index starts at 1.
  2. profiles[1] selects dev.
  3. sample_sizes[["dev"]] reads 10.
  4. paste(profile, sample_size, sep = ":") builds dev:10.
  5. The script prints dev:10. | profile_index | profile | sample_size | output | | ---: | --- | ---: | --- | | 1 | dev | 10 | dev:10 | | 2 | test | 100 | test:100 | | 3 | prod | 1000 | prod:1000 |
profile A profile selects one named set of settings.
named vector `sample_sizes[[profile]]` reads a setting by name.
configuration Keeping settings in data makes overrides explicit.

Exercise: config_defaults.R

Reproduce dev:10, then use profile_index 2 and 3 to predict test:100 and prod:1000.