Skip to content

Commit 0f34920

Browse files
committed
feat: add specific error message duped names
Previously panelcleaner would silently go by, which could cause downstream errors that seemed unrelated. This change catches those errors at the panel mapping level since they don't depend on the data to be homogenized.
1 parent c269858 commit 0f34920

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

R/panel-mapping.R

+33
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ panel_mapping <- function(df, waves, .schema = list()) {
8181
}
8282
}
8383

84+
for (p in unique(df[[schema$panel]])) {
85+
validate_panel(df, p, waves, schema)
86+
}
87+
8488
df <- prep_mapping(df)
8589

8690
structure(
@@ -91,6 +95,35 @@ panel_mapping <- function(df, waves, .schema = list()) {
9195
)
9296
}
9397

98+
validate_panel <- function(df, p, waves, schema) {
99+
df <- df[df[[schema$panel]] == p, ]
100+
101+
# Don't allow duplicates in names
102+
homogenized_names <- df[[schema$homogenized_name]]
103+
homogenized_names <- homogenized_names[!is.na(homogenized_names)]
104+
105+
if (any(duplicated(homogenized_names))) {
106+
bad_homogenized_names <- unique(homogenized_names[duplicated(homogenized_names)])
107+
bad_homogenized_names <- paste0("- ", bad_homogenized_names, "\n")
108+
109+
tk_err(c("Duplicated homogenized names encountered in {ui_value(p)}:\n", bad_homogenized_names))
110+
}
111+
112+
for (w in waves) {
113+
name_col <- paste0(schema$wave_name, "_", w)
114+
115+
wave_vars <- df[[name_col]]
116+
wave_vars <- wave_vars[!is.na(wave_vars)]
117+
118+
if (any(duplicated(wave_vars))) {
119+
bad_wave_vars <- unique(wave_vars[duplicated(wave_vars)])
120+
bad_wave_vars <- paste0("- ", bad_wave_vars, "\n")
121+
122+
tk_err(c("Duplicated wave names encountered in {ui_value(w)}:\n", bad_wave_vars))
123+
}
124+
}
125+
}
126+
94127
panel_mapping_schema <- function(x) {
95128
attr(x, "schema", exact = TRUE)
96129
}

tests/testthat/test-panel.R

+26
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,29 @@ test_that("Basic panel structure holds", {
4444

4545
expect_true(is_panel_mapping(panel_map))
4646
})
47+
48+
test_that("Variable duplicates are caught correctly", {
49+
mapping <- tibble::tribble(
50+
~name_t1, ~coding_t1, ~name_t2, ~coding_t2, ~panel, ~homogenized_name, ~homogenized_coding,
51+
"id", NA_character_, "id", NA_character_, "test_panel", "id", NA_character_,
52+
"time", NA_character_, "time", NA_character_, "test_panel", "time", NA_character_,
53+
"q1", NA_character_, "question1", NA_character_, "test_panel", "question_1", NA_character_,
54+
"q1", NA_character_, "Q2", NA_character_, "test_panel", "question_2", NA_character_,
55+
"q3", NA_character_, "q3", NA_character_, "test_panel", "question_3", NA_character_
56+
)
57+
58+
err <- expect_error(panel_mapping(mapping, waves = c("t1", "t2")))
59+
expect_match(err$message, "^Duplicated wave names")
60+
61+
mapping <- tibble::tribble(
62+
~name_t1, ~coding_t1, ~name_t2, ~coding_t2, ~panel, ~homogenized_name, ~homogenized_coding,
63+
"id", NA_character_, "id", NA_character_, "test_panel", "id", NA_character_,
64+
"time", NA_character_, "time", NA_character_, "test_panel", "time", NA_character_,
65+
"q1", NA_character_, "question1", NA_character_, "test_panel", "question_1", NA_character_,
66+
"q2", NA_character_, "Q2", NA_character_, "test_panel", "question_1", NA_character_,
67+
"q3", NA_character_, "q3", NA_character_, "test_panel", "question_3", NA_character_
68+
)
69+
70+
err <- expect_error(panel_mapping(mapping, waves = c("t1", "t2")))
71+
expect_match(err$message, "^Duplicated homogenized names")
72+
})

0 commit comments

Comments
 (0)