From e8bf98618397645fc0b4958513c51897f646e54d Mon Sep 17 00:00:00 2001 From: mwm-displayr <147356510+mwm-displayr@users.noreply.github.com> Date: Mon, 4 Mar 2024 14:20:56 +1100 Subject: [PATCH 01/16] DS-5236: Refactor isIntegerValued --- R/mergingandstackingutilities.R | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/R/mergingandstackingutilities.R b/R/mergingandstackingutilities.R index ab24028..ef368db 100644 --- a/R/mergingandstackingutilities.R +++ b/R/mergingandstackingutilities.R @@ -352,10 +352,11 @@ splitByComma <- function(input.text, ignore.commas.in.parentheses = FALSE) #' isIntegerValued(c(1, 2, 3)) # TRUE #' isIntegerValued(c(1, 2.1, 3)) # FALSE #' @noRd -isIntegerValued <- function(x) +isIntegerValued <- function(x, val.attr = NULL) { - val.attr <- attr(x, "labels", exact = TRUE) - if (!any(is.nan(val.attr)) && is.numeric(x)) + value.attrs.not.nan <- is.null(val.attr) || !any(is.nan(val.attr)) + vals.not.nan <- !all(abs(result) <= .Machine$integer.max, na.rm = TRUE) + if (value.attrs.not.nan && vals.not.nan && is.numeric(x)) { x.without.na <- removeNA(x) all(floor(x.without.na) == x.without.na & From fddbf8336412bca00deefae6a5a6685c1e512786 Mon Sep 17 00:00:00 2001 From: mwm-displayr <147356510+mwm-displayr@users.noreply.github.com> Date: Mon, 4 Mar 2024 14:25:03 +1100 Subject: [PATCH 02/16] DS-5464: Improve isIntegerValued refactor --- R/mergingandstackingutilities.R | 2 ++ 1 file changed, 2 insertions(+) diff --git a/R/mergingandstackingutilities.R b/R/mergingandstackingutilities.R index ef368db..384049c 100644 --- a/R/mergingandstackingutilities.R +++ b/R/mergingandstackingutilities.R @@ -354,6 +354,8 @@ splitByComma <- function(input.text, ignore.commas.in.parentheses = FALSE) #' @noRd isIntegerValued <- function(x, val.attr = NULL) { + if (is.null(val.attr)) + val.attr <- attr(input.var, "labels", exact = TRUE) value.attrs.not.nan <- is.null(val.attr) || !any(is.nan(val.attr)) vals.not.nan <- !all(abs(result) <= .Machine$integer.max, na.rm = TRUE) if (value.attrs.not.nan && vals.not.nan && is.numeric(x)) From e2acf939717fa96a01adee6c13ea0deb4a15ba1e Mon Sep 17 00:00:00 2001 From: mwm-displayr <147356510+mwm-displayr@users.noreply.github.com> Date: Mon, 4 Mar 2024 14:30:44 +1100 Subject: [PATCH 03/16] DS-5464: Remove extra checks now inside isIntegerValued --- R/mergedatasetsbycase.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/mergedatasetsbycase.R b/R/mergedatasetsbycase.R index 21199a3..b627dc7 100644 --- a/R/mergedatasetsbycase.R +++ b/R/mergedatasetsbycase.R @@ -2066,7 +2066,7 @@ combineAsCategoricalVariable <- function(var.list, data.sets, } } - if (isIntegerValued(result) && all(abs(result) <= .Machine$integer.max, na.rm = TRUE)) + if (isIntegerValued(result)) { result <- as.integer(result) nms <- names(merged.val.attr) @@ -2496,7 +2496,7 @@ combineAsNumericVariable <- function(var.list, data.sets, v.types) v })) - if (isIntegerValued(result) && all(abs(result) <= .Machine$integer.max, na.rm = TRUE)) + if (isIntegerValued(result)) result <- as.integer(result) return(result) From 7c05b2aab166a2cdebe24d32d86dcb3861d3723c Mon Sep 17 00:00:00 2001 From: mwm-displayr <147356510+mwm-displayr@users.noreply.github.com> Date: Mon, 4 Mar 2024 14:32:02 +1100 Subject: [PATCH 04/16] DS-5464: Add unit test --- tests/testthat/test-mergedatasetsbycase.R | 37 +++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/tests/testthat/test-mergedatasetsbycase.R b/tests/testthat/test-mergedatasetsbycase.R index 4b81441..c766537 100644 --- a/tests/testthat/test-mergedatasetsbycase.R +++ b/tests/testthat/test-mergedatasetsbycase.R @@ -1338,6 +1338,43 @@ test_that("DS-5306 Support when both data sets have meresrc variables", { expect_equal(mergesrc, expected) }) +test_that("DS-5236: Merging with missing data (NaN value attr.) stays NaN in output", +{ + input.data <- structure(list(Q1 = + structure(c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 4), + label = "I love cats", + format.spss = "F4.0", + labels = c(`Strongly disagree` = 1, Disagree = 2, + `Neither agree nor disagree` = 3, + Agree = 4, `Strongly agree` = 5), + class = c("haven_labelled", "vctrs_vctr", "double")), + Q2 = structure(c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 4), + label = "I love dogs", + format.spss = "F4.0", + labels = c(`Strongly disagree` = 1, Disagree = 2, + `Neither agree nor disagree` = 3, Agree = 4, + `Strongly agree` = 5), + class = c("haven_labelled", "vctrs_vctr", "double")), + Q3 = structure(c(4, 4, 4, 3, 4, 4, 3, 3, 3, 2), label = "QA3", + format.spss = "F4.0", + labels = c(`Dog` = 1, Pig = 2, + `Giraffe` = 3, Cow = 4, + `Missing data` = NaN), + class = c("haven_labelled", "vctrs_vctr", "double"))), + row.names = c(NA, -10L), + class = c("tbl_df", "tbl", "data.frame")) + in.tfile <- "temp_data_for_merge.sav" + out.tfile <- "temp_data_merged.sav" + haven::write_sav(input.data, in.tfile) + + output <- do.call(MergeDataSetsByCase, list(c(in.tfile, in.tfile), out.tfile)) + expected.labels <- attr(input.data[["Q3"]], "labels") + output.labels <- attr(haven::read_sav(out.tfile)[[3]], "labels") + expect_equal(expected.labels, output.labels) + unlink(in.tfile) + unlink(out.tfile) +}) + if (file.exists("Combined data set.sav")) file.remove("Combined data set.sav") From 81ce6c9e5191a342ffa272ea0f52d734ac68389c Mon Sep 17 00:00:00 2001 From: mwm-displayr <147356510+mwm-displayr@users.noreply.github.com> Date: Mon, 4 Mar 2024 14:33:29 +1100 Subject: [PATCH 05/16] DS-5236: Fixup refactor of isIntegerValued --- R/mergingandstackingutilities.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/mergingandstackingutilities.R b/R/mergingandstackingutilities.R index 384049c..b1b9e7b 100644 --- a/R/mergingandstackingutilities.R +++ b/R/mergingandstackingutilities.R @@ -355,7 +355,7 @@ splitByComma <- function(input.text, ignore.commas.in.parentheses = FALSE) isIntegerValued <- function(x, val.attr = NULL) { if (is.null(val.attr)) - val.attr <- attr(input.var, "labels", exact = TRUE) + val.attr <- attr(x, "labels", exact = TRUE) value.attrs.not.nan <- is.null(val.attr) || !any(is.nan(val.attr)) vals.not.nan <- !all(abs(result) <= .Machine$integer.max, na.rm = TRUE) if (value.attrs.not.nan && vals.not.nan && is.numeric(x)) From aef153078f4c81a325dd19ccf51cdcea176ab4bd Mon Sep 17 00:00:00 2001 From: mwm-displayr <147356510+mwm-displayr@users.noreply.github.com> Date: Mon, 4 Mar 2024 14:36:09 +1100 Subject: [PATCH 06/16] DS-5464: Fixup copy/paste error --- R/mergingandstackingutilities.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/mergingandstackingutilities.R b/R/mergingandstackingutilities.R index b1b9e7b..7696056 100644 --- a/R/mergingandstackingutilities.R +++ b/R/mergingandstackingutilities.R @@ -357,7 +357,7 @@ isIntegerValued <- function(x, val.attr = NULL) if (is.null(val.attr)) val.attr <- attr(x, "labels", exact = TRUE) value.attrs.not.nan <- is.null(val.attr) || !any(is.nan(val.attr)) - vals.not.nan <- !all(abs(result) <= .Machine$integer.max, na.rm = TRUE) + vals.not.nan <- !all(abs(x) <= .Machine$integer.max, na.rm = TRUE) if (value.attrs.not.nan && vals.not.nan && is.numeric(x)) { x.without.na <- removeNA(x) From 40df714021017c893d59b9d891795494d5263660 Mon Sep 17 00:00:00 2001 From: mwm-displayr <147356510+mwm-displayr@users.noreply.github.com> Date: Mon, 4 Mar 2024 17:08:38 +1100 Subject: [PATCH 07/16] DS-5464: Fixupfixup refactor of isIntegerValued --- R/mergingandstackingutilities.R | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/R/mergingandstackingutilities.R b/R/mergingandstackingutilities.R index 7696056..69a0ff4 100644 --- a/R/mergingandstackingutilities.R +++ b/R/mergingandstackingutilities.R @@ -354,11 +354,14 @@ splitByComma <- function(input.text, ignore.commas.in.parentheses = FALSE) #' @noRd isIntegerValued <- function(x, val.attr = NULL) { + if (!is.numeric(x)) + return(FALSE) + if (is.null(val.attr)) val.attr <- attr(x, "labels", exact = TRUE) value.attrs.not.nan <- is.null(val.attr) || !any(is.nan(val.attr)) vals.not.nan <- !all(abs(x) <= .Machine$integer.max, na.rm = TRUE) - if (value.attrs.not.nan && vals.not.nan && is.numeric(x)) + if (value.attrs.not.nan && vals.not.nan) { x.without.na <- removeNA(x) all(floor(x.without.na) == x.without.na & From 31e9c6346c1bbafdb847a3e08421f3b55e6e89a0 Mon Sep 17 00:00:00 2001 From: mwm-displayr <147356510+mwm-displayr@users.noreply.github.com> Date: Wed, 13 Mar 2024 17:17:20 +1100 Subject: [PATCH 08/16] DS-5236: Fixup refactor of isIntegerValued --- R/mergingandstackingutilities.R | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/R/mergingandstackingutilities.R b/R/mergingandstackingutilities.R index 69a0ff4..c25d2e9 100644 --- a/R/mergingandstackingutilities.R +++ b/R/mergingandstackingutilities.R @@ -359,15 +359,14 @@ isIntegerValued <- function(x, val.attr = NULL) if (is.null(val.attr)) val.attr <- attr(x, "labels", exact = TRUE) - value.attrs.not.nan <- is.null(val.attr) || !any(is.nan(val.attr)) - vals.not.nan <- !all(abs(x) <= .Machine$integer.max, na.rm = TRUE) - if (value.attrs.not.nan && vals.not.nan) - { - x.without.na <- removeNA(x) - all(floor(x.without.na) == x.without.na & - !is.infinite(x.without.na)) - }else - FALSE + if (!is.null(val.attr) && !any(is.nan(val.attr))) + return(FALSE) + + + x.without.na <- removeNA(x) + all(floor(x.without.na) == x.without.na & + !is.infinite(x.without.na) & + abs(x.without.na) <= .Machine$integer.max) } #' @param data.set.name A character scalar of the user-input name for From 7f755094691915808dbecab95c3ad702167d9e54 Mon Sep 17 00:00:00 2001 From: mwm-displayr <147356510+mwm-displayr@users.noreply.github.com> Date: Wed, 13 Mar 2024 17:18:47 +1100 Subject: [PATCH 09/16] DS-5236: fix again --- R/mergingandstackingutilities.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/mergingandstackingutilities.R b/R/mergingandstackingutilities.R index c25d2e9..1789e46 100644 --- a/R/mergingandstackingutilities.R +++ b/R/mergingandstackingutilities.R @@ -359,7 +359,7 @@ isIntegerValued <- function(x, val.attr = NULL) if (is.null(val.attr)) val.attr <- attr(x, "labels", exact = TRUE) - if (!is.null(val.attr) && !any(is.nan(val.attr))) + if (!is.null(val.attr) && any(is.nan(val.attr))) return(FALSE) From cc6558e58ff5cc2959b2d150fcd043780acadf6d Mon Sep 17 00:00:00 2001 From: mwm-displayr <147356510+mwm-displayr@users.noreply.github.com> Date: Fri, 15 Mar 2024 14:54:50 +1100 Subject: [PATCH 10/16] DS-5236: Check of int overflow value attr is isIntegerValued --- R/mergingandstackingutilities.R | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/R/mergingandstackingutilities.R b/R/mergingandstackingutilities.R index 1789e46..306a0f0 100644 --- a/R/mergingandstackingutilities.R +++ b/R/mergingandstackingutilities.R @@ -356,13 +356,15 @@ isIntegerValued <- function(x, val.attr = NULL) { if (!is.numeric(x)) return(FALSE) - + if (is.null(val.attr)) val.attr <- attr(x, "labels", exact = TRUE) - if (!is.null(val.attr) && any(is.nan(val.attr))) + if (!is.null(val.attr) && + (any(is.nan(val.attr)) || + any(abs(val.attr) > .Machine$integer.max))) return(FALSE) - - + + x.without.na <- removeNA(x) all(floor(x.without.na) == x.without.na & !is.infinite(x.without.na) & From 53fbd288fb3d9381b48e79d977cf8461d263f905 Mon Sep 17 00:00:00 2001 From: mwm-displayr <147356510+mwm-displayr@users.noreply.github.com> Date: Fri, 15 Mar 2024 14:57:38 +1100 Subject: [PATCH 11/16] DS-5236: Add unit test for last commit --- tests/testthat/test-mergedatasetsbycase.R | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/testthat/test-mergedatasetsbycase.R b/tests/testthat/test-mergedatasetsbycase.R index c766537..be17a57 100644 --- a/tests/testthat/test-mergedatasetsbycase.R +++ b/tests/testthat/test-mergedatasetsbycase.R @@ -1375,6 +1375,25 @@ test_that("DS-5236: Merging with missing data (NaN value attr.) stays NaN in out unlink(out.tfile) }) +test_that("DS-5115: Merging with missing data (NaN value attr.) stays NaN in output", +{ + out.file <- "temp_data_for_merge.sav" + in.file <- findInstDirFile("SPSSWithIntegerValueError1.sav") + + expect_silent(do.call(MergeDataSetsByCase, + list(c(in.file, in.file), out.file))) + output.data <- haven::read_spss(out.file) + input.data <- haven::read_spss(in.file) + expected.labels <- attr(input.data[["badvar1"]], "labels") + output.labels <- attr(output.data[["badvar1"]], "labels") + expect_equal(expected.labels, output.labels) + + expected.badvar <- c(input.data[["badvar1"]], input.data[["badvar1"]]) + attr(expected.badvar, "format.spss") <- "F8.2" + expect_equal(expected.badvar, output.data[["badvar1"]]) + unlink(out.file) +}) + if (file.exists("Combined data set.sav")) file.remove("Combined data set.sav") From 2bd4e42dc2a80de43c7b7a75210ac55348df82a3 Mon Sep 17 00:00:00 2001 From: mwm-displayr <147356510+mwm-displayr@users.noreply.github.com> Date: Fri, 15 Mar 2024 15:09:40 +1100 Subject: [PATCH 12/16] DS-5236: Fixup refactor of isIntegerValued --- R/mergedatasetsbycase.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/mergedatasetsbycase.R b/R/mergedatasetsbycase.R index b627dc7..ae2dff3 100644 --- a/R/mergedatasetsbycase.R +++ b/R/mergedatasetsbycase.R @@ -2066,7 +2066,7 @@ combineAsCategoricalVariable <- function(var.list, data.sets, } } - if (isIntegerValued(result)) + if (isIntegerValued(result, merged.val.attr)) { result <- as.integer(result) nms <- names(merged.val.attr) From f1b4d18e5463e1616314fbaaf76aefcba7387611 Mon Sep 17 00:00:00 2001 From: mwm-displayr <147356510+mwm-displayr@users.noreply.github.com> Date: Fri, 15 Mar 2024 15:53:00 +1100 Subject: [PATCH 13/16] DS-5236: Update unit tests from DS-5115 --- tests/testthat/test-mergedatasetsbyvariable.R | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/tests/testthat/test-mergedatasetsbyvariable.R b/tests/testthat/test-mergedatasetsbyvariable.R index 32fa26b..271e452 100644 --- a/tests/testthat/test-mergedatasetsbyvariable.R +++ b/tests/testthat/test-mergedatasetsbyvariable.R @@ -261,20 +261,15 @@ test_that("exampleIDValues", { }) test_that("DS-5115: Handle integer values outside R's allowable range", { - expect_warning( + expect_silent( MergeDataSetsByVariable(data.set.names = c(findInstDirFile("SPSSWithIntegerValueError1.sav"), - findInstDirFile("SPSSWithIntegerValueError2.sav"))), - "contains a value outside of the allowable range" + findInstDirFile("SPSSWithIntegerValueError2.sav"))) ) - - expect_warning( - expect_error( + + expect_silent( MergeDataSetsByVariable(data.set.names = c(findInstDirFile("SPSSWithIntegerValueError3.sav"), - findInstDirFile("SPSSWithIntegerValueError2.sav"))), - "contains multiple values outside the allowable range" - ), - "contains a value outside of the allowable range" - ) + findInstDirFile("SPSSWithIntegerValueError2.sav"))) + ) }) if (file.exists("Combined data set.sav")) From b2c9399538f032f51fb42b8c6323b46604f80878 Mon Sep 17 00:00:00 2001 From: mwm-displayr <147356510+mwm-displayr@users.noreply.github.com> Date: Fri, 15 Mar 2024 15:57:09 +1100 Subject: [PATCH 14/16] DS-5236: Remove old code for recoding too-large int values --- R/mergedatasetsbyvariable.R | 46 ------------------------------------- 1 file changed, 46 deletions(-) diff --git a/R/mergedatasetsbyvariable.R b/R/mergedatasetsbyvariable.R index abfae77..5a24f22 100644 --- a/R/mergedatasetsbyvariable.R +++ b/R/mergedatasetsbyvariable.R @@ -580,12 +580,6 @@ doMergeByVariable <- function(data.sets, matched.cases.matrix, merged.var[non.missing.ind] <- input.var[matched.cases.matrix[non.missing.ind, data.set.ind]] - if (isIntegerValued(merged.var)) { - recode.object <- recodeOutOfBoundsIntegersIfNecessary(merged.var, input.var = input.var) - merged.var <- recode.object[["merged.var"]] - input.var <- recode.object[["input.var"]] - merged.var <- as.integer(merged.var) - } v.type <- variableType(input.var) if (v.type == CATEGORICAL.VARIABLE.TYPE) { @@ -671,43 +665,3 @@ print.MergeDataSetByVariablePage <- function(x, ...) do.call(DataSetMergingByVariableWidget, args) } - -recodeOutOfBoundsIntegersIfNecessary <- function(merged.var, input.var) { - merged.unique.vals <- unique(merged.var) - merged.unique.vals <- removeNA(merged.unique.vals) - merged.val.attr <- attr(merged.var, "labels", exact = TRUE) - input.val.attr <- attr(input.var, "labels", exact = TRUE) - all.unique.vals <- unique(c(unclass(merged.unique.vals), unclass(input.val.attr))) - - bad.vals <- abs(all.unique.vals) > 1e9 - n.bad.vals <- length(which(bad.vals)) - if (n.bad.vals == 0) - return(list(merged.var = merged.var, - input.var = input.var)) - lab <- attr(input.var, "label", exact = TRUE) - if (n.bad.vals > 1 ) { - stop("Variable: '", - lab, - "' contains multiple values outside the allowable range. ", - "Values larger than 1,000,000,000 or smaller than -1,000,000,000 ", - "should be recoded before attempting to merge these files.") - } - - offending.value <- all.unique.vals[bad.vals] - remaining.values <- setdiff(all.unique.vals, offending.value) - # -99 is an industry convention - new.value <- if (-99 %in% remaining.values) min(remaining.values) - 1 else -99 - warning("Variable: '", - lab, - "' contains a value outside of the allowable range (", - offending.value, - "). This value has been recoded as ", - new.value) - merged.var[merged.var == offending.value] <- new.value - input.val.attr[input.val.attr == offending.value] <- new.value - merged.val.attr[merged.val.attr == offending.value] <- new.value - attr(input.var, "labels") <- input.val.attr - attr(merged.var, "labels") <- merged.val.attr - list(merged.var = merged.var, - input.var = input.var) -} From c9237edffc30c995ca8813748222928a2216afc4 Mon Sep 17 00:00:00 2001 From: mwm-displayr <147356510+mwm-displayr@users.noreply.github.com> Date: Tue, 19 Mar 2024 18:42:31 +1100 Subject: [PATCH 15/16] DS-5236: Check for invalid integer columns before writing data set with haven --- R/mergingandstackingutilities.R | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/R/mergingandstackingutilities.R b/R/mergingandstackingutilities.R index 306a0f0..e2e2b7a 100644 --- a/R/mergingandstackingutilities.R +++ b/R/mergingandstackingutilities.R @@ -98,6 +98,8 @@ createReadErrorHandler <- function(data.set.name) #' @importFrom tools file_path_sans_ext writeDataSet <- function(data.set, data.set.name, is.saved.to.cloud) { + if (any(invalid.columns <- findInvalidIntegerValueColumns(data.set))) + data.set <- updateClassForLabelledIntegerVariables(data.set, invalid.columns) if (is.saved.to.cloud) { warn.msg <- paste0("The data file ", data.set.name, @@ -624,3 +626,31 @@ throwCombinedDataSetTooLargeError <- function() { stop("The combined data set is too large to create. ", "Consider omitting variables from the combined data set.") } + +#' Checks each labelled integer variable in a data.frame for integer values +#' greater than .Machine$integer.max (including in the value attributes) +#' @param df A data.frame containing haven::labelled and vctrs variables +#' @return a logical vector for each +#' @noRd +findInvalidIntegerValueColumns <- function(df) +{ + n.col <- ncol(df) + invalid.columns <- logical(n.col) + .invalidValues <- function(x) + any(abs(x) > .Machine$integer.max, na.rm = TRUE) + .invalidVariable <- function(variable) + .invalidValues(variable) || + (!is.null(val.attr <- attr(x, "labels", exact = TRUE)) && + .invalidValues(val.attr)) + vapply(df, .invalidVariable, logical(1L)) +} + +#' Updates the class of specified columns of a data.frame from integer to double +#' so they may be saved by haven::write_sav +#' @noRd +updateClassForLabelledIntegerVariables <- function(data.set, col.idx) +{ + for (i in which(col.idx)) + class(data.set[, col.idx])[class(data.set[, col.idx]) %in% "integer"] <- "double" + return(data.set) +} From 0d7e3a353d4b97469edd82c13e5eb9738d6c9735 Mon Sep 17 00:00:00 2001 From: mwm-displayr <147356510+mwm-displayr@users.noreply.github.com> Date: Tue, 19 Mar 2024 19:00:36 +1100 Subject: [PATCH 16/16] DS-5236: Fix typo in last commit --- R/mergingandstackingutilities.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/mergingandstackingutilities.R b/R/mergingandstackingutilities.R index e2e2b7a..bf4f694 100644 --- a/R/mergingandstackingutilities.R +++ b/R/mergingandstackingutilities.R @@ -640,7 +640,7 @@ findInvalidIntegerValueColumns <- function(df) any(abs(x) > .Machine$integer.max, na.rm = TRUE) .invalidVariable <- function(variable) .invalidValues(variable) || - (!is.null(val.attr <- attr(x, "labels", exact = TRUE)) && + (!is.null(val.attr <- attr(variable, "labels", exact = TRUE)) && .invalidValues(val.attr)) vapply(df, .invalidVariable, logical(1L)) }