From 6e93950a4074c1fbda35ef265ba054e1f02e21d7 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 14 Sep 2023 16:11:51 +0200 Subject: [PATCH] Fix `data_write()` for partially labelled characters (#459) * fix data_write for partially labelled characters * remove whitespace * Update tests/testthat/test-data_write.R Co-authored-by: Etienne Bacher <52219252+etiennebacher@users.noreply.github.com> * use correct file path * read back and check --------- Co-authored-by: Etienne Bacher <52219252+etiennebacher@users.noreply.github.com> --- DESCRIPTION | 2 +- NEWS.md | 4 ++++ R/data_write.R | 6 +++++- tests/testthat/test-data_write.R | 20 ++++++++++++++++++++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 1144e0b80..bd8bbcea3 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Type: Package Package: datawizard Title: Easy Data Wrangling and Statistical Transformations -Version: 0.8.0.13 +Version: 0.8.0.14 Authors@R: c( person("Indrajeet", "Patil", , "patilindrajeet.science@gmail.com", role = "aut", comment = c(ORCID = "0000-0003-1995-6531", Twitter = "@patilindrajeets")), diff --git a/NEWS.md b/NEWS.md index c747eb8dc..d1c0a3e52 100644 --- a/NEWS.md +++ b/NEWS.md @@ -41,6 +41,10 @@ BUG FIXES * Fixed issues in `data_write()` when writing labelled data into SPSS format and vectors were of different type as value labels. +* Fixed issues in `data_write()` when writing labelled data into SPSS format + for character vectors with missing value labels, but existing variable + labels. + * Fixed issue in `recode_into()` with probably wrong case number printed in the warning when several recode patterns match to one case. diff --git a/R/data_write.R b/R/data_write.R index b8d710d2e..324b71168 100644 --- a/R/data_write.R +++ b/R/data_write.R @@ -142,9 +142,13 @@ data_write <- function(data, # character requires special preparation to save value labels # haven:::vec_cast_named requires "x" and "labels" to be of same type if (is.character(i)) { + # only prepare value labels when these are not NULL + if (!is.null(value_labels)) { + value_labels <- stats::setNames(as.character(value_labels), names(value_labels)) + } haven::labelled( x = i, - labels = stats::setNames(as.character(value_labels), names(value_labels)), + labels = value_labels, label = variable_label ) } else { diff --git a/tests/testthat/test-data_write.R b/tests/testthat/test-data_write.R index a51931bd7..861f67b46 100644 --- a/tests/testthat/test-data_write.R +++ b/tests/testthat/test-data_write.R @@ -132,3 +132,23 @@ test_that("data_write, no file extension", { expect_error(data_write(d, "mytestfile")) expect_error(data_write(d, NULL)) }) + + +# writing character vector works for missing value labels ------------------ + +tmp <- tempfile(fileext = ".sav") +on.exit(unlink(tmp)) + +test_that("data_write, existing variable label but missing value labels", { + d <- data.frame( + a = letters[1:3], + stringsAsFactors = FALSE + ) + d$a <- assign_labels(d$a, variable = "First") + # expect message, but no error + expect_message(data_write(d, tmp), regex = "Preparing") + + # check if data is really the same + d2 <- data_read(tmp) + expect_identical(d2, d) +})