diff --git a/NEWS.md b/NEWS.md index a2d8807b..9e88bdfc 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,7 @@ # haven (development version) +* `labelled()` tests that value labels are unique (@larmarange, #364). + * `as_factor(x)` is now faster when `x` does not contain any missing values (@hughparsonage). diff --git a/R/labelled.R b/R/labelled.R index a15dced5..d4dd2160 100644 --- a/R/labelled.R +++ b/R/labelled.R @@ -48,6 +48,9 @@ labelled <- function(x, labels, label = NULL) { if (is.null(names(labels))) { stop("`labels` must have names", call. = FALSE) } + if (any(duplicated(stats::na.omit(labels)))) { + stop("`labels` must be unique", call. = FALSE) + } if (!is.null(label) && (!is.character(label) || length(label) != 1)) { stop("`label` must be a character vector of length one", call. = FALSE) } diff --git a/tests/testthat/test-labelled.R b/tests/testthat/test-labelled.R index bcffb7bf..c5d41851 100644 --- a/tests/testthat/test-labelled.R +++ b/tests/testthat/test-labelled.R @@ -23,6 +23,10 @@ test_that("label must be length 1 character or missing", { "character vector of length one") }) +test_that("labels must be unique", { + expect_error(labelled(1, c(female = 1, male = 1)), "must be unique") +}) + # methods ----------------------------------------------------------------- test_that("printed output is stable", { diff --git a/tests/testthat/test-labelled_spss.R b/tests/testthat/test-labelled_spss.R index 185ed8f5..cb4f14ed 100644 --- a/tests/testthat/test-labelled_spss.R +++ b/tests/testthat/test-labelled_spss.R @@ -32,6 +32,11 @@ test_that("subsetting preserves attributes", { expect_identical(x, x[]) }) +test_that("labels must be unique", { + expect_error( + labelled_spss(1, c(female = 1, male = 1), na_values = 9), + "must be unique") +}) # is.na -------------------------------------------------------------------