From cc7fa6624c4dffd75f4405156ef234db9e6a1156 Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Sat, 14 Mar 2020 01:52:36 -0500 Subject: [PATCH 01/10] accommodate `redcap_download_file_oneshot()` for repeated instruments code from @zhangrz2019 in #300 ref #299 --- R/redcap-download-file-oneshot.R | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/R/redcap-download-file-oneshot.R b/R/redcap-download-file-oneshot.R index 61538564..c8e31c97 100644 --- a/R/redcap-download-file-oneshot.R +++ b/R/redcap-download-file-oneshot.R @@ -101,6 +101,8 @@ redcap_download_file_oneshot <- function( record, field, event = "", + repeat_instrument = NULL, + repeat_instance = NULL, verbose = TRUE, config_options = NULL ) { @@ -132,6 +134,14 @@ redcap_download_file_oneshot <- function( if (0L < nchar(event)) post_body$event <- event + if (!is.null(repeat_instrument)) { + if (is.null(repeat_instance)) { + stop("You must specify repeat_instance when specified repeat_instrement"); + } + post_body$repeat_instrument <- repeat_instrument + post_body$repeat_instance <- repeat_instance + } + # This is the first of two important lines in the function. # It retrieves the information from the server and stores it in RAM. kernel <- kernel_api(redcap_uri, post_body, config_options) From cf34ae3efab65a70d0de47beb94273d0613bf2c0 Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Sun, 15 Mar 2020 01:51:05 -0500 Subject: [PATCH 02/10] document new parameters ref #299 --- R/redcap-download-file-oneshot.R | 7 +++++++ man/redcap_download_file_oneshot.Rd | 11 +++++++++++ 2 files changed, 18 insertions(+) diff --git a/R/redcap-download-file-oneshot.R b/R/redcap-download-file-oneshot.R index c8e31c97..fc2f898d 100644 --- a/R/redcap-download-file-oneshot.R +++ b/R/redcap-download-file-oneshot.R @@ -18,6 +18,13 @@ #' Required #' @param event The name of the event where the file is saved in REDCap. #' Optional +#' @param repeat_instrument The name of the instrument that is repeating +#' for a given event. +#' Optional +#' @param repeat_instance (only for projects with repeating instruments/events) +#' The repeat instance number of the repeating event (if longitudinal) or the +#' repeating instrument (if classic or longitudinal). Default value is '1'. +#' Optional #' @param verbose A boolean value indicating if `message`s should be printed #' to the R console during the operation. Optional. #' @param config_options A list of options to pass to [httr::POST()] method diff --git a/man/redcap_download_file_oneshot.Rd b/man/redcap_download_file_oneshot.Rd index b5e6232b..c3a25d83 100644 --- a/man/redcap_download_file_oneshot.Rd +++ b/man/redcap_download_file_oneshot.Rd @@ -13,6 +13,8 @@ redcap_download_file_oneshot( record, field, event = "", + repeat_instrument = NULL, + repeat_instance = NULL, verbose = TRUE, config_options = NULL ) @@ -42,6 +44,15 @@ Required} \item{event}{The name of the event where the file is saved in REDCap. Optional} +\item{repeat_instrument}{The name of the instrument that is repeating +for a given event. +Optional} + +\item{repeat_instance}{(only for projects with repeating instruments/events) +The repeat instance number of the repeating event (if longitudinal) or the +repeating instrument (if classic or longitudinal). Default value is '1'. +Optional} + \item{verbose}{A boolean value indicating if \code{message}s should be printed to the R console during the operation. Optional.} From a1e0fb036c8b60a92612d6b019f1ca1f3ef52f9b Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Fri, 17 Apr 2020 19:49:29 -0500 Subject: [PATCH 03/10] `unname()` a tibble result Kirill Muller warned this would happen in an email to developers using tibble (April 14): > - "names for ... but not for ...": tibbles now unconditionally allow inner names for columns, this leads to false positives in tests. Use unname() for the tests, or, if possible, when constructing the tibble. --- tests/testthat/test-validate.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testthat/test-validate.R b/tests/testthat/test-validate.R index 787726df..dfd9e2af 100644 --- a/tests/testthat/test-validate.R +++ b/tests/testthat/test-validate.R @@ -32,7 +32,7 @@ test_that("validate_no_logical -concern dataset", { ds <- validate_no_logical(vapply(ds_bad, class, character(1))) expect_equal(object=nrow(ds), expected=1, info="One logical field should be flagged") expect_equal(object=ds$field_name, expected="bad_logical") - expect_equal(object=ds$field_index, expected=2) + expect_equal(object=unname(ds$field_index), expected=2) }) test_that("validate_field_names -stop on error", { From 9b3f45cba2be17b8922aa641a5c99bbb71d648e0 Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Sun, 19 Apr 2020 11:00:27 -0500 Subject: [PATCH 04/10] follow @haozhu233's advice closes #291 --- .../unexpected-behavior-issue-template.md | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/unexpected-behavior-issue-template.md b/.github/ISSUE_TEMPLATE/unexpected-behavior-issue-template.md index 2fb86348..3908a715 100644 --- a/.github/ISSUE_TEMPLATE/unexpected-behavior-issue-template.md +++ b/.github/ISSUE_TEMPLATE/unexpected-behavior-issue-template.md @@ -7,19 +7,15 @@ assignees: '' --- -**Describe the behavior** -Please provide a clear and concise description of the scenario and the behavior. *Be careful not to include tokens, PHI (protected health information), or other information that should not be public!* +Thank you for taking the time to file an issue. Here are some suggestions for writing your issue that should let us respond and help you more quickly. -**Troubleshooter Results** -Please carefully reread the [Troubleshooting Vignette](https://ouhscbbmc.github.io/REDCapR/articles/TroubleshootingApiCalls.html) and thoroughly describe which part(s) doesn't work. Many people have contributed to this document; it is likely that it will help precisely identify the location of the problem, which will help us respond with better advice. +**Troubleshooter**: Please carefully reread the [Troubleshooting Vignette](https://ouhscbbmc.github.io/REDCapR/articles/TroubleshootingApiCalls.html) and thoroughly describe which parts don't work. -If you have advice for improving the [Troubleshooter](https://ouhscbbmc.github.io/REDCapR/articles/TroubleshootingApiCalls.html) or [this issue template](https://github.com/OuhscBbmc/REDCapR/blob/master/.github/ISSUE_TEMPLATE/unexpected-behavior-issue-template.md), we'd love to hear about it. +**Describe the behavior**: Please provide a clear and concise description of the scenario and the behavior. *Be careful not to include tokens, PHI (protected health information), or other information that should not be public!* -**Expected behavior** -A clear and concise description of what you expected to happen. -**Screenshots** -If applicable, add screenshots to help explain your problem. +**Expected behavior**: A clear and concise description of what you expected to happen. + **Desktop (please complete the following information):** - OS: [e.g. Windows 10] @@ -27,7 +23,9 @@ If applicable, add screenshots to help explain your problem. - REDCapR Version [e.g. 0.10.2.9005 --run `packageVersion("REDCapR")`] -**Additional context** -Add any other context about the problem here. +**Additional context**: Add any other information about the specific problem, such as a data dictionary or screenshot. + -*Remember, don't include tokens, PHI, or other information that should not be public.* +**Thank you and reminder**: + * Many people have contributed to this package and it's documentation, and it's continually improving. If you have advice for improving the documentation, the [Troubleshooter](https://ouhscbbmc.github.io/REDCapR/articles/TroubleshootingApiCalls.html), or [this issue template](https://github.com/OuhscBbmc/REDCapR/blob/master/.github/ISSUE_TEMPLATE/unexpected-behavior-issue-template.md), we'd love to hear it. + * *Remember, don't include tokens, PHI, or other information that should not be public.* From d5b28e4891e7fc5c82530cd65e7ec89e2b251d38 Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Sun, 19 Apr 2020 11:26:04 -0500 Subject: [PATCH 05/10] include specific error message follows @vortexing's advice in #278 --- vignettes/TroubleshootingApiCalls.Rmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vignettes/TroubleshootingApiCalls.Rmd b/vignettes/TroubleshootingApiCalls.Rmd index 9cc1fcfd..7bf2bd2b 100644 --- a/vignettes/TroubleshootingApiCalls.Rmd +++ b/vignettes/TroubleshootingApiCalls.Rmd @@ -266,7 +266,7 @@ If you're not using REDCapR, you can skip this section and proceed to "Exporting redcap_metadata_read(redcap_uri = uri, token = token) ``` - If this fails, see "Problems in the project's metadata/dictionary." under [Gotchas](#gotchas-agnostic) below. + If this fails, see "Problems in the project's metadata/dictionary" under [Common Gotchas](#gotchas-agnostic) above. A problematic data dictionary may produce the error `Error in inherits(ds, "data.frame") : object 'ds' not found` when calling `REDCapR::redcap_metadata_read()`. 1. **Can you export from an example project?** This is the same fake data hosted by the [OUHSC BBMC](http://ouhsc.edu/bbmc/) as in the previous section. @@ -383,7 +383,7 @@ If you're not using redcapAPI, you can skip this section and proceed to 'Importi exportMetaData(rcon) ``` - If this fails, see "Problems in the project's metadata/dictionary." under [Gotchas](#gotchas-agnostic) below. + If this fails, see "Problems in the project's metadata/dictionary." under [Gotchas](#gotchas-agnostic) above 1. **Can you export from an example project?** This is the same fake data hosted by the [OUHSC BBMC](http://ouhsc.edu/bbmc/) as in the previous section. From 88d7e32224e163705869a47e5bd60c5504f577fb Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Sun, 19 Apr 2020 12:19:15 -0500 Subject: [PATCH 06/10] test more potentiall-problematic characters in dictionary curly double quotes and long dashes closes #290 --- .../problematic-dictionary/problematic-dictionary.csv | 3 +++ tests/testthat/test-metadata-read.R | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/inst/test-data/problematic-dictionary/problematic-dictionary.csv b/inst/test-data/problematic-dictionary/problematic-dictionary.csv index fbc1c4f5..0d05e936 100644 --- a/inst/test-data/problematic-dictionary/problematic-dictionary.csv +++ b/inst/test-data/problematic-dictionary/problematic-dictionary.csv @@ -2,3 +2,6 @@ record_id,form_1,,text,"Record ID",,,,,,,,,,,,, v1,form_1,,dropdown,"Is the laser mounted on the shark?�?�","0, No | 1, Yes | 3, I should find out",,,,,,,,,,,, curly_quote_single,form_1,,radio,My child doesn’t like candy,"0, (0) Never or Almost Never | 1, (1) Sometimes | 2, (2) Often",,,,,,,,,,,, +curly_quote_double_left,form_1,,radio,Maybe I don't “look the part","0, Bennett | 1, Brauer",,,,,,,,,,,,https://github.com/OuhscBbmc/REDCapR/issues/290 +curly_quote_double_right,form_1,,radio,Maybe I don't "look comfortable on camera”,"0, Bennett | 1, Brauer",,,,,,,,,,,,https://github.com/OuhscBbmc/REDCapR/issues/290 +long_dash,form_1,,radio,Maybe I don't "wear the latest clothes" −or even ones that don't "reek","0, Bennett | 1, Brauer",,,,,,,,,,,,https://github.com/OuhscBbmc/REDCapR/issues/290 diff --git a/tests/testthat/test-metadata-read.R b/tests/testthat/test-metadata-read.R index 0f5bd388..5a07ff25 100644 --- a/tests/testthat/test-metadata-read.R +++ b/tests/testthat/test-metadata-read.R @@ -31,10 +31,10 @@ test_that("Super-wide", { test_that("Problematic Dictionary", { testthat::skip_on_cran() - expected_outcome_message <- "The data dictionary describing 3 fields was read from REDCap in \\d+(\\.\\d+\\W|\\W)seconds\\. The http status code was 200\\." - expected_row_count <- 3L + expected_outcome_message <- "The data dictionary describing 6 fields was read from REDCap in \\d+(\\.\\d+\\W|\\W)seconds\\. The http status code was 200\\." + expected_row_count <- 6L expected_column_count <- 18L - expected_na_cells <- 40L + expected_na_cells <- 76L expect_message( regexp = expected_outcome_message, From d2955ad0a0a3f52aca184d294f534aaffd4e19b8 Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Sun, 19 Apr 2020 12:48:09 -0500 Subject: [PATCH 07/10] include @pbchase for all his advice offline & [online](https://github.com/OuhscBbmc/REDCapR/search?q=pbchase&type=Issues) --- DESCRIPTION | 3 ++- NEWS.md | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index f654dd0d..a2476a78 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -18,7 +18,8 @@ Authors@R: c(person("Will", "Beasley", role = c("aut", "cre"), email = role = "ctb"), person("Hao", "Zhu", role = "ctb", comment = c(ORCID = '0000-0002-3386-6076')), person("Felix", "Torres", - role = "ctb", email = "fetorres@ucsd.edu")) + role = "ctb", email = "fetorres@ucsd.edu"), person("Philip", "Chase", + role = "ctb", email = "pbc@ufl.edu")) URL: https://github.com/OuhscBbmc/REDCapR, http://ouhsc.edu/bbmc/, http://project-redcap.org BugReports: https://github.com/OuhscBbmc/REDCapR/issues diff --git a/NEWS.md b/NEWS.md index d9493ca2..661dc788 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,7 +4,7 @@ Upcoming Versions In the future: ... -Version 0.11 (Released ?) +Version 0.11 (Released 2020-04-20) ========================================================== ### Breaking Changes (possible, but unlikely) @@ -25,7 +25,7 @@ Version 0.11 (Released ?) ### Stability Features -* `httr::content()` (which is inside `kernel_api()`) now processes the returned value as "text/csv", by default. This should prevent strange characters from tricking the process as the internal variable `raw_text` is being formed. See the [httr::content()`](https://httr.r-lib.org/reference/content.html) documentation for a list of possible values for the `content_type` parameter. (Thanks to great debugging by @vortexing, #269) +* `httr::content()` (which is inside `kernel_api()`) now processes the returned value as "text/csv", by default. This should prevent strange characters from tricking the process as the internal variable `raw_text` is being formed. See the [httr::content()`](https://httr.r-lib.org/reference/content.html) documentation for a list of possible values for the `content_type` parameter. (Thanks to great debugging by @vortexing #269, @sybandrew #272, & @begavett, #290) * Similarly, `kernel_api()` now has an `encoding` parameter, which defaults to "UTF-8". (#270) From bae2916f4a97db74d2408c99b4dc848b09128333 Mon Sep 17 00:00:00 2001 From: Will Beasley Date: Sun, 19 Apr 2020 13:13:45 -0500 Subject: [PATCH 08/10] replace all `T` & `F` values --- inst/test-data/project-color-boxes/Readme.md | 4 +- playgrounds/HttrPlayground.R | 50 ++++++++++---------- playgrounds/MetadataPlayground.R | 26 +++++----- playgrounds/SSL3Playground.R | 8 ++-- playgrounds/Validation.R | 4 +- playgrounds/eav-playground.R | 6 +-- playgrounds/ssl_playground.R | 8 ++-- tests/testthat/test-validate.R | 2 +- 8 files changed, 54 insertions(+), 54 deletions(-) diff --git a/inst/test-data/project-color-boxes/Readme.md b/inst/test-data/project-color-boxes/Readme.md index cf252fcb..ffbcb46d 100644 --- a/inst/test-data/project-color-boxes/Readme.md +++ b/inst/test-data/project-color-boxes/Readme.md @@ -35,7 +35,7 @@ Here's some (slightly modified) code that Benjamin wrote for Issue #51: > post_result_all <- httr::POST(url=url, body=list(token=token, content='record', format='csv', rawOrLabel='label', fields='id, color')) > (csv_all <- as.character(post_result_all)) [1] "id,color___r,color___g,color___b,color___p\n\"1\",\"Red\",\"\",\"\",\"\"\n\"2\",\"\",\"\",\"Blue\",\"\"\n\"3\",\"\",\"Green\",\"Blue\",\"\"\n\"4\",\"\",\"\",\"\",\"\"\n" -> (ds_all <- read.csv(textConnection(csv_all), stringsAsFactors=F)) +> (ds_all <- read.csv(textConnection(csv_all), stringsAsFactors=FALSE)) id color___r color___g color___b color___p 1 1 Red NA 2 2 Blue NA @@ -45,7 +45,7 @@ Here's some (slightly modified) code that Benjamin wrote for Issue #51: > post_result_some <- httr::POST(url=url, body=list(token=token, content='record', format='csv', rawOrLabel='label', fields='id, color', records='2,3,4')) > (csv_some <- as.character(post_result_some)) [1] "id,color___r,color___g,color___b,color___p\n\"2\",\"\",\"\",\"Blue\",\"\"\n\"3\",\"\",\"Green\",\"Blue\",\"\"\n\"4\",\"\",\"\",\"\",\"\"\n" -> (ds_some <- read.csv(textConnection(csv_some), stringsAsFactors=F)) +> (ds_some <- read.csv(textConnection(csv_some), stringsAsFactors=FALSE)) id color___r color___g color___b color___p 1 2 NA Blue NA 2 3 NA Green Blue NA diff --git a/playgrounds/HttrPlayground.R b/playgrounds/HttrPlayground.R index 32b68119..799cb596 100644 --- a/playgrounds/HttrPlayground.R +++ b/playgrounds/HttrPlayground.R @@ -17,7 +17,7 @@ events_collapsed <- NULL config_options <- list(cainfo = system.file("cacert.pem", package="openssl")) # config_options <- RCurl::curlOptions(ssl.verifypeer = FALSE) -config_options <- httr::config(ssl_verifypeer=F) +config_options <- httr::config(ssl_verifypeer=FALSE) # config_options <- list() post_body <- list( @@ -46,14 +46,14 @@ raw_text <- httr::content(result, "text") result <- httr::POST( url = "http://httpbin.org/post", - body = "A simple text string", + body = "A simple text string", config = httr::config(ssl_verifypeer=FALSE) ) httr::content(result, "text") ds <- utils::read.csv(text=raw_text, stringsAsFactors=FALSE) #Convert the raw text to a dataset. -# +# # raw_text2 <- RCurl::postForm( # uri = redcap_uri # , token = token @@ -70,32 +70,32 @@ ds <- utils::read.csv(text=raw_text, stringsAsFactors=FALSE) #Convert the raw te # result <- redcap_read_oneshot(redcap_uri="https://bbmc.ouhsc.edu/redcap/api/", token = "9A81268476645C4E5F03428B8AC3AA7B") # dput(result$data) -dsToWrite <- structure(list(record_id = 1:5, name_first = c("Nutmeg", "Tumtum", - "Marcus", "Trudy", "John Lee"), name_last = c("Nutmouse", "Nutmouse", - "Wood", "DAG", "Walker"), address = c("14 Rose Cottage St.\nKenning UK, 323232", - "14 Rose Cottage Blvd.\nKenning UK 34243", "243 Hill St.\nGuthrie OK 73402", +dsToWrite <- structure(list(record_id = 1:5, name_first = c("Nutmeg", "Tumtum", + "Marcus", "Trudy", "John Lee"), name_last = c("Nutmouse", "Nutmouse", + "Wood", "DAG", "Walker"), address = c("14 Rose Cottage St.\nKenning UK, 323232", + "14 Rose Cottage Blvd.\nKenning UK 34243", "243 Hill St.\nGuthrie OK 73402", "342 Elm\nDuncanville TX, 75116", "Hotel Suite\nNew Orleans LA, 70115" - ), telephone = c("(432) 456-4848", "(234) 234-2343", "(433) 435-9865", - "(987) 654-3210", "(333) 333-4444"), email = c("nutty@mouse.com", + ), telephone = c("(432) 456-4848", "(234) 234-2343", "(433) 435-9865", + "(987) 654-3210", "(333) 333-4444"), email = c("nutty@mouse.com", "tummy@mouse.comm", "mw@mwood.net", "peroxide@blonde.com", "left@hippocket.com" - ), dob = c("2003-08-30", "2003-03-10", "1934-04-09", "1952-11-02", - "1955-04-15"), age = c(10L, 10L, 79L, 61L, 58L), ethnicity = c(1L, - 1L, 0L, 1L, 1L), race = c(2L, 6L, 4L, 4L, 4L), sex = c(0L, 1L, - 1L, 0L, 1L), height = c(5, 6, 180, 165, 193.04), weight = c(1L, - 1L, 80L, 54L, 104L), bmi = c(400, 277.8, 24.7, 19.8, 27.9), comments = c("Character in a book, with some guessing", - "A mouse character from a good book", "completely made up", "This record doesn't have a DAG assigned\n\nSo call up Trudy on the telephone\nSend her a letter in the mail", + ), dob = c("2003-08-30", "2003-03-10", "1934-04-09", "1952-11-02", + "1955-04-15"), age = c(10L, 10L, 79L, 61L, 58L), ethnicity = c(1L, + 1L, 0L, 1L, 1L), race = c(2L, 6L, 4L, 4L, 4L), sex = c(0L, 1L, + 1L, 0L, 1L), height = c(5, 6, 180, 165, 193.04), weight = c(1L, + 1L, 80L, 54L, 104L), bmi = c(400, 277.8, 24.7, 19.8, 27.9), comments = c("Character in a book, with some guessing", + "A mouse character from a good book", "completely made up", "This record doesn't have a DAG assigned\n\nSo call up Trudy on the telephone\nSend her a letter in the mail", "Had a hand for trouble and a eye for cash\n\nHe had a gold watch chain and a black mustache" - ), demographics_complete = c(2L, 2L, 2L, 2L, 2L)), .Names = c("record_id", - "name_first", "name_last", "address", "telephone", "email", "dob", - "age", "ethnicity", "race", "sex", "height", "weight", "bmi", - "comments", "demographics_complete"), class = "data.frame", row.names = c(NA, + ), demographics_complete = c(2L, 2L, 2L, 2L, 2L)), .Names = c("record_id", + "name_first", "name_last", "address", "telephone", "email", "dob", + "age", "ethnicity", "race", "sex", "height", "weight", "bmi", + "comments", "demographics_complete"), class = "data.frame", row.names = c(NA, -5L)) dsToWrite$age <- NULL; dsToWrite$bmi <- NULL #Drop the calculated fields # dsToWrite <- dsToWrite[1:3, ] # result <- REDCapR::redcap_write_oneshot(ds=dsToWrite, redcap_uri="https://bbmc.ouhsc.edu/redcap/api/", token = "9A81268476645C4E5F03428B8AC3AA7B") con <- base::textConnection(object='csvElements', open='w', local=TRUE) -utils::write.csv(dsToWrite, con, row.names = FALSE, na="") +utils::write.csv(dsToWrite, con, row.names = FALSE, na="") close(con) csv <- paste(csvElements, collapse="\n") @@ -111,12 +111,12 @@ post_body <- list( exportDataAccessGroups = export_data_access_groups_string, records = records_collapsed, fields = fields_collapsed, - + #These next values separate the import from the export API call data = csv, overwriteBehavior = 'overwrite', #overwriteBehavior: *normal* - blank/empty values will be ignored [default]; *overwrite* - blank/empty values are valid and will overwrite data returnContent = 'ids', - returnFormat = 'csv' + returnFormat = 'csv' ) result <- httr::POST( @@ -131,11 +131,11 @@ status_message <- result$headers$statusmessage return_content <- httr::content(result, type="text") # returnContent <- RCurl::postForm( -# uri = redcap_uri, +# uri = redcap_uri, # token = token, # content = 'record', -# format = 'csv', -# type = 'flat', +# format = 'csv', +# type = 'flat', # returnContent = "ids", # overwriteBehavior = 'overwrite', #overwriteBehavior: *normal* - blank/empty values will be ignored [default]; *overwrite* - blank/empty values are valid and will overwrite data # data = csv, diff --git a/playgrounds/MetadataPlayground.R b/playgrounds/MetadataPlayground.R index 5ab6483f..0db781ac 100644 --- a/playgrounds/MetadataPlayground.R +++ b/playgrounds/MetadataPlayground.R @@ -23,7 +23,7 @@ pattern_checkboxes <- "(?<=\\A| \\| )(?\\d{1,}), (?