Imported data should expose the fields that downstream code expects.

Program

Play the script to choose the imported third column and see whether the schema check passes.

rename_choice
column_names.R
Replay: real traced execution (multi-file project)
expected <- c("id", "score", "group")
actual <- c("id", "score", "grp")
rename_choice <- 2
replacement <- c("team", "group", "group_id")[rename_choice]
actual[3] <- replacement
missing <- setdiff(expected, actual)
extra <- setdiff(actual, expected)
label <- paste(length(missing), length(extra), sep = ":")
cat(label, "\n", sep = "")
expected <- c("id", "score", "group")
actual <- c("id", "score", "grp")
rename_choice <- 1
replacement <- c("team", "group", "group_id")[rename_choice]
actual[3] <- replacement
missing <- setdiff(expected, actual)
extra <- setdiff(actual, expected)
label <- paste(length(missing), length(extra), sep = ":")
cat(label, "\n", sep = "")
expected <- c("id", "score", "group")
actual <- c("id", "score", "grp")
rename_choice <- 3
replacement <- c("team", "group", "group_id")[rename_choice]
actual[3] <- replacement
missing <- setdiff(expected, actual)
extra <- setdiff(actual, expected)
label <- paste(length(missing), length(extra), sep = ":")
cat(label, "\n", sep = "")
  1. expected ← id, score, group

    1expected <- c("id", "score", "group")2actual <- c("id", "score", "grp")
    values this stepid, score, groupexpected
  2. actual ← id, score, grp

    1expected <- c("id", "score", "group")2actual <- c("id", "score", "grp")3rename_choice <- 2
    values this stepid, score, grpactual
  3. rename_choice ← 2

    2actual <- c("id", "score", "grp")3rename_choice <- 24replacement <- c("team", "group", "group_id")[rename_choice]
    values this step2rename_choice
  4. replacement ← group

    3rename_choice <- 24replacement <- c("team", "group", "group_id")[rename_choice]5actual[3] <- replacement
    values this stepgroupreplacement2rename_choice
  5. actual ← id, score, group

    4replacement <- c("team", "group", "group_id")[rename_choice]5actual[3] <- replacement6missing <- setdiff(expected, actual)
    values this stepid, score, groupactualgroupreplacement
  6. missing ← none

    5actual[3] <- replacement6missing <- setdiff(expected, actual)7extra <- setdiff(actual, expected)
    values this stepnonemissingid, score, groupexpectedid, score, groupactual
  7. extra ← none

    6missing <- setdiff(expected, actual)7extra <- setdiff(actual, expected)8label <- paste(length(missing), length(extra), sep = ":")
    values this stepnoneextraid, score, groupactualid, score, groupexpected
  8. label ← 0:0

    7extra <- setdiff(actual, expected)8label <- paste(length(missing), length(extra), sep = ":")9cat(label, "\n", sep = "")
    values this step0:0label0 fieldsmissing0 fieldsextra
  9. cat(label, " ", sep = "")

    8label <- paste(length(missing), length(extra), sep = ":")9cat(label, "\n", sep = "")
    output0:0
    values this step0:0label
  1. expected ← id, score, group

    1expected <- c("id", "score", "group")2actual <- c("id", "score", "grp")
    values this stepid, score, groupexpected
  2. actual ← id, score, grp

    1expected <- c("id", "score", "group")2actual <- c("id", "score", "grp")3rename_choice <- 1
    values this stepid, score, grpactual
  3. rename_choice ← 1

    2actual <- c("id", "score", "grp")3rename_choice <- 14replacement <- c("team", "group", "group_id")[rename_choice]
    values this step1rename_choice
  4. replacement ← team

    3rename_choice <- 14replacement <- c("team", "group", "group_id")[rename_choice]5actual[3] <- replacement
    values this stepteamreplacement1rename_choice
  5. actual ← id, score, team

    4replacement <- c("team", "group", "group_id")[rename_choice]5actual[3] <- replacement6missing <- setdiff(expected, actual)
    values this stepid, score, teamactualteamreplacement
  6. missing ← group

    5actual[3] <- replacement6missing <- setdiff(expected, actual)7extra <- setdiff(actual, expected)
    values this stepgroupmissingid, score, groupexpectedid, score, teamactual
  7. extra ← team

    6missing <- setdiff(expected, actual)7extra <- setdiff(actual, expected)8label <- paste(length(missing), length(extra), sep = ":")
    values this stepteamextraid, score, teamactualid, score, groupexpected
  8. label ← 1:1

    7extra <- setdiff(actual, expected)8label <- paste(length(missing), length(extra), sep = ":")9cat(label, "\n", sep = "")
    values this step1:1label1 fieldmissing1 fieldextra
  9. cat(label, " ", sep = "")

    8label <- paste(length(missing), length(extra), sep = ":")9cat(label, "\n", sep = "")
    output1:1
    values this step1:1label
  1. expected ← id, score, group

    1expected <- c("id", "score", "group")2actual <- c("id", "score", "grp")
    values this stepid, score, groupexpected
  2. actual ← id, score, grp

    1expected <- c("id", "score", "group")2actual <- c("id", "score", "grp")3rename_choice <- 3
    values this stepid, score, grpactual
  3. rename_choice ← 3

    2actual <- c("id", "score", "grp")3rename_choice <- 34replacement <- c("team", "group", "group_id")[rename_choice]
    values this step3rename_choice
  4. replacement ← group_id

    3rename_choice <- 34replacement <- c("team", "group", "group_id")[rename_choice]5actual[3] <- replacement
    values this stepgroup_idreplacement3rename_choice
  5. actual ← id, score, group_id

    4replacement <- c("team", "group", "group_id")[rename_choice]5actual[3] <- replacement6missing <- setdiff(expected, actual)
    values this stepid, score, group_idactualgroup_idreplacement
  6. missing ← group

    5actual[3] <- replacement6missing <- setdiff(expected, actual)7extra <- setdiff(actual, expected)
    values this stepgroupmissingid, score, groupexpectedid, score, group_idactual
  7. extra ← group_id

    6missing <- setdiff(expected, actual)7extra <- setdiff(actual, expected)8label <- paste(length(missing), length(extra), sep = ":")
    values this stepgroup_idextraid, score, group_idactualid, score, groupexpected
  8. label ← 1:1

    7extra <- setdiff(actual, expected)8label <- paste(length(missing), length(extra), sep = ":")9cat(label, "\n", sep = "")
    values this step1:1label1 fieldmissing1 fieldextra
  9. cat(label, " ", sep = "")

    8label <- paste(length(missing), length(extra), sep = ":")9cat(label, "\n", sep = "")
    output1:1
    values this step1:1label
expected fields A schema check starts from the columns later code requires.
missing fields `setdiff(expected, actual)` finds required columns that did not arrive.
extra fields `setdiff(actual, expected)` finds unexpected columns to review.