diff --git a/R/DESCRIPTION b/R/DESCRIPTION index 3163f9a..21296c2 100644 --- a/R/DESCRIPTION +++ b/R/DESCRIPTION @@ -1,6 +1,6 @@ Package: REDCapRITS Title: REDCap Repeating Instrument Table Splitter -Version: 0.2.0 +Version: 0.2.1 Authors@R: c( person("Paul", "Egeler", email = "paul.egeler@spectrumhealth.org", role = c("aut", "cre")), person("Spectrum Health, Grand Rapids, MI", role = "cph")) @@ -14,7 +14,8 @@ Suggests: httr, jsonlite, testthat, - Hmisc + Hmisc, + readr License: GPL-3 Encoding: UTF-8 LazyData: true diff --git a/R/NEWS.md b/R/NEWS.md index e79fe06..fb6157c 100644 --- a/R/NEWS.md +++ b/R/NEWS.md @@ -1,4 +1,8 @@ -# REDCapRITS 0.2.0 (Release date: 2019-??-??) +# REDCapRITS 0.2.1 (Release date: 2019-07-26) + + * [bug] Can now accept `"tbl_df"` objects and `NA`s in the `redcap_repeat_instrument` field. (#12) + +# REDCapRITS 0.2.0 (Release date: 2019-07-08) * [feature] User can now separate each form into its own data.frame, regardless if it is a repeating instrument or not. (#10) * [bug] Handles auto-generated form timestamp fields. diff --git a/R/R/REDCap_split.r b/R/R/REDCap_split.r index d28a26a..3f516ac 100644 --- a/R/R/REDCap_split.r +++ b/R/R/REDCap_split.r @@ -87,7 +87,7 @@ REDCap_split <- function(records, # Process user input records <- process_user_input(records) - metadata <- process_user_input(metadata) + metadata <- as.data.frame(process_user_input(metadata)) # See issue #12 # Get the variable names in the dataset vars_in_data <- names(records) @@ -100,6 +100,15 @@ REDCap_split <- function(records, stop("There are no repeating instruments in this dataset.") } + # Remove NAs from `redcap_repeat_instrument` (see issue #12) + if(any(is.na(records$redcap_repeat_instrument))) { + records$redcap_repeat_instrument <- ifelse( + is.na(records$redcap_repeat_instrument), + "", + as.character(records$redcap_repeat_instrument) + ) + } + # Standardize variable names for metadata names(metadata) <- metadata_names diff --git a/R/R/process_user_input.r b/R/R/process_user_input.r index 5a4a3ac..fe6de68 100644 --- a/R/R/process_user_input.r +++ b/R/R/process_user_input.r @@ -13,7 +13,7 @@ process_user_input.default <- function(x, ...) { } process_user_input.data.frame <- function(x, ...) { - x + x } process_user_input.character <- function(x, ...) { diff --git a/R/tests/testthat/test-csv-exports.R b/R/tests/testthat/test-csv-exports.R index 098e585..9e42432 100644 --- a/R/tests/testthat/test-csv-exports.R +++ b/R/tests/testthat/test-csv-exports.R @@ -13,10 +13,10 @@ records <- read.csv( ) ) +redcap_output_csv1 <- REDCap_split(records, metadata) + # Test that basic CSV export matches reference ------------------------------ test_that("CSV export matches reference", { - redcap_output_csv1 <- REDCap_split(records, metadata) - expect_known_hash(redcap_output_csv1, "f74558d1939c17d9ff0e08a19b956e26") }) @@ -29,3 +29,42 @@ if (requireNamespace("Hmisc", quietly = TRUE)) { }) } + +if (requireNamespace("readr", quietly = TRUE)) { + + context("Compatibility with readr") + + metadata <- readr::read_csv( + get_data_location( + "ExampleProject_DataDictionary_2018-06-07.csv" + ) + ) + + records <- readr::read_csv( + get_data_location( + "ExampleProject_DATA_2018-06-07_1129.csv" + ) + ) + + redcap_output_readr <- REDCap_split(records, metadata) + + expect_matching_elements <- function(FUN) { + FUN <- match.fun(FUN) + expect_identical( + lapply(redcap_output_readr, FUN), + lapply(redcap_output_csv1, FUN) + ) + } + + test_that("Result of data read in with `readr` will match result with `read.csv`", { + + # The list itself + expect_identical(length(redcap_output_readr), length(redcap_output_csv1)) + expect_identical(names(redcap_output_readr), names(redcap_output_csv1)) + + # Each element of the list + expect_matching_elements(names) + expect_matching_elements(dim) + }) + +}