From 294ad77f184c9be41d497c4e75c5765178b54363 Mon Sep 17 00:00:00 2001 From: Ezra Porter <60618324+ezraporter@users.noreply.github.com> Date: Tue, 12 Mar 2024 13:42:45 -0400 Subject: [PATCH 1/2] Add supertibble style methods --- DESCRIPTION | 4 +- NAMESPACE | 4 ++ R/REDCapTidieR-package.R | 2 + R/read_redcap.R | 15 ------- R/supertibble.R | 24 ++++++++++++ renv.lock | 22 +++++++++++ tests/testthat/_snaps/supertibble.md | 14 +++++++ tests/testthat/test-supertibble.R | 5 +++ utility/cli_message_examples.R | 5 +++ utility/cli_message_examples_reprex.md | 54 +++++++++++++------------- utility/refresh.R | 4 ++ 11 files changed, 111 insertions(+), 42 deletions(-) create mode 100644 R/supertibble.R create mode 100644 tests/testthat/_snaps/supertibble.md create mode 100644 tests/testthat/test-supertibble.R diff --git a/DESCRIPTION b/DESCRIPTION index a55b0122..3781bdb3 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -31,7 +31,9 @@ Imports: tibble, tidyr, tidyselect, - formattable + formattable, + pillar, + vctrs Suggests: covr, knitr, diff --git a/NAMESPACE b/NAMESPACE index 137cf7a0..37c2d663 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,5 +1,7 @@ # Generated by roxygen2: do not edit by hand +S3method(tbl_sum,redcap_supertbl) +S3method(vec_ptype_abbr,redcap_supertbl) export(add_skimr_metadata) export(bind_tibbles) export(extract_tibble) @@ -56,6 +58,7 @@ importFrom(formattable,percent) importFrom(lobstr,obj_size) importFrom(lubridate,is.difftime) importFrom(lubridate,is.period) +importFrom(pillar,tbl_sum) importFrom(purrr,compose) importFrom(purrr,map) importFrom(purrr,map2) @@ -114,3 +117,4 @@ importFrom(tidyselect,eval_select) importFrom(tidyselect,everything) importFrom(tidyselect,starts_with) importFrom(tidyselect,where) +importFrom(vctrs,vec_ptype_abbr) diff --git a/R/REDCapTidieR-package.R b/R/REDCapTidieR-package.R index c277dc2b..d24682de 100644 --- a/R/REDCapTidieR-package.R +++ b/R/REDCapTidieR-package.R @@ -23,6 +23,8 @@ #' @importFrom tidyr complete fill pivot_wider nest unnest unnest_wider #' @importFrom tidyselect all_of any_of ends_with eval_select everything #' starts_with where +#' @importFrom vctrs vec_ptype_abbr +#' @importFrom pillar tbl_sum "_PACKAGE" ## usethis namespace: start diff --git a/R/read_redcap.R b/R/read_redcap.R index e60b26d4..93175fbb 100644 --- a/R/read_redcap.R +++ b/R/read_redcap.R @@ -489,18 +489,3 @@ calc_metadata_stats <- function(data) { data_na_pct = percent(na_pct, digits = 2, format = "fg") ) } - -#' @title -#' Add supertbl S3 class -#' -#' @param x an object to class -#' -#' @return -#' The object with `redcaptidier_supertbl` S3 class -#' -#' @keywords internal -#' -as_supertbl <- function(x) { - class(x) <- c("redcap_supertbl", class(x)) - x -} diff --git a/R/supertibble.R b/R/supertibble.R new file mode 100644 index 00000000..073cdef2 --- /dev/null +++ b/R/supertibble.R @@ -0,0 +1,24 @@ +#' @title +#' Add supertbl S3 class +#' +#' @param x an object to class +#' +#' @return +#' The object with `redcaptidier_supertbl` S3 class +#' +#' @keywords internal +#' +as_supertbl <- function(x) { + class(x) <- c("redcap_supertbl", class(x)) + x +} + +#' @export +vec_ptype_abbr.redcap_supertbl <- function(x) { + "suprtbl" +} + +#' @export +tbl_sum.redcap_supertbl <- function(x) { + paste("A REDCapTidier Supertibble with", nrow(x), "instruments") +} diff --git a/renv.lock b/renv.lock index 19481379..6a3fccd3 100644 --- a/renv.lock +++ b/renv.lock @@ -1460,6 +1460,28 @@ ], "Hash": "fab761ee8f3554a04afef40ac53689f4" }, + "reprex": { + "Package": "reprex", + "Version": "2.1.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "callr", + "cli", + "clipr", + "fs", + "glue", + "knitr", + "lifecycle", + "rlang", + "rmarkdown", + "rstudioapi", + "utils", + "withr" + ], + "Hash": "1425f91b4d5d9a8f25352c44a3d914ed" + }, "revdepcheck": { "Package": "revdepcheck", "Version": "1.0.0.9001", diff --git a/tests/testthat/_snaps/supertibble.md b/tests/testthat/_snaps/supertibble.md new file mode 100644 index 00000000..352a9ba1 --- /dev/null +++ b/tests/testthat/_snaps/supertibble.md @@ -0,0 +1,14 @@ +# supertibble prints with style + + Code + as_supertbl(tibble(redcap_form_name = letters[1:5], redcap_data = list(NULL))) + Output + # A REDCapTidier Supertibble with 5 instruments + redcap_form_name redcap_data + + 1 a + 2 b + 3 c + 4 d + 5 e + diff --git a/tests/testthat/test-supertibble.R b/tests/testthat/test-supertibble.R new file mode 100644 index 00000000..9d23c670 --- /dev/null +++ b/tests/testthat/test-supertibble.R @@ -0,0 +1,5 @@ +test_that("supertibble prints with style", { + tibble(redcap_form_name = letters[1:5], redcap_data = list(NULL)) %>% + as_supertbl() %>% + expect_snapshot() +}) diff --git a/utility/cli_message_examples.R b/utility/cli_message_examples.R index da15ae87..2cd509e3 100644 --- a/utility/cli_message_examples.R +++ b/utility/cli_message_examples.R @@ -142,3 +142,8 @@ withr::with_tempdir({ read_redcap(redcap_uri, longitudinal_token) %>% write_redcap_xlsx(file = filepath) }) + +# Printed supertibble + +read_redcap(Sys.getenv("REDCAP_URI"), Sys.getenv("REDCAPTIDIER_CLASSIC_API")) %>% + suppressWarnings() diff --git a/utility/cli_message_examples_reprex.md b/utility/cli_message_examples_reprex.md index 32e37060..32240493 100644 --- a/utility/cli_message_examples_reprex.md +++ b/utility/cli_message_examples_reprex.md @@ -75,26 +75,9 @@ read_redcap(redcap_uri, "CC0CE44238EF65C5DA26A55DD749AF7A") # will be rejected b #> ℹ Are you sure this is the correct API token? #> ℹ API token: `CC0CE44238EF65C5DA26A55DD749AF7A` -## deleted project - -read_redcap(redcap_uri, "AC1759E5D3E10EF64350B05F5A96DB5F") -#> Error in `read_redcap()`: -#> ✖ The REDCapR export operation was not successful. -#> ! The REDCap project does not exist because it was deleted. -#> ℹ Are you sure this is the correct API token? -#> ℹ API token: `AC1759E5D3E10EF64350B05F5A96DB5F` - ## unexpected REDCapR error try_redcapr(list(success = FALSE, status_code = "", outcome_message = "This is an error message from REDCapR!")) -#> Called from: try_redcapr(list(success = FALSE, status_code = "", outcome_message = "This is an error message from REDCapR!")) -#> debug at /Users/porterej/code/cgt-dataops/REDCapTidieR/R/utils.R#676: if (inherits(calling_fn, "{")) { -#> calling_fn <- calling_fn[[2]] -#> } -#> debug at /Users/porterej/code/cgt-dataops/REDCapTidieR/R/utils.R#680: condition$parent <- catch_cnd(abort(out$outcome_message, call = calling_fn)) -#> debug at /Users/porterej/code/cgt-dataops/REDCapTidieR/R/utils.R#684: cli_abort(c(condition$message, condition$info), call = condition$call, -#> parent = condition$parent, class = condition$class, redcapr_status_code = out$status_code, -#> redcapr_outcome_message = out$outcome_message) #> Error: #> ✖ The REDCapR export operation was not successful. #> ! An unexpected error occured. @@ -129,8 +112,8 @@ read_redcap(redcap_uri, classic_token, export_survey_fields = 123) read_redcap(redcap_uri, classic_token, export_survey_fields = c(TRUE, TRUE)) #> Error in `read_redcap()`: -#> ✖ You've supplied `TRUE`, `TRUE` for `export_survey_fields` which is not -#> a valid value +#> ✖ You've supplied `TRUE` and `TRUE` for `export_survey_fields` which is +#> not a valid value #> ! Must have length 1, but has length 2 ## suppress_redcapr_messages @@ -143,8 +126,8 @@ read_redcap(redcap_uri, classic_token, suppress_redcapr_messages = 123) read_redcap(redcap_uri, classic_token, suppress_redcapr_messages = c(TRUE, TRUE)) #> Error in `read_redcap()`: -#> ✖ You've supplied `TRUE`, `TRUE` for `suppress_redcapr_messages` which -#> is not a valid value +#> ✖ You've supplied `TRUE` and `TRUE` for `suppress_redcapr_messages` +#> which is not a valid value #> ! Must have length 1, but has length 2 # data access groups @@ -231,7 +214,7 @@ missing_col_supertbl <- tibble(redcap_data = list()) %>% as_supertbl() make_labelled(missing_col_supertbl) #> Error in `make_labelled()`: -#> ✖ You've supplied `` for `supertbl` which is not a valid +#> ✖ You've supplied `` for `supertbl` which is not a valid #> value #> ! Must contain `supertbl$redcap_metadata` #> ℹ `supertbl` must be a REDCapTidieR supertibble, generated using @@ -241,7 +224,7 @@ missing_list_col_supertbl <- tibble(redcap_data = list(), redcap_metadata = 123) as_supertbl() make_labelled(missing_list_col_supertbl) #> Error in `make_labelled()`: -#> ✖ You've supplied `` for `supertbl` which is not a valid +#> ✖ You've supplied `` for `supertbl` which is not a valid #> value #> ! `supertbl$redcap_metadata` must be of type 'list' #> ℹ `supertbl` must be a REDCapTidieR supertibble, generated using @@ -272,7 +255,7 @@ withr::with_tempdir({ }) #> Error: #> ✖ File -#> ''/private/var/folders/qc/mmjjyjq50530z9r_7mfqcqfhxkkk67/T/RtmphYCCdg/file99c3302ff1f7/temp.csv'' +#> ''/private/var/folders/9c/k1m0bzys7gb1v32g86hfn5sn5k86h1/T/RtmpHQI8WI/file135a1176243e2/temp.csv'' #> already exists. #> ℹ Overwriting files is disabled by default. Set `overwrite = TRUE` to overwrite #> existing file. @@ -313,8 +296,27 @@ withr::with_tempdir({ write_redcap_xlsx(file = filepath) }) #> Warning in write_redcap_xlsx(., file = filepath): ! No extension provided for `file`: -#> '/private/var/folders/qc/mmjjyjq50530z9r_7mfqcqfhxkkk67/T/RtmphYCCdg/file99c33e79f54b/temp' +#> '/private/var/folders/9c/k1m0bzys7gb1v32g86hfn5sn5k86h1/T/RtmpHQI8WI/file135a1324144c6/temp' #> ℹ The extension '.xlsx' will be appended to the file name. + +# Printed supertibble + +read_redcap(Sys.getenv("REDCAP_URI"), Sys.getenv("REDCAPTIDIER_CLASSIC_API")) %>% + suppressWarnings() +#> # A REDCapTidier Supertibble with 9 instruments +#> redcap_form_name redcap_form_label redcap_data redcap_metadata structure +#> +#> 1 nonrepeated Nonrepeated nonrepea… +#> 2 nonrepeated2 Nonrepeated2 nonrepea… +#> 3 repeated Repeated repeating +#> 4 data_field_types Data Field Types nonrepea… +#> 5 text_input_validation… Text Input Valid… nonrepea… +#> 6 api_no_access API No Access nonrepea… +#> 7 api_no_access_2 API No Access 2 nonrepea… +#> 8 survey Survey nonrepea… +#> 9 repeat_survey Repeat Survey repeating +#> # ℹ 4 more variables: data_rows , data_cols , data_size , +#> # data_na_pct ``` -Created on 2023-06-01 with [reprex v2.0.2](https://reprex.tidyverse.org) +Created on 2024-03-12 with [reprex v2.1.0](https://reprex.tidyverse.org) diff --git a/utility/refresh.R b/utility/refresh.R index 06362da1..ca39131c 100644 --- a/utility/refresh.R +++ b/utility/refresh.R @@ -50,6 +50,10 @@ test_results_checked <- devtools::test() # Test Sample REDCap Databases - This takes a while source("utility/test_creds.R") +# Generate cli examples +reprex::reprex(input="utility/cli_message_examples.R", html_preview = FALSE) +unlink("utility/cli_message_examples_reprex.R") + # devtools::check(force_suggests = FALSE) devtools::check(cran=TRUE) # check as CRAN From 7387ad50802ada59ceebab25597012c684b52612 Mon Sep 17 00:00:00 2001 From: Ezra Porter <60618324+ezraporter@users.noreply.github.com> Date: Tue, 12 Mar 2024 15:29:24 -0400 Subject: [PATCH 2/2] fix CI --- DESCRIPTION | 2 +- R/clean_redcap_long.R | 2 +- R/supertibble.R | 6 +- man/REDCapTidieR-package.Rd | 2 +- man/as_supertbl.Rd | 2 +- man/tbl_sum.redcap_supertbl.Rd | 21 ++++ man/vec_ptype_abbr.redcap_supertbl.Rd | 25 +++++ pkgdown/_pkgdown.yml | 4 + renv.lock | 9 +- renv/activate.R | 39 ++++++-- tests/testthat/_snaps/supertibble.md | 4 +- tests/testthat/_snaps/write.md | 134 +++++++++++++------------- 12 files changed, 159 insertions(+), 91 deletions(-) create mode 100644 man/tbl_sum.redcap_supertbl.Rd create mode 100644 man/vec_ptype_abbr.redcap_supertbl.Rd diff --git a/DESCRIPTION b/DESCRIPTION index 3781bdb3..c637efa4 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -51,5 +51,5 @@ Config/testthat/edition: 3 Encoding: UTF-8 Language: en-US LazyData: true -RoxygenNote: 7.2.3 +RoxygenNote: 7.3.1 Roxygen: list(markdown = TRUE) diff --git a/R/clean_redcap_long.R b/R/clean_redcap_long.R index 56402796..a65fded6 100644 --- a/R/clean_redcap_long.R +++ b/R/clean_redcap_long.R @@ -85,7 +85,7 @@ clean_redcap_long <- function(db_data_long, # Retrieve mixed structure fields and forms in reference df mixed_structure_ref <- get_mixed_structure_fields(db_data_long) %>% filter(.data$rep_and_nonrep & !str_ends(.data$field_name, "_form_complete")) %>% - left_join(db_metadata_long %>% select(.data$field_name, .data$form_name), + left_join(db_metadata_long %>% select("field_name", "form_name"), by = "field_name" ) diff --git a/R/supertibble.R b/R/supertibble.R index 073cdef2..f849f53b 100644 --- a/R/supertibble.R +++ b/R/supertibble.R @@ -13,12 +13,14 @@ as_supertbl <- function(x) { x } +#' @inherit vctrs::vec_ptype_abbr params return title description #' @export -vec_ptype_abbr.redcap_supertbl <- function(x) { +vec_ptype_abbr.redcap_supertbl <- function(x, ..., prefix_named, suffix_shape) { "suprtbl" } +#' @inherit pillar::tbl_sum params return title description #' @export tbl_sum.redcap_supertbl <- function(x) { - paste("A REDCapTidier Supertibble with", nrow(x), "instruments") + paste("A REDCapTidieR Supertibble with", nrow(x), "instruments") } diff --git a/man/REDCapTidieR-package.Rd b/man/REDCapTidieR-package.Rd index f4c8120e..4e55422f 100644 --- a/man/REDCapTidieR-package.Rd +++ b/man/REDCapTidieR-package.Rd @@ -2,8 +2,8 @@ % Please edit documentation in R/REDCapTidieR-package.R \docType{package} \name{REDCapTidieR-package} +\alias{REDCapTidieR} \alias{REDCapTidieR-package} -\alias{_PACKAGE} \title{REDCapTidieR: Extract 'REDCap' Databases into Tidy 'Tibble's} \description{ \if{html}{\figure{logo.png}{options: style='float: right' alt='logo' width='120'}} diff --git a/man/as_supertbl.Rd b/man/as_supertbl.Rd index bd317197..de84b85d 100644 --- a/man/as_supertbl.Rd +++ b/man/as_supertbl.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/read_redcap.R +% Please edit documentation in R/supertibble.R \name{as_supertbl} \alias{as_supertbl} \title{Add supertbl S3 class} diff --git a/man/tbl_sum.redcap_supertbl.Rd b/man/tbl_sum.redcap_supertbl.Rd new file mode 100644 index 00000000..b56ba302 --- /dev/null +++ b/man/tbl_sum.redcap_supertbl.Rd @@ -0,0 +1,21 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/supertibble.R +\name{tbl_sum.redcap_supertbl} +\alias{tbl_sum.redcap_supertbl} +\title{Provide a succinct summary of an object} +\usage{ +\method{tbl_sum}{redcap_supertbl}(x) +} +\arguments{ +\item{x}{Object to summarise.} +} +\value{ +A named character vector, describing the dimensions in the first element +and the data source in the name of the first element. +} +\description{ +\code{tbl_sum()} gives a brief textual description of a table-like object, +which should include the dimensions and the data source in the first element, +and additional information in the other elements (such as grouping for \pkg{dplyr}). +The default implementation forwards to \code{\link[pillar:obj_sum]{obj_sum()}}. +} diff --git a/man/vec_ptype_abbr.redcap_supertbl.Rd b/man/vec_ptype_abbr.redcap_supertbl.Rd new file mode 100644 index 00000000..f0c7833e --- /dev/null +++ b/man/vec_ptype_abbr.redcap_supertbl.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/supertibble.R +\name{vec_ptype_abbr.redcap_supertbl} +\alias{vec_ptype_abbr.redcap_supertbl} +\title{Vector type as a string} +\usage{ +\method{vec_ptype_abbr}{redcap_supertbl}(x, ..., prefix_named, suffix_shape) +} +\arguments{ +\item{x}{A vector.} + +\item{...}{These dots are for future extensions and must be empty.} + +\item{prefix_named}{If \code{TRUE}, add a prefix for named vectors.} + +\item{suffix_shape}{If \code{TRUE} (the default), append the shape of +the vector.} +} +\value{ +A string. +} +\description{ +\code{vec_ptype_full()} displays the full type of the vector. \code{vec_ptype_abbr()} +provides an abbreviated summary suitable for use in a column heading. +} diff --git a/pkgdown/_pkgdown.yml b/pkgdown/_pkgdown.yml index dbed8408..7801c4fe 100644 --- a/pkgdown/_pkgdown.yml +++ b/pkgdown/_pkgdown.yml @@ -67,3 +67,7 @@ reference: - title: "Data" contents: - superheroes_supertbl +- title: "S3 methods" + contents: + - tbl_sum.redcap_supertbl + - vec_ptype_abbr.redcap_supertbl diff --git a/renv.lock b/renv.lock index 6a3fccd3..5b0207ee 100644 --- a/renv.lock +++ b/renv.lock @@ -1436,13 +1436,8 @@ }, "renv": { "Package": "renv", - "Version": "1.0.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "utils" - ], - "Hash": "41b847654f567341725473431dd0d5ab" + "Version": "1.0.5", + "Source": "Repository" }, "repr": { "Package": "repr", diff --git a/renv/activate.R b/renv/activate.R index cb5401f9..9b2e7f18 100644 --- a/renv/activate.R +++ b/renv/activate.R @@ -2,7 +2,7 @@ local({ # the requested version of renv - version <- "1.0.3" + version <- "1.0.5" attr(version, "sha") <- NULL # the project directory @@ -31,6 +31,14 @@ local({ if (!is.null(override)) return(override) + # if we're being run in a context where R_LIBS is already set, + # don't load -- presumably we're being run as a sub-process and + # the parent process has already set up library paths for us + rcmd <- Sys.getenv("R_CMD", unset = NA) + rlibs <- Sys.getenv("R_LIBS", unset = NA) + if (!is.na(rlibs) && !is.na(rcmd)) + return(FALSE) + # next, check environment variables # TODO: prefer using the configuration one in the future envvars <- c( @@ -50,9 +58,22 @@ local({ }) - if (!enabled) + # bail if we're not enabled + if (!enabled) { + + # if we're not enabled, we might still need to manually load + # the user profile here + profile <- Sys.getenv("R_PROFILE_USER", unset = "~/.Rprofile") + if (file.exists(profile)) { + cfg <- Sys.getenv("RENV_CONFIG_USER_PROFILE", unset = "TRUE") + if (tolower(cfg) %in% c("true", "t", "1")) + sys.source(profile, envir = globalenv()) + } + return(FALSE) + } + # avoid recursion if (identical(getOption("renv.autoloader.running"), TRUE)) { warning("ignoring recursive attempt to run renv autoloader") @@ -1041,7 +1062,7 @@ local({ # if jsonlite is loaded, use that instead if ("jsonlite" %in% loadedNamespaces()) { - json <- catch(renv_json_read_jsonlite(file, text)) + json <- tryCatch(renv_json_read_jsonlite(file, text), error = identity) if (!inherits(json, "error")) return(json) @@ -1050,7 +1071,7 @@ local({ } # otherwise, fall back to the default JSON reader - json <- catch(renv_json_read_default(file, text)) + json <- tryCatch(renv_json_read_default(file, text), error = identity) if (!inherits(json, "error")) return(json) @@ -1063,14 +1084,14 @@ local({ } renv_json_read_jsonlite <- function(file = NULL, text = NULL) { - text <- paste(text %||% read(file), collapse = "\n") + text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") jsonlite::fromJSON(txt = text, simplifyVector = FALSE) } renv_json_read_default <- function(file = NULL, text = NULL) { # find strings in the JSON - text <- paste(text %||% read(file), collapse = "\n") + text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") pattern <- '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' locs <- gregexpr(pattern, text, perl = TRUE)[[1]] @@ -1118,14 +1139,14 @@ local({ map <- as.list(map) # remap strings in object - remapped <- renv_json_remap(json, map) + remapped <- renv_json_read_remap(json, map) # evaluate eval(remapped, envir = baseenv()) } - renv_json_remap <- function(json, map) { + renv_json_read_remap <- function(json, map) { # fix names if (!is.null(names(json))) { @@ -1152,7 +1173,7 @@ local({ # recurse if (is.recursive(json)) { for (i in seq_along(json)) { - json[i] <- list(renv_json_remap(json[[i]], map)) + json[i] <- list(renv_json_read_remap(json[[i]], map)) } } diff --git a/tests/testthat/_snaps/supertibble.md b/tests/testthat/_snaps/supertibble.md index 352a9ba1..1aaa5694 100644 --- a/tests/testthat/_snaps/supertibble.md +++ b/tests/testthat/_snaps/supertibble.md @@ -1,9 +1,9 @@ # supertibble prints with style Code - as_supertbl(tibble(redcap_form_name = letters[1:5], redcap_data = list(NULL))) + . Output - # A REDCapTidier Supertibble with 5 instruments + # A REDCapTidieR Supertibble with 5 instruments redcap_form_name redcap_data 1 a diff --git a/tests/testthat/_snaps/write.md b/tests/testthat/_snaps/write.md index e9620fae..7c011037 100644 --- a/tests/testthat/_snaps/write.md +++ b/tests/testthat/_snaps/write.md @@ -115,12 +115,12 @@ 4 Unchecked Checked 5 Unchecked Unchecked 6 Unchecked Unchecked - NA NA NA NA - 2 checkbox_multiple_2___4eeee5 yesno NA signature - 3 Unchecked yes FALSE signature_2022-08-02_1114.png - 4 Unchecked NA - 5 Unchecked NA - 6 Unchecked NA + NA NA NA NA + 2 checkbox_multiple_2___4eeee5 yesno truefalse signature + 3 Unchecked yes FALSE signature_2022-08-02_1114.png + 4 Unchecked + 5 Unchecked + 6 Unchecked NA NA 2 fileupload slider 3 gas_receipt_20220729.jpeg 73 @@ -1246,73 +1246,73 @@ 67 68 Histogram Is the Categorical Value Ordered? Count of Unique Values - 2 numeric.hist NA factor.n_unique - 3 NA - 4 NA - 5 NA - 6 ▇▁▁▁▇ NA - 7 ▇▁▁▁▇ NA - 8 NA - 9 NA - 10 NA - 11 NA - 12 ▁▁▇▁▁ NA + 2 numeric.hist factor.ordered factor.n_unique + 3 + 4 + 5 + 6 ▇▁▁▁▇ + 7 ▇▁▁▁▇ + 8 + 9 + 10 + 11 + 12 ▁▁▇▁▁ 13 FALSE 2 14 FALSE 2 15 FALSE 0 - 16 NA - 17 NA - 18 NA - 19 NA - 20 NA - 21 NA - 22 NA - 23 NA - 24 NA - 25 NA - 26 NA - 27 NA - 28 NA - 29 NA - 30 NA - 31 NA - 32 NA - 33 NA - 34 NA - 35 NA - 36 NA - 37 ▁▁▇▁▁ NA + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 ▁▁▇▁▁ 38 FALSE 0 - 39 NA - 40 NA - 41 NA - 42 NA - 43 NA - 44 NA - 45 NA - 46 NA - 47 NA - 48 NA - 49 NA - 50 NA - 51 NA - 52 NA - 53 NA - 54 NA - 55 NA - 56 NA - 57 NA - 58 NA - 59 NA + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 60 FALSE 2 - 61 NA - 62 NA - 63 NA - 64 NA + 61 + 62 + 63 + 64 65 FALSE 2 - 66 NA - 67 NA - 68 NA + 66 + 67 + 68 Most Frequent Values Proportion of TRUE Values Count of Logical Values 2 factor.top_counts logical.mean logical.count 3