diff --git a/CITATION.cff b/CITATION.cff index 9c27438d..ce8248de 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -8,7 +8,7 @@ message: 'To cite package "FreesearchR" in publications use:' type: software license: AGPL-3.0-or-later title: 'FreesearchR: Easy data analysis for clinicians' -version: 26.2.2 +version: 26.1.1 doi: 10.5281/zenodo.14527429 identifiers: - type: url @@ -474,7 +474,7 @@ references: authors: - family-names: Lüdecke given-names: Daniel - email: officialeasystats@gmail.com + email: d.luedecke@uke.de orcid: https://orcid.org/0000-0002-8895-3206 - family-names: Makowski given-names: Dominique @@ -813,9 +813,6 @@ references: given-names: Barret email: barret@posit.co orcid: https://orcid.org/0000-0001-9986-114X - - family-names: Haughton - given-names: Shannon - email: shannon.l.haughton@gsk.com - family-names: Hughes given-names: Ellis email: ellis.h.hughes@gsk.com @@ -824,9 +821,6 @@ references: given-names: Alexandra email: alexandralauer1@gmail.com orcid: https://orcid.org/0000-0002-4191-6301 - - family-names: François - given-names: Romain - email: romain@tada.science - family-names: Seo given-names: JooYoung email: jseo1005@illinois.edu @@ -927,7 +921,7 @@ references: authors: - family-names: Damsbo given-names: Andreas Gammelgaard - email: andreas@gdamsbo.dk + email: agdamsbo@clin.au.dk orcid: https://orcid.org/0000-0002-7559-1154 - family-names: Egeler given-names: Paul @@ -1107,14 +1101,11 @@ references: email: asrini@pm.me - family-names: Gorecki given-names: Jan - email: j.gorecki@wit.edu.pl - family-names: Chirico given-names: Michael - email: michaelchirico4@gmail.com orcid: https://orcid.org/0000-0003-0787-087X - family-names: Hocking given-names: Toby - email: toby.hocking@r-project.org orcid: https://orcid.org/0000-0002-3146-0865 - family-names: Schwendinger given-names: Benjamin diff --git a/DESCRIPTION b/DESCRIPTION index 765ddf30..f3e54266 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: FreesearchR Title: Easy data analysis for clinicians -Version: 26.2.2 +Version: 26.1.2 Authors@R: c( person("Andreas Gammelgaard", "Damsbo",email="agdamsbo@clin.au.dk", role = c("aut", "cre"), comment = c(ORCID = "0000-0002-7559-1154")), diff --git a/NEWS.md b/NEWS.md index 7dc9856c..9a72d38c 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,22 +1,3 @@ -# FreesearchR 26.2.2 - -*FIX* Minor addition to the previous update with correct activation of the missingness evaluation button. - -*FIX* Correct table headers for evaluating missings across groups. - -# FreesearchR 26.2.1 - -This update is mainly focused on polishing, fixes and small additions to make the app more intuitive. - -*NEW* Link on landing page to quickly go to data loading. - -*NEW* Allow custom data set limit loading large data files, while tightening default limits. This secures the server, but also allows for unlimited use when run locally or from a custom server in a future implementation. The groundwork is place now. - -*NEW* Hidden options and info alert when trying to analyse missing in complete dataset. The sub panel may be hidden in future iterations for this case. - -Updated dependencies. Updated to latest R for building and testing. Using the new Air package for code formatting. - - # FreesearchR 26.1.2 Rebuild 26.1.1 diff --git a/R/app_version.R b/R/app_version.R index 2e388696..8678a538 100644 --- a/R/app_version.R +++ b/R/app_version.R @@ -1 +1 @@ -app_version <- function()'26.2.2' +app_version <- function()'26.1.2' diff --git a/R/helpers.R b/R/helpers.R index 04fd8346..635f6799 100644 --- a/R/helpers.R +++ b/R/helpers.R @@ -50,7 +50,7 @@ write_quarto <- function(data, ...) { ) } -write_rmd <- function(data, ..., params.args = NULL) { +write_rmd <- function(data, ..., params.args=NULL) { # Exports data to temporary location # # I assume this is more secure than putting it in the www folder and deleting @@ -65,10 +65,7 @@ write_rmd <- function(data, ..., params.args = NULL) { ## Ref: https://github.com/quarto-dev/quarto-cli/discussions/4041 ## Outputs to the same as the .qmd file rmarkdown::render( - params = modifyList( - list(data.file = "web_data.rds", version = app_version()), - params.args - ), + params = modifyList(list(data.file = "web_data.rds",version=app_version()),params.args), # execute_params = list(data.file = temp), ... ) @@ -136,7 +133,12 @@ argsstring2list <- function(string) { factorize <- function(data, vars) { if (!is.null(vars)) { data |> - dplyr::mutate(dplyr::across(dplyr::all_of(vars), REDCapCAST::as_factor)) + dplyr::mutate( + dplyr::across( + dplyr::all_of(vars), + REDCapCAST::as_factor + ) + ) } else { data } @@ -169,30 +171,32 @@ dummy_Imports <- function() { #' @returns data #' @export #' -file_export <- function(data, - output.format = c("df", "teal", "list"), - filename, - ...) { +file_export <- function(data, output.format = c("df", "teal", "list"), filename, ...) { output.format <- match.arg(output.format) filename <- gsub("-", "_", filename) if (output.format == "teal") { - out <- within(teal_data(), { - assign( - name, - value |> + out <- within( + teal_data(), + { + assign(name, value |> dplyr::bind_cols(.name_repair = "unique_quiet") |> - default_parsing() - ) - }, value = data, name = filename) + default_parsing()) + }, + value = data, + name = filename + ) datanames(out) <- filename } else if (output.format == "df") { out <- data |> default_parsing() } else if (output.format == "list") { - out <- list(data = data, name = filename) + out <- list( + data = data, + name = filename + ) out <- c(out, ...) } @@ -227,8 +231,7 @@ default_parsing <- function(data) { remove_nested_list() |> REDCapCAST::parse_data() |> REDCapCAST::as_factor() |> - REDCapCAST::numchar2fct(numeric.threshold = 8, - character.throshold = 10) |> + REDCapCAST::numchar2fct(numeric.threshold = 8, character.throshold = 10) |> REDCapCAST::as_logical() |> REDCapCAST::fct_drop() @@ -292,11 +295,9 @@ remove_empty_attr <- function(data) { #' @examples #' data.frame(a = 1:10, b = NA, c = c(2, NA)) |> remove_empty_cols(cutoff = .5) remove_empty_cols <- function(data, cutoff = .7) { - filter <- apply(X = data, - MARGIN = 2, - FUN = \(.x) { - sum(as.numeric(!is.na(.x))) / length(.x) - }) >= cutoff + filter <- apply(X = data, MARGIN = 2, FUN = \(.x){ + sum(as.numeric(!is.na(.x))) / length(.x) + }) >= cutoff data[filter] } @@ -356,25 +357,14 @@ missing_fraction <- function(data) { #' sample(c(1:8, NA), 20, TRUE) #' ) |> data_description() data_description <- function(data, data_text = "Data") { - data <- if (shiny::is.reactive(data)) - data() - else - data + data <- if (shiny::is.reactive(data)) data() else data n <- nrow(data) n_var <- ncol(data) n_complete <- sum(complete.cases(data)) p_complete <- signif(100 * n_complete / n, 3) - if (is.null(data)) { - i18n$t("No data present.") - } else { - glue::glue( - i18n$t( - "{data_text} has {n} observations and {n_var} variables, with {n_complete} ({p_complete} %) complete cases." - ) - ) - } + glue::glue(i18n$t("{data_text} has {n} observations and {n_var} variables, with {n_complete} ({p_complete} %) complete cases.")) # sprintf( # "%s has %s observations and %s variables, with %s (%s%%) complete cases.", # data_text, @@ -483,8 +473,7 @@ if_not_missing <- function(data, default = NULL) { #' ) |> merge_expression() merge_expression <- function(data) { Reduce( - f = function(x, y) - rlang::expr(!!x %>% !!y), + f = function(x, y) rlang::expr(!!x %>% !!y), x = data ) } @@ -508,8 +497,7 @@ merge_expression <- function(data) { pipe_string <- function(data, collapse = "|>\n") { if (is.list(data)) { Reduce( - f = function(x, y) - glue::glue("{x}{collapse}{y}"), + f = function(x, y) glue::glue("{x}{collapse}{y}"), x = data ) } else { @@ -533,15 +521,10 @@ pipe_string <- function(data, collapse = "|>\n") { #' merge_expression() |> #' expression_string() expression_string <- function(data, assign.str = "") { - exp.str <- if (is.call(data)) - deparse(data) - else - data + exp.str <- if (is.call(data)) deparse(data) else data - out <- paste0(assign.str, gsub("%>%", "|>\n", paste(gsub( - '"', "'", paste(exp.str, collapse = "") - ), collapse = ""))) - out <- collapse_spaces(out, preserve_newlines = FALSE) + out <- paste0(assign.str, gsub("%>%", "|>\n", paste(gsub('"', "'", paste(exp.str, collapse = "")), collapse = ""))) + out <- collapse_spaces(out,preserve_newlines = FALSE) gsub("`", "", out) } @@ -645,16 +628,10 @@ remove_nested_list <- function(data) { #' rlang::expr(FreesearchR::set_column_label(label = !!ls3)) |> expression_string() set_column_label <- function(data, label, overwrite = TRUE) { purrr::imap(data, function(.data, .name) { - ls <- if (is.list(label)) - unlist(label) - else - label + ls <- if (is.list(label)) unlist(label) else label ls[ls == ""] <- NA if (.name %in% names(ls)) { - out <- REDCapCAST::set_attr(.data, - unname(ls[.name]), - attr = "label", - overwrite = overwrite) + out <- REDCapCAST::set_attr(.data, unname(ls[.name]), attr = "label", overwrite = overwrite) remove_empty_attr(out) } else { .data @@ -705,8 +682,11 @@ append_column <- function(data, column, name, index = "right") { } new_df <- setNames(data.frame(column), name) - list(data[seq_len(index - 1)], new_df, if (!index > ncol(data)) - data[index:ncol(data)]) |> + list( + data[seq_len(index - 1)], + new_df, + if (!index > ncol(data)) data[index:ncol(data)] + ) |> dplyr::bind_cols() } @@ -731,7 +711,7 @@ is_identical_to_previous <- function(data, no.name = TRUE) { lagged <- c(FALSE, data[seq_len(length(data) - 1)]) } - vapply(seq_len(length(data)), \(.x) { + vapply(seq_len(length(data)), \(.x){ if (isTRUE(no.name)) { identical(unname(lagged[.x]), unname(data[.x])) } else { @@ -750,11 +730,8 @@ is_identical_to_previous <- function(data, no.name = TRUE) { #' #' @examples #' c("foo bar", "fooBar21", "!!Foo'B'a-r", "foo_bar", "F OO bar") |> simple_snake() -simple_snake <- function(data) { - gsub("[\\s+]", - "_", - gsub("[^\\w\\s:-]", "", tolower(data), perl = TRUE), - perl = TRUE) +simple_snake <- function(data){ + gsub("[\\s+]","_",gsub("[^\\w\\s:-]", "", tolower(data), perl=TRUE), perl=TRUE) } #' Data type assessment. @@ -791,8 +768,7 @@ data_type <- function(data) { out <- "empty" } else if (l_unique < 2) { out <- "monotone" - } else if (any(c("factor", "logical") %in% cl_d) | - l_unique == 2) { + } else if (any(c("factor", "logical") %in% cl_d) | l_unique == 2) { if (identical("logical", cl_d) | l_unique == 2) { out <- "dichotomous" } else { @@ -828,17 +804,13 @@ data_type <- function(data) { #' data_types() data_types <- function() { list( - "empty" = list(descr = "Variable of all NAs", classes = "Any class"), - "monotone" = list(descr = "Variable with only one unique value", classes = - "Any class"), - "dichotomous" = list(descr = "Variable with only two unique values", classes = - "Any class"), - "categorical" = list(descr = "Factor variable", classes = "factor (ordered or unordered)"), - "text" = list(descr = "Character variable", classes = "character"), - "datetime" = list(descr = "Variable of time, date or datetime values", classes = - "hms, Date, POSIXct and POSIXt"), - "continuous" = list(descr = "Numeric variable", classes = "numeric, integer or double"), - "unknown" = list(descr = "Anything not falling within the previous", classes = - "Any other class") + "empty" = list(descr="Variable of all NAs",classes="Any class"), + "monotone" = list(descr="Variable with only one unique value",classes="Any class"), + "dichotomous" = list(descr="Variable with only two unique values",classes="Any class"), + "categorical"= list(descr="Factor variable",classes="factor (ordered or unordered)"), + "text"= list(descr="Character variable",classes="character"), + "datetime"= list(descr="Variable of time, date or datetime values",classes="hms, Date, POSIXct and POSIXt"), + "continuous"= list(descr="Numeric variable",classes="numeric, integer or double"), + "unknown"= list(descr="Anything not falling within the previous",classes="Any other class") ) } diff --git a/R/hosted_version.R b/R/hosted_version.R index ac3e35b9..caadd172 100644 --- a/R/hosted_version.R +++ b/R/hosted_version.R @@ -1 +1 @@ -hosted_version <- function()'v26.2.2-260223' +hosted_version <- function()'v26.1.2-260112' diff --git a/R/import-file-ext.R b/R/import-file-ext.R index 745bbc0f..f9b0c9d3 100644 --- a/R/import-file-ext.R +++ b/R/import-file-ext.R @@ -14,18 +14,8 @@ import_file_ui <- function(id, title = "", preview_data = TRUE, - file_extensions = c(".csv", - ".txt", - ".xls", - ".xlsx", - ".rds", - ".fst", - ".sas7bdat", - ".sav"), - layout_params = c("dropdown", "inline"), - limit_default = 10000, - limit_upper = 10000, - limit_lower = 0) { + file_extensions = c(".csv", ".txt", ".xls", ".xlsx", ".rds", ".fst", ".sas7bdat", ".sav"), + layout_params = c("dropdown", "inline")) { ns <- shiny::NS(id) if (!is.null(layout_params)) { @@ -33,7 +23,10 @@ import_file_ui <- function(id, } if (isTRUE(title)) { - title <- shiny::tags$h4("Import a file", class = "datamods-title") + title <- shiny::tags$h4( + "Import a file", + class = "datamods-title" + ) } @@ -58,26 +51,7 @@ import_file_ui <- function(id, size = "sm", width = "100%" ), - shiny::helpText( - phosphoricons::ph("info"), - i18n$t("if several use a comma (',') to separate them") - ) - ), - shiny::tagAppendChild( - shinyWidgets::numericInputIcon( - inputId = ns("size_limit"), - label = i18n$t("Maximum number of observations:"), - value = limit_default, - min = limit_lower, - max = limit_upper, - icon = list("n ="), - size = "sm", - width = "100%" - ), - shiny::helpText( - phosphoricons::ph("info"), - i18n$t("setting to 0 includes all") - ) + shiny::helpText(phosphoricons::ph("info"), i18n$t("if several use a comma (',') to separate them")) ) ), shiny::column( @@ -93,7 +67,10 @@ import_file_ui <- function(id, selectInputIcon( inputId = ns("encoding"), label = i18n$t("Encoding:"), - choices = c("UTF-8" = "UTF-8", "Latin1" = "latin1"), + choices = c( + "UTF-8" = "UTF-8", + "Latin1" = "latin1" + ), icon = phosphoricons::ph("text-aa"), size = "sm", width = "100%" @@ -147,8 +124,7 @@ import_file_ui <- function(id, datamods:::html_dependency_datamods(), title, file_ui, - if (identical(layout_params, "inline")) - params_ui, + if (identical(layout_params, "inline")) params_ui, shiny::tags$div( class = "hidden", id = ns("sheet-container"), @@ -168,8 +144,7 @@ import_file_ui <- function(id, shiny::tags$b(i18n$t("No file selected.")), # shiny::textOutput(ns("trans_format_text")), # This is the easiest solution, though not gramatically perfect - i18n$t("You can choose between these file types:"), - paste(file_extensions, collapse = ", "), + i18n$t("You can choose between these file types:"), paste(file_extensions, collapse = ", "), # sprintf("You can import %s files", paste(file_extensions, collapse = ", ")), dismissible = TRUE ) @@ -202,7 +177,8 @@ import_file_server <- function(id, show_data_in = c("popup", "modal"), trigger_return = c("button", "change"), return_class = c("data.frame", "data.table", "tbl_df", "raw"), - reset = reactive(NULL)) { + reset = reactive(NULL), + limit=100000) { read_fns <- list( ods = "import_ods", dta = "import_dta", @@ -220,12 +196,7 @@ import_file_server <- function(id, module <- function(input, output, session) { ns <- session$ns imported_rv <- shiny::reactiveValues(data = NULL, name = NULL) - temporary_rv <- shiny::reactiveValues( - data = NULL, - name = NULL, - status = NULL, - sheets = 1 - ) + temporary_rv <- shiny::reactiveValues(data = NULL, name = NULL, status = NULL, sheets = 1) shiny::observeEvent(reset(), { temporary_rv$data <- NULL @@ -274,12 +245,10 @@ import_file_server <- function(id, input$skip_rows, input$dec, input$encoding, - input$na_label, - input$size_limit + input$na_label ), { req(input$file) - req(input$size_limit) if (!all(input$sheet %in% temporary_rv$sheets)) { sheets <- 1 @@ -321,17 +290,16 @@ import_file_server <- function(id, datamods:::insert_alert( selector = ns("import"), status = "success", - make_success_alert( - data = imported, + datamods:::make_success_alert( + imported, trigger_return = trigger_return, btn_show_data = btn_show_data, - extra = if (isTRUE(input$preview_data)) - i18n$t("First five rows are shown below:") + extra = if (isTRUE(input$preview_data)) i18n$t("First five rows are shown below:") ) ) ## As a protective measure, the dataset size is capped at cell limit - imported <- limit_data_size(imported, limit = input$size_limit) + imported <- limit_data_size(imported,limit = limit) temporary_rv$status <- "success" temporary_rv$data <- imported @@ -343,35 +311,34 @@ import_file_server <- function(id, ) observeEvent(input$see_data, { - tryCatch({ - datamods:::show_data( - default_parsing(temporary_rv$data), - title = i18n$t("Imported data"), - type = show_data_in - ) - }, # warning = function(warn) { - # showNotification(warn, type = "warning") - # }, - error = function(err) { - showNotification(err, type = "err") - }) + tryCatch( + { + datamods:::show_data(default_parsing(temporary_rv$data), title = i18n$t("Imported data"), type = show_data_in) + }, + # warning = function(warn) { + # showNotification(warn, type = "warning") + # }, + error = function(err) { + showNotification(err, type = "err") + } + ) }) output$table <- toastui::renderDatagrid2({ req(temporary_rv$data) - tryCatch({ - toastui::datagrid( - data = setNames( - head(temporary_rv$data, 5), - make.names(names(temporary_rv$data), unique = TRUE) - ), - theme = "striped", - colwidths = "guess", - minBodyHeight = 250 - ) - }, error = function(err) { - showNotification(err, type = "err") - }) + tryCatch( + { + toastui::datagrid( + data = setNames(head(temporary_rv$data, 5), make.names(names(temporary_rv$data), unique = TRUE)), + theme = "striped", + colwidths = "guess", + minBodyHeight = 250 + ) + }, + error = function(err) { + showNotification(err, type = "err") + } + ) }) observeEvent(input$confirm, { @@ -397,7 +364,10 @@ import_file_server <- function(id, } } - moduleServer(id = id, module = module) + moduleServer( + id = id, + module = module + ) } # utils ------------------------------------------------------------------- @@ -456,37 +426,39 @@ import_delim <- function(file, skip, encoding, na.strings) { #' @export #' import_xls <- function(file, sheet, skip, na.strings) { - tryCatch({ - ## If sheet is null, this allows purrr::map to run - if (is.null(sheet)) - sheet <- 1 + tryCatch( + { + ## If sheet is null, this allows purrr::map to run + if (is.null(sheet)) sheet <- 1 - sheet |> - purrr::map(\(.x) { - readxl::read_excel( - path = file, - sheet = .x, - na = na.strings, - skip = skip, - .name_repair = "unique_quiet", - trim_ws = TRUE - ) + sheet |> + purrr::map(\(.x){ + readxl::read_excel( + path = file, + sheet = .x, + na = na.strings, + skip = skip, + .name_repair = "unique_quiet", + trim_ws = TRUE + ) - # openxlsx2::read_xlsx( - # file = file, - # sheet = .x, - # skip_empty_rows = TRUE, - # start_row = skip - 1, - # na.strings = na.strings - # ) - }) |> - purrr::reduce(dplyr::full_join) - }, # warning = function(warn) { - # showNotification(paste0(warn), type = "warning") - # }, - error = function(err) { - showNotification(paste0(err), type = "err") - }) + # openxlsx2::read_xlsx( + # file = file, + # sheet = .x, + # skip_empty_rows = TRUE, + # start_row = skip - 1, + # na.strings = na.strings + # ) + }) |> + purrr::reduce(dplyr::full_join) + }, + # warning = function(warn) { + # showNotification(paste0(warn), type = "warning") + # }, + error = function(err) { + showNotification(paste0(err), type = "err") + } + ) } @@ -496,25 +468,27 @@ import_xls <- function(file, sheet, skip, na.strings) { #' @export #' import_ods <- function(file, sheet, skip, na.strings) { - tryCatch({ - if (is.null(sheet)) - sheet <- 1 - sheet |> - purrr::map(\(.x) { - readODS::read_ods( - path = file, - sheet = .x, - skip = skip, - na = na.strings - ) - }) |> - purrr::reduce(dplyr::full_join) - }, # warning = function(warn) { - # showNotification(paste0(warn), type = "warning") - # }, - error = function(err) { - showNotification(paste0(err), type = "err") - }) + tryCatch( + { + if (is.null(sheet)) sheet <- 1 + sheet |> + purrr::map(\(.x){ + readODS::read_ods( + path = file, + sheet = .x, + skip = skip, + na = na.strings + ) + }) |> + purrr::reduce(dplyr::full_join) + }, + # warning = function(warn) { + # showNotification(paste0(warn), type = "warning") + # }, + error = function(err) { + showNotification(paste0(err), type = "err") + } + ) } #' @name import-file-type @@ -523,7 +497,10 @@ import_ods <- function(file, sheet, skip, na.strings) { #' @export #' import_dta <- function(file) { - haven::read_dta(file = file, .name_repair = "unique_quiet") + haven::read_dta( + file = file, + .name_repair = "unique_quiet" + ) } #' @name import-file-type @@ -532,7 +509,9 @@ import_dta <- function(file) { #' @export #' import_rds <- function(file) { - out <- readr::read_rds(file = file) + out <- readr::read_rds( + file = file + ) if (is.data.frame(out)) { out @@ -607,17 +586,7 @@ import_file_demo_app <- function() { width = 4, import_file_ui( id = "myid", - file_extensions = c( - ".csv", - ".tsv", - ".txt", - ".xls", - ".xlsx", - ".rds", - ".sas7bdat", - ".ods", - ".dta" - ), + file_extensions = c(".csv", ".tsv", ".txt", ".xls", ".xlsx", ".rds", ".sas7bdat", ".ods", ".dta"), layout_params = "dropdown" # "inline" # or "dropdown" ) ), @@ -665,7 +634,6 @@ import_file_demo_app <- function() { #' This function may act to guard a hosted app against very large data sets in #' addition to the file size limitations. #' The function will limit the data set by dropping rows. -#' If limit is set to 0 or NULL, the original data set is returned. #' #' #' @param data data.frame @@ -676,68 +644,21 @@ import_file_demo_app <- function() { #' #' @examples #' prod(dim(mtcars)) -#' limit_data_size(mtcars,2) +#' limit_data_size(mtcars) #' limit_data_size(mtcars,100) limit_data_size <- function(data, limit = NULL) { - ## Add security to reduce large datasets to n observations below limit. + ## Add security to only allow dataset of 100.000 cells ## Ideally this should only go for the hosted version - if (is.null(limit) || limit == 0) { + if (is.null(limit)){ return(data) } data_dim <- dim(data) - ## If the limit is below nrow, the first observations from the first row - ## is included for a very pessimistic selection. - ## A more optimistic selection would just use ceiling instead of floor. - if (limit < data_dim[2]) { - head(data, 1)[seq_len(limit)] - } else if (prod(data_dim) > limit) { + if (prod(data_dim) > limit) { head(data, floor(limit / data_dim[2])) } else { data } } - - -#' @importFrom htmltools tagList tags -#' @importFrom shiny icon getDefaultReactiveDomain -make_success_alert <- function(data, - trigger_return, - btn_show_data, - extra = NULL, - session = shiny::getDefaultReactiveDomain()) { - if (identical(trigger_return, "button")) { - success_message <- tagList(tags$b( - phosphoricons::ph("check", weight = "bold"), - i18n$t("Data ready to be imported!") - ), - sprintf( - i18n$t("Data has %s obs. of %s variables."), - nrow(data), - ncol(data) - ), - extra) - } else { - success_message <- tagList(tags$b( - phosphoricons::ph("check", weight = "bold"), - i18n$t("Data successfully imported!") - ), - sprintf( - i18n$t("Data has %s obs. of %s variables."), - nrow(data), - ncol(data) - ), - extra) - } - if (isTRUE(btn_show_data)) { - success_message <- tagList(success_message, - tags$br(), - actionLink( - inputId = session$ns("see_data"), - label = tagList(phosphoricons::ph("table"), i18n$t("Click to see data")) - )) - } - return(success_message) -} diff --git a/R/import_globalenv-ext.R b/R/import_globalenv-ext.R index 0fc54dbd..29341403 100644 --- a/R/import_globalenv-ext.R +++ b/R/import_globalenv-ext.R @@ -1,6 +1,4 @@ - - #' @title Import data from an Environment #' #' @description Let the user select a dataset from its own environment or from a package's environment. @@ -20,6 +18,7 @@ import_globalenv_ui <- function(id, globalenv = TRUE, packages = datamods::get_data_packages(), title = TRUE) { + ns <- NS(id) choices <- list() @@ -32,14 +31,15 @@ import_globalenv_ui <- function(id, if (isTRUE(globalenv)) { selected <- "Global Environment" - select_label <- i18n$t("Select a dataset from your environment or sample dataset from a package.") } else { selected <- packages[1] - select_label <- i18n$t("Select a sample dataset from a package.") } if (isTRUE(title)) { - title <- tags$h4(i18n$t("Import a dataset from an environment"), class = "datamods-title") + title <- tags$h4( + i18n$t("Import a dataset from an environment"), + class = "datamods-title" + ) } tags$div( @@ -66,13 +66,14 @@ import_globalenv_ui <- function(id, # options = list(title = i18n$t("List of datasets...")), width = "100%" ), + tags$div( id = ns("import-placeholder"), shinyWidgets::alert( id = ns("import-result"), status = "info", tags$b(i18n$t("No data selected!")), - select_label, + i18n$t("Use a dataset from your environment or from the environment of a package."), dismissible = TRUE ) ), @@ -86,14 +87,12 @@ import_globalenv_ui <- function(id, #' @param btn_show_data Display or not a button to display data in a modal window if import is successful. -#' #' @param show_data_in Where to display data: in a `"popup"` or in a `"modal"` window. #' @param trigger_return When to update selected data: #' `"button"` (when user click on button) or #' `"change"` (each time user select a dataset in the list). #' @param return_class Class of returned data: `data.frame`, `data.table`, `tbl_df` (tibble) or `raw`. #' @param reset A `reactive` function that when triggered resets the data. -#' @param limit_data upper limit to imported data #' #' @export #' @@ -107,17 +106,16 @@ import_globalenv_server <- function(id, show_data_in = c("popup", "modal"), trigger_return = c("button", "change"), return_class = c("data.frame", "data.table", "tbl_df", "raw"), - reset = reactive(NULL), - limit_data = NULL) { + reset = reactive(NULL)) { + trigger_return <- match.arg(trigger_return) return_class <- match.arg(return_class) module <- function(input, output, session) { + ns <- session$ns imported_rv <- reactiveValues(data = NULL, name = NULL) - temporary_rv <- reactiveValues(data = NULL, - name = NULL, - status = NULL) + temporary_rv <- reactiveValues(data = NULL, name = NULL, status = NULL) observeEvent(reset(), { temporary_rv$data <- NULL @@ -132,7 +130,6 @@ import_globalenv_server <- function(id, }) observeEvent(input$env, { - # browser() if (identical(input$env, "Global Environment")) { choices <- datamods:::search_obj("data.frame") } else { @@ -142,14 +139,9 @@ import_globalenv_server <- function(id, choices <- i18n$t("No dataset here...") choicesOpt <- list(disabled = TRUE) } else { - choicesOpt <- list(subtext = get_dimensions(choices,filter_df=TRUE)) - # browser() - ## choices are corrected if GlobalEnv is not chosen - if (!identical(input$env, "Global Environment")) { - choices <- structure(names(choicesOpt$subtext), - package = attr(choices, "package")) - } - + choicesOpt <- list( + subtext = datamods:::get_dimensions(choices) + ) } temporary_rv$package <- attr(choices, "package") shinyWidgets::updatePickerInput( @@ -160,8 +152,7 @@ import_globalenv_server <- function(id, choicesOpt = choicesOpt, options = list( title = i18n$t("List of datasets..."), - "live-search" = TRUE - ) + "live-search" = TRUE) ) }) @@ -170,9 +161,7 @@ import_globalenv_server <- function(id, id = "import-result", status = "info", tags$b(i18n$t("No data selected!")), - i18n$t( - "Use a dataset from your environment or from the environment of a package." - ), + i18n$t("Use a dataset from your environment or from the environment of a package."), dismissible = TRUE ) ) @@ -186,68 +175,58 @@ import_globalenv_server <- function(id, - observeEvent(input$data, - { - if (!isTruthy(input$data)) { - datamods:::toggle_widget(inputId = "confirm", enable = FALSE) - datamods:::insert_alert( - selector = ns("import"), - status = "info", - tags$b(i18n$t("No data selected!")), - i18n$t( - "Use a dataset from your environment or from the environment of a package." - ) - ) - } else { - # browser() - name_df <- input$data + observeEvent(input$data, { + if (!isTruthy(input$data)) { + datamods:::toggle_widget(inputId = "confirm", enable = FALSE) + datamods:::insert_alert( + selector = ns("import"), + status = "info", + tags$b(i18n$t("No data selected!")), + i18n$t("Use a dataset from your environment or from the environment of a package.") + ) + } else { + name_df <- input$data - if (!is.null(temporary_rv$package)) { - attr(name_df, "package") <- temporary_rv$package - } + if (!is.null(temporary_rv$package)) { + attr(name_df, "package") <- temporary_rv$package + } - imported <- try(get_env_data(name_df), silent = TRUE) + imported <- try(get_env_data(name_df), silent = TRUE) - if (inherits(imported, "try-error") || - NROW(imported) < 1) { - datamods:::toggle_widget(inputId = "confirm", enable = FALSE) - datamods:::insert_error(mssg = i18n$t(attr(imported, "condition")$message)) - temporary_rv$status <- "error" - temporary_rv$data <- NULL - temporary_rv$name <- NULL - } else { - datamods:::toggle_widget(inputId = "confirm", enable = TRUE) - datamods:::insert_alert( - selector = ns("import"), - status = "success", - make_success_alert( - data = imported, - trigger_return = trigger_return, - btn_show_data = btn_show_data - ) - ) - pkg <- attr(name_df, "package") - if (!is.null(pkg)) { - name <- paste(pkg, input$data, sep = "::") - } else { - name <- input$data - } - name <- trimws(sub("\\(([^\\)]+)\\)", "", name)) - temporary_rv$status <- "success" - - temporary_rv$data <- limit_data_size(imported,limit = limit_data) - temporary_rv$name <- name - } - } - }, - ignoreInit = TRUE, - ignoreNULL = FALSE) + if (inherits(imported, "try-error") || NROW(imported) < 1) { + datamods:::toggle_widget(inputId = "confirm", enable = FALSE) + datamods:::insert_error(mssg = i18n$t(attr(imported, "condition")$message)) + temporary_rv$status <- "error" + temporary_rv$data <- NULL + temporary_rv$name <- NULL + } else { + datamods:::toggle_widget(inputId = "confirm", enable = TRUE) + datamods:::insert_alert( + selector = ns("import"), + status = "success", + datamods:::make_success_alert( + imported, + trigger_return = trigger_return, + btn_show_data = btn_show_data + ) + ) + pkg <- attr(name_df, "package") + if (!is.null(pkg)) { + name <- paste(pkg, input$data, sep = "::") + } else { + name <- input$data + } + name <- trimws(sub("\\(([^\\)]+)\\)", "", name)) + temporary_rv$status <- "success" + temporary_rv$data <- imported + temporary_rv$name <- name + } + } + }, ignoreInit = TRUE, ignoreNULL = FALSE) observeEvent(input$see_data, { - show_data(temporary_rv$data, - title = i18n$t("Imported data"), - type = show_data_in) + show_data(temporary_rv$data, title = i18n$t("Imported data"), type = show_data_in) }) observeEvent(input$confirm, { @@ -271,7 +250,10 @@ import_globalenv_server <- function(id, } } - moduleServer(id = id, module = module) + moduleServer( + id = id, + module = module + ) } @@ -318,7 +300,6 @@ get_data_packages <- function() { #' list_pkg_data("ggplot2") list_pkg_data <- function(pkg) { if (isTRUE(requireNamespace(pkg, quietly = TRUE))) { - # browser() list_data <- data(package = pkg, envir = environment())$results[, "Item"] list_data <- sort(list_data) attr(list_data, "package") <- pkg @@ -336,27 +317,17 @@ list_pkg_data <- function(pkg) { get_env_data <- function(obj, env = globalenv()) { pkg <- attr(obj, "package") re <- regexpr(pattern = "\\(([^\\)]+)\\)", text = obj) - obj_ <- substr( - x = obj, - start = re + 1, - stop = re + attr(re, "match.length") - 2 - ) - obj <- gsub(pattern = "\\s.*", - replacement = "", - x = obj) + obj_ <- substr(x = obj, start = re + 1, stop = re + attr(re, "match.length") - 2) + obj <- gsub(pattern = "\\s.*", replacement = "", x = obj) if (obj %in% ls(name = env)) { get(x = obj, envir = env) } else if (!is.null(pkg) && !identical(pkg, "")) { - res <- suppressWarnings(try(get(utils::data( - list = obj, - package = pkg, - envir = environment() - )), silent = TRUE)) + res <- suppressWarnings(try( + get(utils::data(list = obj, package = pkg, envir = environment())), silent = TRUE + )) if (!inherits(res, "try-error")) return(res) - data(list = obj_, - package = pkg, - envir = environment()) + data(list = obj_, package = pkg, envir = environment()) get(obj, envir = environment()) } else { NULL @@ -364,23 +335,16 @@ get_env_data <- function(obj, env = globalenv()) { } -#' Extension of the helper function from datamods -#' -#' @param objs objs -#' @param filter_df flag to only include data frames -#' -#' @returns vector of data frames with the package names as attr -get_dimensions <- function(objs,filter_df=TRUE) { - if (is.null(objs)){ +get_dimensions <- function(objs) { + if (is.null(objs)) return(NULL) - } dataframes_dims <- Map( f = function(name, pkg) { attr(name, "package") <- pkg tmp <- suppressWarnings(get_env_data(name)) if (is.data.frame(tmp)) { sprintf("%d obs. of %d variables", nrow(tmp), ncol(tmp)) - } else if (isFALSE(filter_df)) { + } else { i18n$t("Not a data.frame") } }, diff --git a/R/landing_page_ui.R b/R/landing_page_ui.R index 1123640e..3c742b69 100644 --- a/R/landing_page_ui.R +++ b/R/landing_page_ui.R @@ -22,7 +22,6 @@ landing_page_ui <- function(i18n) { i18n$t("Start with FreesearchR for basic data evaluation and analysis."), i18n$t("The app contains a selelct number of features and will guide you through key analyses."), i18n$t("When you need more advanced tools, you'll be prepared to use R directly."), - shiny::actionLink(inputId = "act_data",label = i18n$t("Start by loading data.")), style = "font-size: 1.2rem; color: #555;" ) ), diff --git a/R/launch_FreesearchR.R b/R/launch_FreesearchR.R index 504de474..c6bcc301 100644 --- a/R/launch_FreesearchR.R +++ b/R/launch_FreesearchR.R @@ -3,11 +3,6 @@ #' @description #' All data.frames in the global environment will be accessible through the app. #' -#' @param include_globalenv flag to include global env (local data) as option -#' when loading data -#' @param data_limit_default default data set observations limit -#' @param data_limit_upper data set observations upper limit -#' @param data_limit_lower data set observations lower limit #' @param ... passed on to `shiny::runApp()` #' #' @returns shiny app @@ -18,24 +13,13 @@ #' data(mtcars) #' launch_FreesearchR(launch.browser = TRUE) #' } -launch_FreesearchR <- function(inlcude_globalenv = TRUE, - data_limit_default = 1000, - data_limit_upper = 100000, - data_limit_lower = 1, - ...) { - global_freesearchR <- list( - include_globalenv = include_globalenv, - data_limit_default = data_limit_default, - data_limit_upper = data_limit_upper, - data_limit_lower = data_limit_lower - ) - +launch_FreesearchR <- function(...){ appDir <- system.file("apps", "FreesearchR", package = "FreesearchR") if (appDir == "") { - stop("Could not find the app directory. Try re-installing `FreesearchR`.", - call. = FALSE) + stop("Could not find the app directory. Try re-installing `FreesearchR`.", call. = FALSE) } - a <- shiny::runApp(appDir = paste0(appDir, "/app.R"), ...) + a <- shiny::runApp(appDir = paste0(appDir,"/app.R"), ...) return(invisible(a)) } + diff --git a/R/missings-module.R b/R/missings-module.R index 25d250ee..c4213d48 100644 --- a/R/missings-module.R +++ b/R/missings-module.R @@ -9,49 +9,45 @@ data_missings_ui <- function(id, ...) { ns <- shiny::NS(id) - list(bslib::layout_sidebar( - uiOutput(outputId = ns("feedback")), - sidebar = bslib::sidebar( - bslib::accordion( - id = ns("acc_mis"), - open = "acc_chars", - multiple = FALSE, - bslib::accordion_panel( - value = "acc_pan_mis", - title = "Settings", - icon = bsicons::bs_icon("gear"), - shiny::conditionalPanel( - condition = "output.missings == true", + list( + bslib::layout_sidebar( + sidebar = bslib::sidebar( + bslib::accordion( + id = ns("acc_mis"), + open = "acc_chars", + multiple = FALSE, + bslib::accordion_panel( + value = "acc_pan_mis", + title = "Settings", + icon = bsicons::bs_icon("gear"), shiny::uiOutput(ns("missings_method")), shiny::uiOutput(ns("missings_var")), - ns = ns - ), - shiny::helpText( - i18n$t( - "Evaluate missingness by either comparing missing values across variables (optionally grouped by af categorical or dichotomous variable) or compare variables grouped by the missing status (missing or not) of an outcome variable. If there is a significant difference i the missingness, this may cause a bias in you data and should be considered carefully interpreting the data and analyses as data may not be missing at random." + shiny::helpText(i18n$t("Evaluate missingness by either comparing missing values across variables (optionally grouped by af categorical or dichotomous variable) or compare variables grouped by the missing status (missing or not) of an outcome variable. If there is a significant difference i the missingness, this may cause a bias in you data and should be considered carefully interpreting the data and analyses as data may not be missing at random.")), + shiny::br(), + shiny::actionButton( + inputId = ns("act_miss"), + label = i18n$t("Evaluate"), + width = "100%", + icon = shiny::icon("calculator"), + disabled = FALSE ) ), - shiny::br(), - shiny::actionButton( - inputId = ns("act_miss"), - label = i18n$t("Evaluate"), - width = "100%", - icon = shiny::icon("calculator"), - disabled = TRUE + do.call( + bslib::accordion_panel, + c( + list( + title = "Download", + icon = bsicons::bs_icon("file-earmark-arrow-down") + ), + table_download_ui(id = ns("tbl_dwn"), title = NULL) + ) ) - ), - do.call(bslib::accordion_panel, c( - list( - title = "Download", - icon = bsicons::bs_icon("file-earmark-arrow-down") - ), - table_download_ui(id = ns("tbl_dwn"), title = NULL) - )) - ) - ), - ..., - gt::gt_output(outputId = ns("missings_table")) - )) + ) + ), + ..., + gt::gt_output(outputId = ns("missings_table")) + ) + ) } ## This should really just be rebuild to only contain a function @@ -63,71 +59,46 @@ data_missings_ui <- function(id, ...) { #' @name data-missings #' @returns shiny server module #' @export -data_missings_server <- function(id, data, max_level = 20, ...) { +data_missings_server <- function(id, + data, + max_level = 20, + ...) { shiny::moduleServer( id = id, module = function(input, output, session) { ns <- session$ns - datar <- if (is.reactive(data)) - data - else - reactive(data) + datar <- if (is.reactive(data)) data else reactive(data) - rv <- shiny::reactiveValues(data = NULL, - table = NULL, - feedback = NULL) - - ## Case with no missings - - info_alert <- shinyWidgets::alert( - status = "info", - phosphoricons::ph("question"), - i18n$t("You have provided a complete dataset with no missing values.") + rv <- shiny::reactiveValues( + data = NULL, + table = NULL ) - output$missings <- shiny::reactive({ - # shiny::req(data()) - any(is.na(datar())) - }) - shiny::outputOptions(output, "missings", suspendWhenHidden = FALSE) - - shiny::observeEvent(list(datar(), input$missings_method, input$missings_var), - { - # shiny::req(data()) - # browser() - if (!any(is.na(datar()))) { - rv$feedback <- info_alert - shiny::updateActionButton(inputId = "act_miss", disabled = TRUE) - rv$table <- NULL - output$missings_table <- gt::render_gt({ NULL }) - } else { - rv$feedback <- NULL - shiny::updateActionButton(inputId = "act_miss", disabled = FALSE) - } - },ignoreInit = TRUE) - - - output$feedback <- renderUI(rv$feedback) - ## Notes ## ## Code export is still missing ## Direct table export would be nice - shiny::observe(output$missings_method <- shiny::renderUI({ - shiny::req(datar()) - vectorSelectInput( - inputId = ns("missings_method"), - label = i18n$t("Analysis method for missingness overview"), - choices = setNames(c("predictors", "outcome"), c( - i18n$t("Overview of missings across variables"), - i18n$t( - "Overview of difference in variables by missing status in outcome" + shiny::observe( + output$missings_method <- shiny::renderUI({ + shiny::req(data()) + vectorSelectInput( + inputId = ns("missings_method"), + label = i18n$t("Analysis method for missingness overview"), + choices = setNames( + c( + "predictors", + "outcome" + ), + c( + i18n$t("Overview of missings across variables"), + i18n$t("Overview of difference in variables by missing status in outcome") + ) ) - )) - ) - })) + ) + }) + ) shiny::observe({ output$missings_var <- shiny::renderUI({ @@ -136,7 +107,7 @@ data_missings_server <- function(id, data, max_level = 20, ...) { # browser() if (input$missings_method == "predictors") { label <- i18n$t("Select a variable for grouped overview") - df <- data_type_filter(datar(), type = c("categorical", "dichotomous")) + df <- data_type_filter(data(), type = c("categorical", "dichotomous")) col_subset <- c("none", names(df)) } else { label <- i18n$t("Select outcome variable for overview") @@ -154,91 +125,94 @@ data_missings_server <- function(id, data, max_level = 20, ...) { }) - shiny::observeEvent(list(input$act_miss), { - shiny::req(datar()) - shiny::req(input$missings_var) - # browser() - df_tbl <- datar() - by_var <- input$missings_var + shiny::observeEvent( + list(input$act_miss), + { + shiny::req(datar()) + shiny::req(input$missings_var) + # browser() + df_tbl <- datar() + by_var <- input$missings_var - parameters <- list( - by_var = by_var, - max_level = max_level, - type = input$missings_method - ) + parameters <- list( + by_var = by_var, + max_level = max_level, + type = input$missings_method + ) - tryCatch({ - shiny::withProgress(message = i18n$t("Calculating. Hold tight for a moment.."), { - out <- do.call(compare_missings, modifyList(parameters, list(data = df_tbl))) - }) - }, error = function(err) { - showNotification(paste0("Error: ", err), type = "err") - }) + tryCatch( + { + shiny::withProgress(message = i18n$t("Calculating. Hold tight for a moment.."), { + out <- do.call( + compare_missings, + modifyList(parameters, list(data = df_tbl)) + ) + }) + }, + error = function(err) { + showNotification(paste0("Error: ", err), type = "err") + } + ) - if (is.null(input$missings_var) || - input$missings_var == "" || - !input$missings_var %in% names(datar()) || - input$missings_var == "none") { - # if (is.null(variabler()) || variabler() == "" || !variabler() %in% names(data()) || variabler() == "none") { - # tbl <- rv$data() - if (anyNA(datar())) { - if (input$missings_method == "predictors") { - title <- i18n$t("Overview of missing observations") + if (is.null(input$missings_var) || input$missings_var == "" || !input$missings_var %in% names(datar()) || input$missings_var == "none") { + # if (is.null(variabler()) || variabler() == "" || !variabler() %in% names(data()) || variabler() == "none") { + # tbl <- rv$data() + if (anyNA(datar())) { + if (input$missings_method == "predictors") { + title <- i18n$t("Overview of missing observations") + } else { + title <- i18n$t("No outcome measure chosen") + } } else { - title <- i18n$t("No outcome measure chosen") + title <- i18n$t("No missing observations") } } else { - title <- i18n$t("No missing observations") - } - } else { - ## Due to reactivity, the table updates too quickly. this mitigates that issue.. - if (input$missings_method == "predictors") { - title <- glue::glue( - i18n$t( - "Missing observations across variables grouped by **'{input$missings_var}'**" - ) - ) - } else { - title <- glue::glue( - i18n$t( - "Differences by missing vs non-missing observations in **'{input$missings_var}'**" - ) - ) + ## Due to reactivity, the table updates too quickly. this mitigates that issue.. + + + if (input$missings_var == "predictors") { + title <- glue::glue(i18n$t("Missings across variables by the variable **'{input$missings_var}'**")) + } else { + title <- glue::glue(i18n$t("Missing vs non-missing observations in the variable **'{input$missings_var}'**")) + } } + + attr(out, "tbl_title") <- title + + rv$data <- shiny::reactive(out) } + ) - attr(out, "tbl_title") <- title - - rv$data <- shiny::reactive(out) - }) - - shiny::observeEvent(list( - # input$act_miss - rv$data - ), { - output$missings_table <- gt::render_gt({ - shiny::req(rv$data) - # shiny::req(input$missings_var) - # browser() - if ("p.value" %in% names(rv$data()[["table_body"]])) { - tbl <- rv$data() |> - gtsummary::bold_p() - } else { - tbl <- rv$data() - } + shiny::observeEvent( + list( + # input$act_miss + rv$data + ), + { + output$missings_table <- gt::render_gt({ + shiny::req(rv$data) + # shiny::req(input$missings_var) + # browser() + if ("p.value" %in% names(rv$data()[["table_body"]])) { + tbl <- rv$data() |> + gtsummary::bold_p() + } else { + tbl <- rv$data() + } - out <- tbl |> - gtsummary::as_gt() |> - gt::tab_header(title = gt::md(attr(tbl, "tbl_title"))) + out <- tbl |> + gtsummary::as_gt() |> + gt::tab_header(title = gt::md(attr(tbl, "tbl_title"))) - attr(out, "strat_var") <- input$missings_var + attr(out, "strat_var") <- input$missings_var - rv$table <- out + rv$table <- out - out - }) - }) + out + }) + } + ) table_download_server( @@ -254,20 +228,25 @@ data_missings_server <- function(id, data, max_level = 20, ...) { missing_demo_app <- function() { - ui <- do.call(bslib::page, c( - list( - title = i18n$t("Missings"), - icon = bsicons::bs_icon("x-circle") - ), - data_missings_ui(id = "data"), - gt::gt_output("table_p") - )) + ui <- do.call( + bslib::page, + c( + list( + title = i18n$t("Missings"), + icon = bsicons::bs_icon("x-circle") + ), + data_missings_ui(id = "data"), + gt::gt_output("table_p") + ) + ) server <- function(input, output, session) { data_demo <- mtcars data_demo[sample(1:32, 10), "cyl"] <- NA data_demo[sample(1:32, 8), "vs"] <- NA - rv <- shiny::reactiveValues(table = NULL) + rv <- shiny::reactiveValues( + table = NULL + ) rv$table <- data_missings_server(id = "data", data = data_demo) @@ -301,15 +280,17 @@ missing_demo_app <- function() { #' @returns gtsummary list object #' @export #' -compare_missings <- function(data, - by_var, - max_level = 20, - type = c("predictors", "outcome")) { +compare_missings <- function( + data, + by_var, + max_level = 20, + type = c("predictors", "outcome") +) { type <- match.arg(type) if (!is.null(by_var) && by_var != "" && by_var %in% names(data)) { data <- data |> - lapply(\(.x) { + lapply(\(.x){ if (is.factor(.x)) { cut_var(.x, breaks = 20, type = "top") } else { @@ -353,7 +334,7 @@ compare_missings <- function(data, missings_logic_across <- function(data, exclude = NULL) { # This function includes a approach way to preserve variable labels names(data) |> - lapply(\(.x) { + lapply(\(.x){ # browser() # Saving original labels lab <- REDCapCAST::get_attr(data[[.x]], attr = "label") @@ -364,12 +345,7 @@ missings_logic_across <- function(data, exclude = NULL) { } if (!is.na(lab)) { # Restoring original labels, if not NA - REDCapCAST::set_attr( - data = out, - label = lab, - attr = "label", - overwrite = TRUE - ) + REDCapCAST::set_attr(data = out, label = lab, attr = "label", overwrite = TRUE) } else { out } diff --git a/R/sysdata.rda b/R/sysdata.rda index 21d41608..1eef663e 100644 Binary files a/R/sysdata.rda and b/R/sysdata.rda differ diff --git a/R/translate.R b/R/translate.R index 35eca6c0..c03f241c 100644 --- a/R/translate.R +++ b/R/translate.R @@ -7,3 +7,4 @@ language_choices <- function() { # "🇸🇪 Svenska" = "sv" ) } + diff --git a/R/ui_elements.R b/R/ui_elements.R index 3898cf41..df419d6a 100644 --- a/R/ui_elements.R +++ b/R/ui_elements.R @@ -25,7 +25,7 @@ ui_elements <- function(selection) { ## Default just output "NULL" ## This could probably be achieved more legantly, but this works. dev_banner(), - landing_page_ui(i18n = i18n), + landing_page_ui(i18n=i18n), # shiny::column(width = 2), # shiny::column( # width = 8, @@ -68,11 +68,7 @@ ui_elements <- function(selection) { ), # shiny::tags$script('document.querySelector("#source div").style.width = "100%"'), ## Update this to change depending on run locally or hosted - shiny::helpText( - i18n$t( - "Upload a file, get data directly from REDCap or use local or sample data." - ) - ), + shiny::helpText(i18n$t("Upload a file, get data directly from REDCap or use local or sample data.")), shiny::br(), shiny::br(), shiny::conditionalPanel( @@ -81,11 +77,7 @@ ui_elements <- function(selection) { id = "file_import", layout_params = "dropdown", # title = "Choose a datafile to upload", - file_extensions = c(".csv", ".tsv", ".txt", ".xls", ".xlsx", ".rds", ".ods", ".dta"), - limit_default = global_freesearchR$data_limit_default, - limit_lower = global_freesearchR$data_limit_lower, - limit_upper = global_freesearchR$data_limit_upper - + file_extensions = c(".csv", ".tsv", ".txt", ".xls", ".xlsx", ".rds", ".ods", ".dta") ) ), shiny::conditionalPanel( @@ -98,15 +90,17 @@ ui_elements <- function(selection) { # shiny::HTML(i18n$t("

The FreesearchR app only stores data for analyses, but please only use with sensitive data when running locally. Read more here

")), # dismissible = TRUE # ), - m_redcap_readUI(id = "redcap_import", title = "") + m_redcap_readUI( + id = "redcap_import", + title = "" + ) ), shiny::conditionalPanel( condition = "input.source=='env'", import_globalenv_ui( id = "env", title = NULL, - packages = c("NHANES", "stRoke", "datasets", "MASS"), - globalenv = global_freesearchR$include_globalenv + packages = c("NHANES", "stRoke", "datasets", "MASS") ) ), # shiny::conditionalPanel( @@ -142,11 +136,7 @@ ui_elements <- function(selection) { format = shinyWidgets::wNumbFormat(decimals = 0), color = datamods:::get_primary_color() ), - shiny::helpText( - i18n$t( - "At 0, only complete variables are included; at 100, all variables are included." - ) - ), + shiny::helpText(i18n$t("At 0, only complete variables are included; at 100, all variables are included.")), shiny::br() ), shiny::column( @@ -195,9 +185,7 @@ ui_elements <- function(selection) { width = 9, shiny::uiOutput(outputId = "data_info", inline = TRUE), shiny::tags$p( - i18n$t( - "Below you find a summary table for quick insigths, and on the right you can visualise data classes, browse observations and apply different data filters." - ) + i18n$t("Below you find a summary table for quick insigths, and on the right you can visualise data classes, browse observations and apply different data filters.") ) ), shiny::column( @@ -233,18 +221,16 @@ ui_elements <- function(selection) { shiny::column( width = 3, shiny::tags$h6(i18n$t("Filter data types")), - shiny::uiOutput(outputId = "column_filter"), - ## This needs to run in server for translation - shiny::helpText( - "Read more on how ", - tags$a( - "data types", - href = "https://agdamsbo.github.io/FreesearchR/articles/data-types.html", - target = "_blank", - rel = "noopener noreferrer" - ), - " are defined." + shiny::uiOutput( + outputId = "column_filter" ), + ## This needs to run in server for translation + shiny::helpText("Read more on how ", tags$a( + "data types", + href = "https://agdamsbo.github.io/FreesearchR/articles/data-types.html", + target = "_blank", + rel = "noopener noreferrer" + ), " are defined."), validation_ui("validation_var"), shiny::br(), shiny::br(), @@ -264,26 +250,21 @@ ui_elements <- function(selection) { title = i18n$t("Edit and create data"), icon = shiny::icon("file-pen"), tags$h3(i18n$t("Subset, rename and convert variables")), - fluidRow(shiny::column( - width = 9, shiny::tags$p( - i18n$t( - "Below, are several options for simple data manipulation like update variables by renaming, creating new labels (for nicer tables in the report) and changing variable classes (numeric, factor/categorical etc.)." - ), - i18n$t( - "There are more advanced options to modify factor/categorical variables as well as create new factor from an existing variable or new variables with R code. At the bottom you can restore the original data." - ), - i18n$t( - "Please note that data modifications are applied before any filtering." + fluidRow( + shiny::column( + width = 9, + shiny::tags$p( + i18n$t("Below, are several options for simple data manipulation like update variables by renaming, creating new labels (for nicer tables in the report) and changing variable classes (numeric, factor/categorical etc.)."), + i18n$t("There are more advanced options to modify factor/categorical variables as well as create new factor from an existing variable or new variables with R code. At the bottom you can restore the original data."), + i18n$t("Please note that data modifications are applied before any filtering.") ) ) - )), + ), update_variables_ui("modal_variables"), shiny::tags$br(), shiny::tags$br(), shiny::tags$h4(i18n$t("Advanced data manipulation")), - shiny::tags$p( - i18n$t("Below options allow more advanced varaible manipulations.") - ), + shiny::tags$p(i18n$t("Below options allow more advanced varaible manipulations.")), shiny::tags$br(), shiny::tags$br(), shiny::fluidRow( @@ -295,9 +276,7 @@ ui_elements <- function(selection) { width = "100%" ), shiny::tags$br(), - shiny::helpText( - i18n$t("Reorder or rename the levels of factor/categorical variables.") - ), + shiny::helpText(i18n$t("Reorder or rename the levels of factor/categorical variables.")), shiny::tags$br(), shiny::tags$br() ), @@ -309,11 +288,7 @@ ui_elements <- function(selection) { width = "100%" ), shiny::tags$br(), - shiny::helpText( - i18n$t( - "Create factor/categorical variable from a continous variable (number/date/time)." - ) - ), + shiny::helpText(i18n$t("Create factor/categorical variable from a continous variable (number/date/time).")), shiny::tags$br(), shiny::tags$br() ), @@ -325,9 +300,7 @@ ui_elements <- function(selection) { width = "100%" ), shiny::tags$br(), - shiny::helpText(i18n$t( - "Split a text column by a recognised delimiter." - )), + shiny::helpText(i18n$t("Split a text column by a recognised delimiter.")), shiny::tags$br(), shiny::tags$br() ), @@ -339,18 +312,16 @@ ui_elements <- function(selection) { width = "100%" ), shiny::tags$br(), - shiny::helpText(i18n$t( - "Create a new variable based on an R-expression." - )), + shiny::helpText(i18n$t("Create a new variable based on an R-expression.")), shiny::tags$br(), shiny::tags$br() ) ), tags$h4(i18n$t("Compare modified data to original")), shiny::tags$br(), - shiny::tags$p(i18n$t( - "Raw print of the original vs the modified data." - )), + shiny::tags$p( + i18n$t("Raw print of the original vs the modified data.") + ), shiny::tags$br(), shiny::fluidRow( shiny::column( @@ -371,11 +342,7 @@ ui_elements <- function(selection) { width = "100%" ), shiny::tags$br(), - shiny::helpText( - i18n$t( - "Reset to original imported dataset. Careful! There is no un-doing." - ) - ), + shiny::helpText(i18n$t("Reset to original imported dataset. Careful! There is no un-doing.")), shiny::tags$br(), shiny::tags$br() ) @@ -421,11 +388,7 @@ ui_elements <- function(selection) { # ), shiny::uiOutput("detail_level"), shiny::uiOutput("strat_var"), - shiny::helpText( - i18n$t( - "Only factor/categorical variables are available for stratification. Go back to the 'Prepare' tab to reclass a variable if it's not on the list." - ) - ), + shiny::helpText(i18n$t("Only factor/categorical variables are available for stratification. Go back to the 'Prepare' tab to reclass a variable if it's not on the list.")), shiny::conditionalPanel( condition = "input.strat_var!='none'", shiny::radioButtons( @@ -433,7 +396,10 @@ ui_elements <- function(selection) { label = i18n$t("Compare strata?"), selected = "no", inline = TRUE, - choices = list("No" = "no", "Yes" = "yes") + choices = list( + "No" = "no", + "Yes" = "yes" + ) ), # shiny::helpText(i18n$t("Option to perform statistical comparisons between strata in baseline table.")), shiny::br(), @@ -442,7 +408,10 @@ ui_elements <- function(selection) { label = i18n$t("Include group differences"), selected = "no", inline = TRUE, - choices = list("No" = "no", "Yes" = "yes") + choices = list( + "No" = "no", + "Yes" = "yes" + ) ) ), shiny::br(), @@ -453,9 +422,7 @@ ui_elements <- function(selection) { icon = shiny::icon("calculator"), disabled = TRUE ), - shiny::helpText(i18n$t( - "Press 'Evaluate' to create the comparison table." - )) + shiny::helpText(i18n$t("Press 'Evaluate' to create the comparison table.")) ) ) ), @@ -477,11 +444,7 @@ ui_elements <- function(selection) { title = "Settings", icon = bsicons::bs_icon("bounding-box"), shiny::uiOutput("outcome_var_cor"), - shiny::helpText( - i18n$t( - "To avoid evaluating the correlation of the outcome variable, this can be excluded from the plot or select 'none'." - ) - ), + shiny::helpText(i18n$t("To avoid evaluating the correlation of the outcome variable, this can be excluded from the plot or select 'none'.")), shiny::br(), shinyWidgets::noUiSliderInput( inputId = "cor_cutoff", @@ -493,22 +456,24 @@ ui_elements <- function(selection) { format = shinyWidgets::wNumbFormat(decimals = 2), color = datamods:::get_primary_color() ), - shiny::helpText(i18n$t( - "Set the cut-off for considered 'highly correlated'." - )) + shiny::helpText(i18n$t("Set the cut-off for considered 'highly correlated'.")) ) ) ), data_correlations_ui(id = "correlations", height = 600) ) ), - do.call(bslib::nav_panel, c( - list( - title = i18n$t("Missings"), - icon = bsicons::bs_icon("x-circle") - ), - data_missings_ui(id = "missingness", validation_ui("validation_mcar")) - )) + do.call( + bslib::nav_panel, + c( + list( + title = i18n$t("Missings"), + icon = bsicons::bs_icon("x-circle") + ), + data_missings_ui(id = "missingness", + validation_ui("validation_mcar")) + ) + ) ), ############################################################################## ######### @@ -543,7 +508,10 @@ ui_elements <- function(selection) { title = i18n$t("Regression"), icon = shiny::icon("calculator"), value = "nav_analyses", - do.call(bslib::navset_card_tab, regression_ui("regression")) + do.call( + bslib::navset_card_tab, + regression_ui("regression") + ) ), ############################################################################## ######### @@ -565,11 +533,7 @@ ui_elements <- function(selection) { shiny::column( width = 6, shiny::h4(i18n$t("Report")), - shiny::helpText( - i18n$t( - "Choose your favourite output file format for further work, and download, when the analyses are done." - ) - ), + shiny::helpText(i18n$t("Choose your favourite output file format for further work, and download, when the analyses are done.")), shiny::br(), shiny::br(), shiny::selectInput( @@ -597,9 +561,7 @@ ui_elements <- function(selection) { shiny::column( width = 6, shiny::h4("Data"), - shiny::helpText( - "Choose your favourite output data format to download the modified data." - ), + shiny::helpText("Choose your favourite output data format to download the modified data."), shiny::br(), shiny::br(), shiny::selectInput( @@ -626,27 +588,16 @@ ui_elements <- function(selection) { shiny::br(), shiny::br(), shiny::h4("Code snippets"), - shiny::tags$p( - "Below are the code bits used to create the final data set and the main analyses." + shiny::tags$p("Below are the code bits used to create the final data set and the main analyses."), + shiny::tags$p("This can be used as a starting point for learning to code and for reproducibility."), + shiny::tagList( + lapply( + paste0("code_", c( + "import", "format", "data", "variables", "filter", "table1", "univariable", "multivariable" + )), + \(.x)shiny::htmlOutput(outputId = .x) + ) ), - shiny::tags$p( - "This can be used as a starting point for learning to code and for reproducibility." - ), - shiny::tagList(lapply( - paste0( - "code_", - c( - "import", - "format", - "data", - "variables", - "filter", - "table1", - "univariable", - "multivariable" - ) - ), \(.x)shiny::htmlOutput(outputId = .x) - )), shiny::tags$br(), shiny::br() ), @@ -662,8 +613,7 @@ ui_elements <- function(selection) { # shiny::img(shiny::icon("book")), shiny::tags$a( href = "https://redcap.au.dk/surveys/?s=JPCLPTXYDKFA8DA8", - "Feedback", - shiny::icon("arrow-up-right-from-square"), + "Feedback", shiny::icon("arrow-up-right-from-square"), target = "_blank", rel = "noopener noreferrer" ) @@ -677,8 +627,7 @@ ui_elements <- function(selection) { # shiny::img(shiny::icon("book")), shiny::tags$a( href = "https://agdamsbo.github.io/FreesearchR/", - "Docs", - shiny::icon("arrow-up-right-from-square"), + "Docs", shiny::icon("arrow-up-right-from-square"), target = "_blank", rel = "noopener noreferrer" ) diff --git a/R/update-factor-ext.R b/R/update-factor-ext.R index 19fb9c40..0387a10f 100644 --- a/R/update-factor-ext.R +++ b/R/update-factor-ext.R @@ -78,10 +78,7 @@ update_factor_ui <- function(id) { ), actionButton( inputId = ns("create"), - label = tagList( - phosphoricons::ph("arrow-clockwise"), - i18n$t("Update factor variable") - ), + label = tagList(phosphoricons::ph("arrow-clockwise"), i18n$t("Update factor variable")), class = "btn-outline-primary" ) ), @@ -100,136 +97,154 @@ update_factor_ui <- function(id) { #' #' @rdname update-factor update_factor_server <- function(id, data_r = reactive(NULL)) { - moduleServer(id, function(input, output, session) { - rv <- reactiveValues(data = NULL, data_grid = NULL) + moduleServer( + id, + function(input, output, session) { + rv <- reactiveValues(data = NULL, data_grid = NULL) - bindEvent(observe({ - data <- data_r() - rv$data <- data - vars_factor <- vapply(data, is.factor, logical(1)) - vars_factor <- names(vars_factor)[vars_factor] - updateVirtualSelect( - inputId = "variable", - choices = vars_factor, - selected = if (isTruthy(input$variable)) - input$variable - else - vars_factor[1] - ) - }), data_r(), input$hidden) + bindEvent(observe({ + data <- data_r() + rv$data <- data + vars_factor <- vapply(data, is.factor, logical(1)) + vars_factor <- names(vars_factor)[vars_factor] + updateVirtualSelect( + inputId = "variable", + choices = vars_factor, + selected = if (isTruthy(input$variable)) input$variable else vars_factor[1] + ) + }), data_r(), input$hidden) - observeEvent(input$variable, { - data <- req(data_r()) - variable <- req(input$variable) - grid <- as.data.frame(table(data[[variable]])) - rv$data_grid <- grid - }) - - observeEvent(input$sort_levels, { - if (input$sort_levels %% 2 == 1) { - decreasing <- FALSE - label <- tagList(phosphoricons::ph("sort-descending"), - i18n$t("Sort by Levels")) - } else { - decreasing <- TRUE - label <- tagList(phosphoricons::ph("sort-ascending"), - i18n$t("Sort by Levels")) - } - updateActionButton(inputId = "sort_levels", label = label) - rv$data_grid <- rv$data_grid[order(rv$data_grid[[1]], decreasing = decreasing), ] - }) - - observeEvent(input$sort_occurrences, { - if (input$sort_occurrences %% 2 == 1) { - decreasing <- FALSE - label <- tagList(phosphoricons::ph("sort-descending"), - i18n$t("Sort by count")) - } else { - decreasing <- TRUE - label <- tagList(phosphoricons::ph("sort-ascending"), - i18n$t("Sort by count")) - } - updateActionButton(inputId = "sort_occurrences", label = label) - rv$data_grid <- rv$data_grid[order(rv$data_grid[[2]], decreasing = decreasing), ] - }) - - - output$grid <- renderDatagrid({ - req(rv$data_grid) - gridTheme <- getOption("datagrid.theme") - if (length(gridTheme) < 1) { - datamods:::apply_grid_theme() - } - on.exit(toastui::reset_grid_theme()) - data <- rv$data_grid - data <- add_var_toset(data, "Var1", "New label") - - grid <- datagrid( - data = data, - draggable = TRUE, - sortable = FALSE, - data_as_input = TRUE - ) - grid <- grid_columns( - grid, - columns = c("Var1", "Var1_toset", "Freq"), - header = c(i18n$t("Levels"), "New label", i18n$t("Count")) - ) - grid <- grid_colorbar( - grid, - column = "Freq", - label_outside = TRUE, - label_width = "30px", - background = "#D8DEE9", - bar_bg = datamods:::get_primary_color(), - from = c(0, max(rv$data_grid$Freq) + 1) - ) - grid <- toastui::grid_style_column(grid = grid, - column = "Var1_toset", - fontStyle = "italic") - grid <- toastui::grid_editor(grid = grid, - column = "Var1_toset", - type = "text") - grid - }) - - data_updated_r <- reactive({ - data <- req(data_r()) - variable <- req(input$variable) - grid <- req(input$grid_data) - - parameters <- list( - variable = variable, - new_variable = isTRUE(input$new_var) | - any(grid[["Var1_toset"]] == "New label"), - new_levels = as.character(grid[["Var1"]]), - new_labels = as.character(grid[["Var1_toset"]]), - ignore = "New label" - ) - - data <- tryCatch({ - rlang::exec(factor_new_levels_labels, - !!!modifyList(parameters, val = list(data = data))) - }, error = function(err) { - showNotification(paste( - "We encountered the following error creating the new factor:", - err - ), - type = "err") + observeEvent(input$variable, { + data <- req(data_r()) + variable <- req(input$variable) + grid <- as.data.frame(table(data[[variable]])) + rv$data_grid <- grid }) - # browser() - code <- rlang::call2("factor_new_levels_labels", !!!parameters, .ns = "FreesearchR") - attr(data, "code") <- code + observeEvent(input$sort_levels, { + if (input$sort_levels %% 2 == 1) { + decreasing <- FALSE + label <- tagList( + phosphoricons::ph("sort-descending"), + i18n$t("Sort by Levels") + ) + } else { + decreasing <- TRUE + label <- tagList( + phosphoricons::ph("sort-ascending"), + i18n$t("Sort by Levels") + ) + } + updateActionButton(inputId = "sort_levels", label = label) + rv$data_grid <- rv$data_grid[order(rv$data_grid[[1]], decreasing = decreasing), ] + }) - data - }) + observeEvent(input$sort_occurrences, { + if (input$sort_occurrences %% 2 == 1) { + decreasing <- FALSE + label <- tagList( + phosphoricons::ph("sort-descending"), + i18n$t("Sort by count") + ) + } else { + decreasing <- TRUE + label <- tagList( + phosphoricons::ph("sort-ascending"), + i18n$t("Sort by count") + ) + } + updateActionButton(inputId = "sort_occurrences", label = label) + rv$data_grid <- rv$data_grid[order(rv$data_grid[[2]], decreasing = decreasing), ] + }) - data_returned_r <- observeEvent(input$create, { - rv$data <- data_updated_r() - }) - return(reactive(rv$data)) - }) + + output$grid <- renderDatagrid({ + req(rv$data_grid) + gridTheme <- getOption("datagrid.theme") + if (length(gridTheme) < 1) { + datamods:::apply_grid_theme() + } + on.exit(toastui::reset_grid_theme()) + data <- rv$data_grid + data <- add_var_toset(data, "Var1", "New label") + + grid <- datagrid( + data = data, + draggable = TRUE, + sortable = FALSE, + data_as_input = TRUE + ) + grid <- grid_columns( + grid, + columns = c("Var1", "Var1_toset", "Freq"), + header = c(i18n$t("Levels"), "New label", i18n$t("Count")) + ) + grid <- grid_colorbar( + grid, + column = "Freq", + label_outside = TRUE, + label_width = "30px", + background = "#D8DEE9", + bar_bg = datamods:::get_primary_color(), + from = c(0, max(rv$data_grid$Freq) + 1) + ) + grid <- toastui::grid_style_column( + grid = grid, + column = "Var1_toset", + fontStyle = "italic" + ) + grid <- toastui::grid_editor( + grid = grid, + column = "Var1_toset", + type = "text" + ) + grid + }) + + data_updated_r <- reactive({ + data <- req(data_r()) + variable <- req(input$variable) + grid <- req(input$grid_data) + + parameters <- list( + variable = variable, + new_variable = isTRUE(input$new_var) | any(grid[["Var1_toset"]] == "New label"), + new_levels = as.character(grid[["Var1"]]), + new_labels = as.character(grid[["Var1_toset"]]), + ignore = "New label" + ) + + data <- tryCatch( + { + rlang::exec( + factor_new_levels_labels, + !!!modifyList(parameters, + val = list(data = data) + ) + ) + }, + error = function(err) { + showNotification(paste("We encountered the following error creating the new factor:", err), type = "err") + } + ) + + # browser() + code <- rlang::call2( + "factor_new_levels_labels", + !!!parameters, + .ns = "FreesearchR" + ) + attr(data, "code") <- code + + data + }) + + data_returned_r <- observeEvent(input$create, { + rv$data <- data_updated_r() + }) + return(reactive(rv$data)) + } + ) } #' Simple function to apply new levels and/or labels to factor @@ -246,12 +261,13 @@ update_factor_server <- function(id, data_r = reactive(NULL)) { #' data_n <- mtcars #' data_n$cyl <- factor(data_n$cyl) #' factor_new_levels_labels(data_n, "cyl", new_labels = c("four", "New label", "New label")) -factor_new_levels_labels <- function(data, - variable, - new_variable = TRUE, - new_levels = NULL, - new_labels = NULL, - ignore = "New label") { +factor_new_levels_labels <- function( + data, + variable, + new_variable = TRUE, + new_levels = NULL, + new_labels = NULL, + ignore = "New label") { if (!is.factor(data[[variable]])) { return(data) } @@ -264,19 +280,21 @@ factor_new_levels_labels <- function(data, new_labels <- labels(data[[variable]]) } - with_level <- factor(as.character(data[[variable]]), levels = new_levels) - with_label <- factor(with_level, - labels = ifelse(new_labels == "New label", new_levels, new_labels)) + with_level <- factor( + as.character(data[[variable]]), + levels = new_levels + ) + with_label <- factor( + with_level, + labels = ifelse(new_labels == "New label", new_levels, new_labels) + ) if (isTRUE(new_variable)) { append_column( data = data, column = with_label, - name = unique_names( - new = paste0(variable, "_updated"), - existing = names(data) - ) + name = unique_names(new = paste0(variable, "_updated"), existing = names(data)) ) } else { data[[variable]] <- with_label @@ -285,6 +303,7 @@ factor_new_levels_labels <- function(data, } + #' @inheritParams shiny::modalDialog #' @export #' @@ -298,23 +317,17 @@ modal_update_factor <- function(id, size = "l", footer = NULL) { ns <- NS(id) - showModal( - modalDialog( - title = tagList(title, datamods:::button_close_modal()), - update_factor_ui(id), - tags$div( - style = "display: none;", - textInput( - inputId = ns("hidden"), - label = NULL, - value = datamods:::genId() - ) - ), - easyClose = easyClose, - size = size, - footer = footer - ) - ) + showModal(modalDialog( + title = tagList(title, datamods:::button_close_modal()), + update_factor_ui(id), + tags$div( + style = "display: none;", + textInput(inputId = ns("hidden"), label = NULL, value = datamods:::genId()) + ), + easyClose = easyClose, + size = size, + footer = footer + )) } @@ -333,11 +346,10 @@ winbox_update_factor <- function(id, title = title, ui = tagList( update_factor_ui(id), - tags$div(style = "display: none;", textInput( - inputId = ns("hidden"), - label = NULL, - value = genId() - )) + tags$div( + style = "display: none;", + textInput(inputId = ns("hidden"), label = NULL, value = genId()) + ) ), options = modifyList( shinyWidgets::wbOptions(height = "615px", modal = TRUE), diff --git a/R/visual_summary.R b/R/visual_summary.R index 8c79de38..e909260f 100644 --- a/R/visual_summary.R +++ b/R/visual_summary.R @@ -166,7 +166,7 @@ visual_summary <- function(data, legend.title = NULL, ylab = "Observations", ... ggplot2::theme_minimal() + ggplot2::theme(axis.text.x = ggplot2::element_text( angle = 45, - vjust = 0, hjust = 1 + vjust = 1, hjust = 1 )) + ggplot2::scale_fill_manual(values = l$colors) + ggplot2::labs(x = "", y = ylab) + diff --git a/SESSION.md b/SESSION.md index a0adec99..dd1f5f34 100644 --- a/SESSION.md +++ b/SESSION.md @@ -1,21 +1,21 @@ -------------------------------------------------------------------------------- -------------------------------- R environment --------------------------------- -------------------------------------------------------------------------------- -|setting |value | -|:-----------|:------------------------------------------| -|version |R version 4.5.2 (2025-10-31) | -|os |macOS Tahoe 26.3 | -|system |aarch64, darwin20 | -|ui |RStudio | -|language |(EN) | -|collate |en_US.UTF-8 | -|ctype |en_US.UTF-8 | -|tz |Europe/Copenhagen | -|date |2026-02-23 | -|rstudio |2026.01.1+403 Apple Blossom (desktop) | -|pandoc |3.6.4 @ /opt/homebrew/bin/ (via rmarkdown) | -|quarto |1.7.30 @ /usr/local/bin/quarto | -|FreesearchR |26.2.2.260223 | +|setting |value | +|:-----------|:----------------------------------------------| +|version |R version 4.4.1 (2024-06-14) | +|os |macOS 26.1 | +|system |aarch64, darwin20 | +|ui |RStudio | +|language |(EN) | +|collate |en_US.UTF-8 | +|ctype |en_US.UTF-8 | +|tz |Europe/Copenhagen | +|date |2026-01-06 | +|rstudio |2025.09.2+418 Cucumberleaf Sunflower (desktop) | +|pandoc |3.6.4 @ /opt/homebrew/bin/ (via rmarkdown) | +|quarto |1.7.30 @ /usr/local/bin/quarto | +|FreesearchR |26.1.1.260106 | -------------------------------------------------------------------------------- @@ -23,216 +23,204 @@ -------------------------------------------------------------------------------- |package |loadedversion |date |source | |:-----------------|:-------------|:----------|:--------------| -|apexcharter |0.4.5 |2026-01-07 |CRAN (R 4.5.2) | -|askpass |1.2.1 |2024-10-04 |CRAN (R 4.5.0) | -|assertthat |0.2.1 |2019-03-21 |CRAN (R 4.5.0) | -|attachment |0.4.5 |2025-03-14 |CRAN (R 4.5.0) | -|attempt |0.3.1 |2020-05-03 |CRAN (R 4.5.0) | -|backports |1.5.0 |2024-05-23 |CRAN (R 4.5.0) | -|base64enc |0.1-6 |2026-02-02 |CRAN (R 4.5.2) | -|bayestestR |0.17.0 |2025-08-29 |CRAN (R 4.5.0) | -|bit |4.6.0 |2025-03-06 |CRAN (R 4.5.0) | -|bit64 |4.6.0-1 |2025-01-16 |CRAN (R 4.5.0) | -|bitops |1.0-9 |2024-10-03 |CRAN (R 4.5.0) | -|boot |1.3-32 |2025-08-29 |CRAN (R 4.5.2) | -|brio |1.1.5 |2024-04-24 |CRAN (R 4.5.0) | -|broom |1.0.12 |2026-01-27 |CRAN (R 4.5.2) | -|broom.helpers |1.22.0 |2025-09-17 |CRAN (R 4.5.0) | -|bsicons |0.1.2 |2023-11-04 |CRAN (R 4.5.0) | -|bslib |0.10.0 |2026-01-26 |CRAN (R 4.5.2) | -|cachem |1.1.0 |2024-05-16 |CRAN (R 4.5.0) | -|calendar |0.2.0 |2024-08-20 |CRAN (R 4.5.0) | -|cards |0.7.1 |2025-12-02 |CRAN (R 4.5.2) | -|cardx |0.3.2 |2026-02-05 |CRAN (R 4.5.2) | -|caTools |1.18.3 |2024-09-04 |CRAN (R 4.5.0) | -|cellranger |1.1.0 |2016-07-27 |CRAN (R 4.5.0) | -|cffr |1.2.1 |2026-01-12 |CRAN (R 4.5.2) | -|checkmate |2.3.4 |2026-02-03 |CRAN (R 4.5.2) | -|class |7.3-23 |2025-01-01 |CRAN (R 4.5.2) | -|classInt |0.4-11 |2025-01-08 |CRAN (R 4.5.0) | -|cli |3.6.5 |2025-04-23 |CRAN (R 4.5.0) | -|cluster |2.1.8.2 |2026-02-05 |CRAN (R 4.5.2) | -|codetools |0.2-20 |2024-03-31 |CRAN (R 4.5.2) | -|colorspace |2.1-2 |2025-09-22 |CRAN (R 4.5.0) | -|commonmark |2.0.0 |2025-07-07 |CRAN (R 4.5.0) | -|crayon |1.5.3 |2024-06-20 |CRAN (R 4.5.0) | -|curl |7.0.0 |2025-08-19 |CRAN (R 4.5.0) | -|data.table |1.18.2.1 |2026-01-27 |CRAN (R 4.5.2) | -|datamods |1.5.3 |2024-10-02 |CRAN (R 4.5.0) | -|datawizard |1.3.0 |2025-10-11 |CRAN (R 4.5.0) | -|DEoptimR |1.1-4 |2025-07-27 |CRAN (R 4.5.0) | -|desc |1.4.3 |2023-12-10 |CRAN (R 4.5.0) | -|devtools |2.4.6 |2025-10-03 |CRAN (R 4.5.0) | -|DHARMa |0.4.7 |2024-10-18 |CRAN (R 4.5.0) | -|digest |0.6.39 |2025-11-19 |CRAN (R 4.5.2) | -|dockerfiler |0.2.5 |2025-05-07 |CRAN (R 4.5.0) | -|doParallel |1.0.17 |2022-02-07 |CRAN (R 4.5.0) | -|dplyr |1.2.0 |2026-02-03 |CRAN (R 4.5.2) | -|DT |0.34.0 |2025-09-02 |CRAN (R 4.5.0) | -|e1071 |1.7-17 |2025-12-18 |CRAN (R 4.5.2) | -|easystats |0.7.5 |2025-07-11 |CRAN (R 4.5.0) | -|ellipsis |0.3.2 |2021-04-29 |CRAN (R 4.5.0) | -|emmeans |2.0.1 |2025-12-16 |CRAN (R 4.5.2) | -|esquisse |2.1.0 |2025-02-21 |CRAN (R 4.5.0) | -|estimability |1.5.1 |2024-05-12 |CRAN (R 4.5.0) | -|eulerr |7.0.4 |2025-09-24 |CRAN (R 4.5.0) | -|evaluate |1.0.5 |2025-08-27 |CRAN (R 4.5.0) | -|farver |2.1.2 |2024-05-13 |CRAN (R 4.5.0) | -|fastmap |1.2.0 |2024-05-15 |CRAN (R 4.5.0) | -|flextable |0.9.11 |2026-02-13 |CRAN (R 4.5.2) | -|fontawesome |0.5.3 |2024-11-16 |CRAN (R 4.5.0) | -|fontBitstreamVera |0.1.1 |2017-02-01 |CRAN (R 4.5.0) | -|fontLiberation |0.1.0 |2016-10-15 |CRAN (R 4.5.0) | -|fontquiver |0.2.1 |2017-02-01 |CRAN (R 4.5.0) | -|forcats |1.0.1 |2025-09-25 |CRAN (R 4.5.0) | -|foreach |1.5.2 |2022-02-02 |CRAN (R 4.5.0) | -|foreign |0.8-90 |2025-03-31 |CRAN (R 4.5.2) | -|Formula |1.2-5 |2023-02-24 |CRAN (R 4.5.0) | -|FreesearchR |26.2.2 |NA |NA | -|fs |1.6.6 |2025-04-12 |CRAN (R 4.5.0) | -|gdtools |0.5.0 |2026-02-09 |CRAN (R 4.5.2) | -|generics |0.1.4 |2025-05-09 |CRAN (R 4.5.0) | -|ggalluvial |0.12.5 |2023-02-22 |CRAN (R 4.5.0) | -|ggcorrplot |0.1.4.1 |2023-09-05 |CRAN (R 4.5.0) | -|ggforce |0.5.0 |2025-06-18 |CRAN (R 4.5.0) | -|ggplot2 |4.0.2 |2026-02-03 |CRAN (R 4.5.2) | -|ggridges |0.5.7 |2025-08-27 |CRAN (R 4.5.0) | -|ggstats |0.12.0 |2025-12-22 |CRAN (R 4.5.2) | -|glue |1.8.0 |2024-09-30 |CRAN (R 4.5.0) | -|gridExtra |2.3 |2017-09-09 |CRAN (R 4.5.0) | -|gt |1.3.0 |2026-01-22 |CRAN (R 4.5.2) | -|gtable |0.3.6 |2024-10-25 |CRAN (R 4.5.0) | -|gtsummary |2.5.0 |2025-12-05 |CRAN (R 4.5.2) | -|haven |2.5.5 |2025-05-30 |CRAN (R 4.5.0) | -|here |1.0.2 |2025-09-15 |CRAN (R 4.5.0) | -|Hmisc |5.2-5 |2026-01-09 |CRAN (R 4.5.2) | -|hms |1.1.4 |2025-10-17 |CRAN (R 4.5.0) | -|htmlTable |2.4.3 |2024-07-21 |CRAN (R 4.5.0) | -|htmltools |0.5.9 |2025-12-04 |CRAN (R 4.5.2) | -|htmlwidgets |1.6.4 |2023-12-06 |CRAN (R 4.5.0) | -|httpuv |1.6.16 |2025-04-16 |CRAN (R 4.5.0) | -|IDEAFilter |0.2.1 |2025-07-29 |CRAN (R 4.5.0) | -|insight |1.4.6 |2026-02-04 |CRAN (R 4.5.2) | -|iterators |1.0.14 |2022-02-05 |CRAN (R 4.5.0) | -|jquerylib |0.1.4 |2021-04-26 |CRAN (R 4.5.0) | -|jsonlite |2.0.0 |2025-03-27 |CRAN (R 4.5.0) | -|jsonvalidate |1.5.0 |2025-02-07 |CRAN (R 4.5.0) | -|KernSmooth |2.23-26 |2025-01-01 |CRAN (R 4.5.2) | -|keyring |1.4.1 |2025-06-15 |CRAN (R 4.5.0) | -|knitr |1.51 |2025-12-20 |CRAN (R 4.5.2) | -|later |1.4.6 |2026-02-13 |CRAN (R 4.5.2) | -|lattice |0.22-7 |2025-04-02 |CRAN (R 4.5.2) | -|lifecycle |1.0.5 |2026-01-08 |CRAN (R 4.5.2) | -|litedown |0.9 |2025-12-18 |CRAN (R 4.5.2) | -|lme4 |1.1-38 |2025-12-02 |CRAN (R 4.5.2) | -|lubridate |1.9.5 |2026-02-04 |CRAN (R 4.5.2) | -|magrittr |2.0.4 |2025-09-12 |CRAN (R 4.5.0) | -|markdown |2.0 |2025-03-23 |CRAN (R 4.5.0) | -|MASS |7.3-65 |2025-02-28 |CRAN (R 4.5.0) | -|Matrix |1.7-4 |2025-08-28 |CRAN (R 4.5.2) | -|memoise |2.0.1 |2021-11-26 |CRAN (R 4.5.0) | -|mime |0.13 |2025-03-17 |CRAN (R 4.5.0) | -|minqa |1.2.8 |2024-08-17 |CRAN (R 4.5.0) | -|mvtnorm |1.3-3 |2025-01-10 |CRAN (R 4.5.0) | -|NHANES |2.1.0 |2015-07-02 |CRAN (R 4.5.0) | -|nlme |3.1-168 |2025-03-31 |CRAN (R 4.5.2) | -|nloptr |2.2.1 |2025-03-17 |CRAN (R 4.5.0) | -|nnet |7.3-20 |2025-01-01 |CRAN (R 4.5.2) | -|officer |0.7.3 |2026-01-16 |CRAN (R 4.5.2) | -|opdisDownsampling |1.0.1 |2024-04-15 |CRAN (R 4.5.0) | -|openssl |2.3.4 |2025-09-30 |CRAN (R 4.5.0) | -|openxlsx2 |1.23.1 |2026-01-19 |CRAN (R 4.5.2) | -|otel |0.2.0 |2025-08-29 |CRAN (R 4.5.0) | -|pak |0.9.2 |2025-12-22 |CRAN (R 4.5.2) | -|parameters |0.28.3 |2025-11-25 |CRAN (R 4.5.2) | -|patchwork |1.3.2 |2025-08-25 |CRAN (R 4.5.0) | -|pbmcapply |1.5.1 |2022-04-28 |CRAN (R 4.5.0) | -|performance |0.16.0 |2026-02-04 |CRAN (R 4.5.2) | -|phosphoricons |0.2.1 |2024-04-08 |CRAN (R 4.5.0) | -|pillar |1.11.1 |2025-09-17 |CRAN (R 4.5.0) | -|pkgbuild |1.4.8 |2025-05-26 |CRAN (R 4.5.0) | -|pkgconfig |2.0.3 |2019-09-22 |CRAN (R 4.5.0) | -|pkgload |1.5.0 |2026-02-03 |CRAN (R 4.5.2) | -|plyr |1.8.9 |2023-10-02 |CRAN (R 4.5.0) | -|polyclip |1.10-7 |2024-07-23 |CRAN (R 4.5.0) | -|pracma |2.4.6 |2025-10-22 |CRAN (R 4.5.0) | -|processx |3.8.6 |2025-02-21 |CRAN (R 4.5.0) | -|promises |1.5.0 |2025-11-01 |CRAN (R 4.5.0) | -|proxy |0.4-29 |2025-12-29 |CRAN (R 4.5.2) | -|ps |1.9.1 |2025-04-12 |CRAN (R 4.5.0) | -|purrr |1.2.1 |2026-01-09 |CRAN (R 4.5.2) | -|qqconf |1.3.2 |2023-04-14 |CRAN (R 4.5.0) | -|qqplotr |0.0.7 |2025-09-05 |CRAN (R 4.5.0) | -|quarto |1.5.1 |2025-09-04 |CRAN (R 4.5.0) | -|R6 |2.6.1 |2025-02-15 |CRAN (R 4.5.0) | -|ragg |1.5.0 |2025-09-02 |CRAN (R 4.5.0) | -|rankinPlot |1.1.0 |2023-01-30 |CRAN (R 4.5.0) | -|rappdirs |0.3.4 |2026-01-17 |CRAN (R 4.5.2) | -|rbibutils |2.4.1 |2026-01-21 |CRAN (R 4.5.2) | -|RColorBrewer |1.1-3 |2022-04-03 |CRAN (R 4.5.0) | -|Rcpp |1.1.1 |2026-01-10 |CRAN (R 4.5.2) | -|RcppArmadillo |15.2.3-1 |2025-12-17 |CRAN (R 4.5.2) | -|Rdpack |2.6.6 |2026-02-08 |CRAN (R 4.5.2) | -|reactable |0.4.5 |2025-12-01 |CRAN (R 4.5.2) | -|readODS |2.3.2 |2025-01-13 |CRAN (R 4.5.0) | -|readr |2.2.0 |2026-02-19 |CRAN (R 4.5.2) | -|readxl |1.4.5 |2025-03-07 |CRAN (R 4.5.0) | -|REDCapCAST |26.1.1 |2026-01-29 |CRAN (R 4.5.2) | -|REDCapR |1.6.0 |2025-10-08 |CRAN (R 4.5.0) | -|reformulas |0.4.4 |2026-02-02 |CRAN (R 4.5.2) | -|remotes |2.5.0 |2024-03-17 |CRAN (R 4.5.0) | -|rempsyc |0.2.0 |2025-09-15 |CRAN (R 4.5.0) | -|renv |1.1.7 |2026-01-27 |CRAN (R 4.5.2) | -|reshape2 |1.4.5 |2025-11-12 |CRAN (R 4.5.0) | -|rio |1.2.4 |2025-09-26 |CRAN (R 4.5.0) | -|rlang |1.1.7 |2026-01-09 |CRAN (R 4.5.2) | -|rmarkdown |2.30 |2025-09-28 |CRAN (R 4.5.0) | -|robustbase |0.99-7 |2026-02-05 |CRAN (R 4.5.2) | -|roxygen2 |7.3.3 |2025-09-03 |CRAN (R 4.5.0) | -|rpart |4.1.24 |2025-01-07 |CRAN (R 4.5.2) | -|rprojroot |2.1.1 |2025-08-26 |CRAN (R 4.5.0) | -|rsconnect |1.7.0 |2025-12-06 |CRAN (R 4.5.2) | -|rstudioapi |0.18.0 |2026-01-16 |CRAN (R 4.5.2) | -|S7 |0.2.1 |2025-11-14 |CRAN (R 4.5.2) | -|sass |0.4.10 |2025-04-11 |CRAN (R 4.5.0) | -|scales |1.4.0 |2025-04-24 |CRAN (R 4.5.0) | -|see |0.13.0 |2026-01-30 |CRAN (R 4.5.2) | -|sessioninfo |1.2.3 |2025-02-05 |CRAN (R 4.5.0) | -|shiny |1.13.0 |2026-02-20 |CRAN (R 4.5.2) | -|shiny.i18n |0.3.0 |2023-01-16 |CRAN (R 4.5.0) | -|shiny2docker |0.0.3 |2025-06-28 |CRAN (R 4.5.0) | -|shinybusy |0.3.3 |2024-03-09 |CRAN (R 4.5.0) | -|shinyjs |2.1.1 |2026-01-15 |CRAN (R 4.5.2) | -|shinyTime |1.0.3 |2022-08-19 |CRAN (R 4.5.0) | -|shinyWidgets |0.9.0 |2025-02-21 |CRAN (R 4.5.0) | -|smd |0.8.0 |2025-02-12 |CRAN (R 4.5.0) | -|stringi |1.8.7 |2025-03-27 |CRAN (R 4.5.0) | -|stringr |1.6.0 |2025-11-04 |CRAN (R 4.5.0) | -|stRoke |25.9.2 |2025-09-30 |CRAN (R 4.5.0) | -|systemfonts |1.3.1 |2025-10-01 |CRAN (R 4.5.0) | -|testthat |3.3.2 |2026-01-11 |CRAN (R 4.5.2) | -|textshaping |1.0.4 |2025-10-10 |CRAN (R 4.5.0) | -|thematic |0.1.8 |2025-09-29 |CRAN (R 4.5.0) | -|tibble |3.3.1 |2026-01-11 |CRAN (R 4.5.2) | -|tidyr |1.3.2 |2025-12-19 |CRAN (R 4.5.2) | -|tidyselect |1.2.1 |2024-03-11 |CRAN (R 4.5.0) | -|timechange |0.4.0 |2026-01-29 |CRAN (R 4.5.2) | -|toastui |0.4.0 |2025-04-03 |CRAN (R 4.5.0) | -|tweenr |2.0.3 |2024-02-26 |CRAN (R 4.5.0) | -|twosamples |2.0.1 |2023-06-23 |CRAN (R 4.5.0) | -|tzdb |0.5.0 |2025-03-15 |CRAN (R 4.5.0) | -|usethis |3.2.1 |2025-09-06 |CRAN (R 4.5.0) | -|uuid |1.2-2 |2026-01-23 |CRAN (R 4.5.2) | -|V8 |8.0.1 |2025-10-10 |CRAN (R 4.5.0) | -|vctrs |0.7.1 |2026-01-23 |CRAN (R 4.5.2) | -|viridis |0.6.5 |2024-01-29 |CRAN (R 4.5.0) | -|viridisLite |0.4.3 |2026-02-04 |CRAN (R 4.5.2) | -|vroom |1.7.0 |2026-01-27 |CRAN (R 4.5.2) | -|withr |3.0.2 |2024-10-28 |CRAN (R 4.5.0) | -|writexl |1.5.4 |2025-04-15 |CRAN (R 4.5.0) | -|xfun |0.56 |2026-01-18 |CRAN (R 4.5.2) | -|xml2 |1.5.2 |2026-01-17 |CRAN (R 4.5.2) | -|xtable |1.8-4 |2019-04-21 |CRAN (R 4.5.0) | -|yaml |2.3.12 |2025-12-10 |CRAN (R 4.5.2) | -|yesno |0.1.3 |2024-07-26 |CRAN (R 4.5.0) | -|zip |2.3.3 |2025-05-13 |CRAN (R 4.5.0) | +|apexcharter |0.4.4 |2024-09-06 |CRAN (R 4.4.1) | +|askpass |1.2.1 |2024-10-04 |CRAN (R 4.4.1) | +|assertthat |0.2.1 |2019-03-21 |CRAN (R 4.4.1) | +|backports |1.5.0 |2024-05-23 |CRAN (R 4.4.1) | +|base64enc |0.1-3 |2015-07-28 |CRAN (R 4.4.1) | +|bayestestR |0.17.0 |2025-08-29 |CRAN (R 4.4.1) | +|bit |4.6.0 |2025-03-06 |CRAN (R 4.4.1) | +|bit64 |4.6.0-1 |2025-01-16 |CRAN (R 4.4.1) | +|bitops |1.0-9 |2024-10-03 |CRAN (R 4.4.1) | +|boot |1.3-32 |2025-08-29 |CRAN (R 4.4.1) | +|brio |1.1.5 |2024-04-24 |CRAN (R 4.4.1) | +|broom |1.0.11 |2025-12-04 |CRAN (R 4.4.3) | +|broom.helpers |1.22.0 |2025-09-17 |CRAN (R 4.4.1) | +|bsicons |0.1.2 |2023-11-04 |CRAN (R 4.4.0) | +|bslib |0.9.0 |2025-01-30 |CRAN (R 4.4.1) | +|cachem |1.1.0 |2024-05-16 |CRAN (R 4.4.1) | +|calendar |0.2.0 |2024-08-20 |CRAN (R 4.4.1) | +|cards |0.7.1 |2025-12-02 |CRAN (R 4.4.3) | +|cardx |0.3.1 |2025-12-04 |CRAN (R 4.4.3) | +|caTools |1.18.3 |2024-09-04 |CRAN (R 4.4.1) | +|cellranger |1.1.0 |2016-07-27 |CRAN (R 4.4.0) | +|checkmate |2.3.3 |2025-08-18 |CRAN (R 4.4.1) | +|class |7.3-23 |2025-01-01 |CRAN (R 4.4.1) | +|classInt |0.4-11 |2025-01-08 |CRAN (R 4.4.1) | +|cli |3.6.5 |2025-04-23 |CRAN (R 4.4.1) | +|cluster |2.1.8.1 |2025-03-12 |CRAN (R 4.4.1) | +|codetools |0.2-20 |2024-03-31 |CRAN (R 4.4.1) | +|colorspace |2.1-2 |2025-09-22 |CRAN (R 4.4.1) | +|commonmark |2.0.0 |2025-07-07 |CRAN (R 4.4.1) | +|crayon |1.5.3 |2024-06-20 |CRAN (R 4.4.1) | +|data.table |1.17.8 |2025-07-10 |CRAN (R 4.4.1) | +|datamods |1.5.3 |2024-10-02 |CRAN (R 4.4.1) | +|datawizard |1.3.0 |2025-10-11 |CRAN (R 4.4.1) | +|DEoptimR |1.1-4 |2025-07-27 |CRAN (R 4.4.1) | +|desc |1.4.3 |2023-12-10 |CRAN (R 4.4.1) | +|devtools |2.4.6 |2025-10-03 |CRAN (R 4.4.1) | +|DHARMa |0.4.7 |2024-10-18 |CRAN (R 4.4.1) | +|digest |0.6.39 |2025-11-19 |CRAN (R 4.4.3) | +|doParallel |1.0.17 |2022-02-07 |CRAN (R 4.4.0) | +|dplyr |1.1.4 |2023-11-17 |CRAN (R 4.4.0) | +|DT |0.34.0 |2025-09-02 |CRAN (R 4.4.1) | +|e1071 |1.7-16 |2024-09-16 |CRAN (R 4.4.1) | +|easystats |0.7.5 |2025-07-11 |CRAN (R 4.4.1) | +|ellipsis |0.3.2 |2021-04-29 |CRAN (R 4.4.1) | +|emmeans |2.0.0 |2025-10-29 |CRAN (R 4.4.1) | +|esquisse |2.1.0 |2025-02-21 |CRAN (R 4.4.1) | +|estimability |1.5.1 |2024-05-12 |CRAN (R 4.4.1) | +|eulerr |7.0.4 |2025-09-24 |CRAN (R 4.4.1) | +|evaluate |1.0.5 |2025-08-27 |CRAN (R 4.4.1) | +|farver |2.1.2 |2024-05-13 |CRAN (R 4.4.1) | +|fastmap |1.2.0 |2024-05-15 |CRAN (R 4.4.1) | +|flextable |0.9.10 |2025-08-24 |CRAN (R 4.4.1) | +|fontawesome |0.5.3 |2024-11-16 |CRAN (R 4.4.1) | +|fontBitstreamVera |0.1.1 |2017-02-01 |CRAN (R 4.4.1) | +|fontLiberation |0.1.0 |2016-10-15 |CRAN (R 4.4.1) | +|fontquiver |0.2.1 |2017-02-01 |CRAN (R 4.4.0) | +|forcats |1.0.1 |2025-09-25 |CRAN (R 4.4.1) | +|foreach |1.5.2 |2022-02-02 |CRAN (R 4.4.0) | +|foreign |0.8-90 |2025-03-31 |CRAN (R 4.4.1) | +|Formula |1.2-5 |2023-02-24 |CRAN (R 4.4.1) | +|FreesearchR |26.1.1 |NA |NA | +|fs |1.6.6 |2025-04-12 |CRAN (R 4.4.1) | +|gdtools |0.4.4 |2025-10-06 |CRAN (R 4.4.1) | +|generics |0.1.4 |2025-05-09 |CRAN (R 4.4.1) | +|ggalluvial |0.12.5 |2023-02-22 |CRAN (R 4.4.0) | +|ggcorrplot |0.1.4.1 |2023-09-05 |CRAN (R 4.4.0) | +|ggforce |0.5.0 |2025-06-18 |CRAN (R 4.4.1) | +|ggplot2 |4.0.1 |2025-11-14 |CRAN (R 4.4.1) | +|ggridges |0.5.7 |2025-08-27 |CRAN (R 4.4.1) | +|ggstats |0.11.0 |2025-09-15 |CRAN (R 4.4.1) | +|glue |1.8.0 |2024-09-30 |CRAN (R 4.4.1) | +|gridExtra |2.3 |2017-09-09 |CRAN (R 4.4.1) | +|gt |1.1.0 |2025-09-23 |CRAN (R 4.4.1) | +|gtable |0.3.6 |2024-10-25 |CRAN (R 4.4.1) | +|gtsummary |2.5.0 |2025-12-05 |CRAN (R 4.4.3) | +|haven |2.5.5 |2025-05-30 |CRAN (R 4.4.1) | +|here |1.0.2 |2025-09-15 |CRAN (R 4.4.1) | +|Hmisc |5.2-4 |2025-10-05 |CRAN (R 4.4.1) | +|hms |1.1.4 |2025-10-17 |CRAN (R 4.4.1) | +|htmlTable |2.4.3 |2024-07-21 |CRAN (R 4.4.0) | +|htmltools |0.5.9 |2025-12-04 |CRAN (R 4.4.3) | +|htmlwidgets |1.6.4 |2023-12-06 |CRAN (R 4.4.0) | +|httpuv |1.6.16 |2025-04-16 |CRAN (R 4.4.1) | +|IDEAFilter |0.2.1 |2025-07-29 |CRAN (R 4.4.1) | +|insight |1.4.4 |2025-12-06 |CRAN (R 4.4.3) | +|iterators |1.0.14 |2022-02-05 |CRAN (R 4.4.1) | +|jquerylib |0.1.4 |2021-04-26 |CRAN (R 4.4.0) | +|jsonlite |2.0.0 |2025-03-27 |CRAN (R 4.4.1) | +|KernSmooth |2.23-26 |2025-01-01 |CRAN (R 4.4.1) | +|keyring |1.4.1 |2025-06-15 |CRAN (R 4.4.1) | +|knitr |1.50 |2025-03-16 |CRAN (R 4.4.1) | +|later |1.4.4 |2025-08-27 |CRAN (R 4.4.1) | +|lattice |0.22-7 |2025-04-02 |CRAN (R 4.4.1) | +|lifecycle |1.0.4 |2023-11-07 |CRAN (R 4.4.1) | +|lme4 |1.1-38 |2025-12-02 |CRAN (R 4.4.3) | +|lubridate |1.9.4 |2024-12-08 |CRAN (R 4.4.1) | +|magrittr |2.0.4 |2025-09-12 |CRAN (R 4.4.1) | +|MASS |7.3-65 |2025-02-28 |CRAN (R 4.4.1) | +|Matrix |1.7-4 |2025-08-28 |CRAN (R 4.4.1) | +|memoise |2.0.1 |2021-11-26 |CRAN (R 4.4.0) | +|mime |0.13 |2025-03-17 |CRAN (R 4.4.1) | +|minqa |1.2.8 |2024-08-17 |CRAN (R 4.4.1) | +|mvtnorm |1.3-3 |2025-01-10 |CRAN (R 4.4.1) | +|NHANES |2.1.0 |2015-07-02 |CRAN (R 4.4.0) | +|nlme |3.1-168 |2025-03-31 |CRAN (R 4.4.1) | +|nloptr |2.2.1 |2025-03-17 |CRAN (R 4.4.1) | +|nnet |7.3-20 |2025-01-01 |CRAN (R 4.4.1) | +|officer |0.7.2 |2025-12-04 |CRAN (R 4.4.3) | +|opdisDownsampling |1.0.1 |2024-04-15 |CRAN (R 4.4.0) | +|openssl |2.3.4 |2025-09-30 |CRAN (R 4.4.1) | +|openxlsx2 |1.22 |2025-12-07 |CRAN (R 4.4.3) | +|otel |0.2.0 |2025-08-29 |CRAN (R 4.4.1) | +|parameters |0.28.3 |2025-11-25 |CRAN (R 4.4.3) | +|patchwork |1.3.2 |2025-08-25 |CRAN (R 4.4.1) | +|pbmcapply |1.5.1 |2022-04-28 |CRAN (R 4.4.1) | +|performance |0.15.3 |2025-12-01 |CRAN (R 4.4.3) | +|phosphoricons |0.2.1 |2024-04-08 |CRAN (R 4.4.0) | +|pillar |1.11.1 |2025-09-17 |CRAN (R 4.4.1) | +|pkgbuild |1.4.8 |2025-05-26 |CRAN (R 4.4.1) | +|pkgconfig |2.0.3 |2019-09-22 |CRAN (R 4.4.1) | +|pkgload |1.4.1 |2025-09-23 |CRAN (R 4.4.1) | +|plyr |1.8.9 |2023-10-02 |CRAN (R 4.4.1) | +|polyclip |1.10-7 |2024-07-23 |CRAN (R 4.4.1) | +|pracma |2.4.6 |2025-10-22 |CRAN (R 4.4.1) | +|processx |3.8.6 |2025-02-21 |CRAN (R 4.4.1) | +|promises |1.5.0 |2025-11-01 |CRAN (R 4.4.1) | +|proxy |0.4-27 |2022-06-09 |CRAN (R 4.4.1) | +|ps |1.9.1 |2025-04-12 |CRAN (R 4.4.1) | +|purrr |1.2.0 |2025-11-04 |CRAN (R 4.4.1) | +|qqconf |1.3.2 |2023-04-14 |CRAN (R 4.4.0) | +|qqplotr |0.0.7 |2025-09-05 |CRAN (R 4.4.1) | +|quarto |1.5.1 |2025-09-04 |CRAN (R 4.4.1) | +|R6 |2.6.1 |2025-02-15 |CRAN (R 4.4.1) | +|ragg |1.5.0 |2025-09-02 |CRAN (R 4.4.1) | +|rankinPlot |1.1.0 |2023-01-30 |CRAN (R 4.4.0) | +|rbibutils |2.4 |2025-11-07 |CRAN (R 4.4.1) | +|RColorBrewer |1.1-3 |2022-04-03 |CRAN (R 4.4.1) | +|Rcpp |1.1.0 |2025-07-02 |CRAN (R 4.4.1) | +|RcppArmadillo |15.2.2-1 |2025-11-22 |CRAN (R 4.4.3) | +|Rdpack |2.6.4 |2025-04-09 |CRAN (R 4.4.1) | +|reactable |0.4.5 |2025-12-01 |CRAN (R 4.4.3) | +|readODS |2.3.2 |2025-01-13 |CRAN (R 4.4.1) | +|readr |2.1.6 |2025-11-14 |CRAN (R 4.4.3) | +|readxl |1.4.5 |2025-03-07 |CRAN (R 4.4.1) | +|REDCapCAST |25.3.2 |2025-03-10 |CRAN (R 4.4.1) | +|REDCapR |1.6.0 |2025-10-08 |CRAN (R 4.4.1) | +|reformulas |0.4.2 |2025-10-28 |CRAN (R 4.4.1) | +|remotes |2.5.0 |2024-03-17 |CRAN (R 4.4.1) | +|rempsyc |0.2.0 |2025-09-15 |CRAN (R 4.4.1) | +|renv |1.1.5 |2025-07-24 |CRAN (R 4.4.1) | +|reshape2 |1.4.5 |2025-11-12 |CRAN (R 4.4.1) | +|rio |1.2.4 |2025-09-26 |CRAN (R 4.4.1) | +|rlang |1.1.6 |2025-04-11 |CRAN (R 4.4.1) | +|rmarkdown |2.30 |2025-09-28 |CRAN (R 4.4.1) | +|robustbase |0.99-6 |2025-09-04 |CRAN (R 4.4.1) | +|roxygen2 |7.3.3 |2025-09-03 |CRAN (R 4.4.1) | +|rpart |4.1.24 |2025-01-07 |CRAN (R 4.4.1) | +|rprojroot |2.1.1 |2025-08-26 |CRAN (R 4.4.1) | +|rsconnect |1.7.0 |2025-12-06 |CRAN (R 4.4.3) | +|rstudioapi |0.17.1 |2024-10-22 |CRAN (R 4.4.1) | +|S7 |0.2.1 |2025-11-14 |CRAN (R 4.4.3) | +|sass |0.4.10 |2025-04-11 |CRAN (R 4.4.1) | +|scales |1.4.0 |2025-04-24 |CRAN (R 4.4.1) | +|see |0.12.0 |2025-09-14 |CRAN (R 4.4.1) | +|sessioninfo |1.2.3 |2025-02-05 |CRAN (R 4.4.1) | +|shiny |1.12.1 |2025-12-09 |CRAN (R 4.4.1) | +|shiny.i18n |0.3.0 |2023-01-16 |CRAN (R 4.4.0) | +|shinybusy |0.3.3 |2024-03-09 |CRAN (R 4.4.0) | +|shinyjs |2.1.0 |2021-12-23 |CRAN (R 4.4.0) | +|shinyTime |1.0.3 |2022-08-19 |CRAN (R 4.4.0) | +|shinyWidgets |0.9.0 |2025-02-21 |CRAN (R 4.4.1) | +|smd |0.8.0 |2025-02-12 |CRAN (R 4.4.1) | +|stringi |1.8.7 |2025-03-27 |CRAN (R 4.4.1) | +|stringr |1.6.0 |2025-11-04 |CRAN (R 4.4.1) | +|stRoke |25.9.2 |2025-09-30 |CRAN (R 4.4.1) | +|systemfonts |1.3.1 |2025-10-01 |CRAN (R 4.4.1) | +|testthat |3.3.1 |2025-11-25 |CRAN (R 4.4.3) | +|textshaping |1.0.4 |2025-10-10 |CRAN (R 4.4.1) | +|thematic |0.1.8 |2025-09-29 |CRAN (R 4.4.1) | +|tibble |3.3.0 |2025-06-08 |CRAN (R 4.4.1) | +|tidyr |1.3.1 |2024-01-24 |CRAN (R 4.4.1) | +|tidyselect |1.2.1 |2024-03-11 |CRAN (R 4.4.0) | +|timechange |0.3.0 |2024-01-18 |CRAN (R 4.4.1) | +|toastui |0.4.0 |2025-04-03 |CRAN (R 4.4.1) | +|tweenr |2.0.3 |2024-02-26 |CRAN (R 4.4.0) | +|twosamples |2.0.1 |2023-06-23 |CRAN (R 4.4.1) | +|tzdb |0.5.0 |2025-03-15 |CRAN (R 4.4.1) | +|usethis |3.2.1 |2025-09-06 |CRAN (R 4.4.1) | +|utf8 |1.2.6 |2025-06-08 |CRAN (R 4.4.1) | +|uuid |1.2-1 |2024-07-29 |CRAN (R 4.4.1) | +|vctrs |0.6.5 |2023-12-01 |CRAN (R 4.4.0) | +|viridis |0.6.5 |2024-01-29 |CRAN (R 4.4.0) | +|viridisLite |0.4.2 |2023-05-02 |CRAN (R 4.4.1) | +|vroom |1.6.7 |2025-11-28 |CRAN (R 4.4.3) | +|withr |3.0.2 |2024-10-28 |CRAN (R 4.4.1) | +|writexl |1.5.4 |2025-04-15 |CRAN (R 4.4.1) | +|xfun |0.54 |2025-10-30 |CRAN (R 4.4.1) | +|xml2 |1.5.1 |2025-12-01 |CRAN (R 4.4.3) | +|xtable |1.8-4 |2019-04-21 |CRAN (R 4.4.1) | +|yaml |2.3.11 |2025-11-28 |CRAN (R 4.4.3) | +|zip |2.3.3 |2025-05-13 |CRAN (R 4.4.1) | diff --git a/app_docker/Dockerfile b/app_docker/Dockerfile index 15d3a400..451123dd 100644 --- a/app_docker/Dockerfile +++ b/app_docker/Dockerfile @@ -1,9 +1,9 @@ -FROM rocker/tidyverse:4.5.2 +FROM rocker/tidyverse:4.4.1 RUN apt-get update -y && apt-get install -y cmake make libcurl4-openssl-dev libicu-dev libssl-dev pandoc zlib1g-dev libsecret-1-dev libxml2-dev libx11-dev libcairo2-dev libfontconfig1-dev libfreetype6-dev libfribidi-dev libharfbuzz-dev libjpeg-dev libpng-dev libtiff-dev libwebp-dev libfftw3-dev && rm -rf /var/lib/apt/lists/* RUN mkdir -p /usr/local/lib/R/etc/ /usr/lib/R/etc/ RUN echo "options(renv.config.pak.enabled = FALSE, repos = c(CRAN = 'https://cran.rstudio.com/'), download.file.method = 'libcurl', Ncpus = 4)" | tee /usr/local/lib/R/etc/Rprofile.site | tee /usr/lib/R/etc/Rprofile.site RUN R -e 'install.packages("remotes")' -RUN R -e 'remotes::install_version("renv", version = "1.1.7")' +RUN R -e 'remotes::install_version("renv", version = "1.1.5")' COPY renv.lock renv.lock RUN --mount=type=cache,id=renv-cache,target=/root/.cache/R/renv R -e 'renv::restore()' WORKDIR /srv/shiny-server/ diff --git a/app_docker/app.R b/app_docker/app.R index fcc50395..9a740de5 100644 --- a/app_docker/app.R +++ b/app_docker/app.R @@ -1,7 +1,7 @@ ######## -#### Current file: /var/folders/9l/xbc19wxx0g79jdd2sf_0v291mhwh7f/T//Rtmpp0JgLn/file73e17b926733.R +#### Current file: /var/folders/9l/xbc19wxx0g79jdd2sf_0v291mhwh7f/T//RtmpBwniSk/file141b664b382fa.R ######## i18n_path <- here::here("translations") @@ -51,16 +51,6 @@ i18n <- shiny.i18n::Translator$new(translation_csvs_path = i18n_path) # i18n <- shiny.i18n::Translator$new(translation_csvs_path = here::here("inst/translations/")) i18n$set_translation_language("en") -## Global freesearchR vars -if (!"global_freesearchR" %in% ls(name = globalenv())) { - global_freesearchR <- list( - include_globalenv = FALSE, - data_limit_default = 1000, - data_limit_upper = 10000, - data_limit_lower = 1 - ) -} - ######## #### Current file: /Users/au301842/FreesearchR/app/functions.R @@ -72,7 +62,7 @@ if (!"global_freesearchR" %in% ls(name = globalenv())) { #### Current file: /Users/au301842/FreesearchR/R//app_version.R ######## -app_version <- function()'26.2.2' +app_version <- function()'26.1.2' ######## @@ -3726,7 +3716,7 @@ write_quarto <- function(data, ...) { ) } -write_rmd <- function(data, ..., params.args = NULL) { +write_rmd <- function(data, ..., params.args=NULL) { # Exports data to temporary location # # I assume this is more secure than putting it in the www folder and deleting @@ -3741,10 +3731,7 @@ write_rmd <- function(data, ..., params.args = NULL) { ## Ref: https://github.com/quarto-dev/quarto-cli/discussions/4041 ## Outputs to the same as the .qmd file rmarkdown::render( - params = modifyList( - list(data.file = "web_data.rds", version = app_version()), - params.args - ), + params = modifyList(list(data.file = "web_data.rds",version=app_version()),params.args), # execute_params = list(data.file = temp), ... ) @@ -3812,7 +3799,12 @@ argsstring2list <- function(string) { factorize <- function(data, vars) { if (!is.null(vars)) { data |> - dplyr::mutate(dplyr::across(dplyr::all_of(vars), REDCapCAST::as_factor)) + dplyr::mutate( + dplyr::across( + dplyr::all_of(vars), + REDCapCAST::as_factor + ) + ) } else { data } @@ -3845,30 +3837,32 @@ dummy_Imports <- function() { #' @returns data #' @export #' -file_export <- function(data, - output.format = c("df", "teal", "list"), - filename, - ...) { +file_export <- function(data, output.format = c("df", "teal", "list"), filename, ...) { output.format <- match.arg(output.format) filename <- gsub("-", "_", filename) if (output.format == "teal") { - out <- within(teal_data(), { - assign( - name, - value |> + out <- within( + teal_data(), + { + assign(name, value |> dplyr::bind_cols(.name_repair = "unique_quiet") |> - default_parsing() - ) - }, value = data, name = filename) + default_parsing()) + }, + value = data, + name = filename + ) datanames(out) <- filename } else if (output.format == "df") { out <- data |> default_parsing() } else if (output.format == "list") { - out <- list(data = data, name = filename) + out <- list( + data = data, + name = filename + ) out <- c(out, ...) } @@ -3903,8 +3897,7 @@ default_parsing <- function(data) { remove_nested_list() |> REDCapCAST::parse_data() |> REDCapCAST::as_factor() |> - REDCapCAST::numchar2fct(numeric.threshold = 8, - character.throshold = 10) |> + REDCapCAST::numchar2fct(numeric.threshold = 8, character.throshold = 10) |> REDCapCAST::as_logical() |> REDCapCAST::fct_drop() @@ -3968,11 +3961,9 @@ remove_empty_attr <- function(data) { #' @examples #' data.frame(a = 1:10, b = NA, c = c(2, NA)) |> remove_empty_cols(cutoff = .5) remove_empty_cols <- function(data, cutoff = .7) { - filter <- apply(X = data, - MARGIN = 2, - FUN = \(.x) { - sum(as.numeric(!is.na(.x))) / length(.x) - }) >= cutoff + filter <- apply(X = data, MARGIN = 2, FUN = \(.x){ + sum(as.numeric(!is.na(.x))) / length(.x) + }) >= cutoff data[filter] } @@ -4032,25 +4023,14 @@ missing_fraction <- function(data) { #' sample(c(1:8, NA), 20, TRUE) #' ) |> data_description() data_description <- function(data, data_text = "Data") { - data <- if (shiny::is.reactive(data)) - data() - else - data + data <- if (shiny::is.reactive(data)) data() else data n <- nrow(data) n_var <- ncol(data) n_complete <- sum(complete.cases(data)) p_complete <- signif(100 * n_complete / n, 3) - if (is.null(data)) { - i18n$t("No data present.") - } else { - glue::glue( - i18n$t( - "{data_text} has {n} observations and {n_var} variables, with {n_complete} ({p_complete} %) complete cases." - ) - ) - } + glue::glue(i18n$t("{data_text} has {n} observations and {n_var} variables, with {n_complete} ({p_complete} %) complete cases.")) # sprintf( # "%s has %s observations and %s variables, with %s (%s%%) complete cases.", # data_text, @@ -4159,8 +4139,7 @@ if_not_missing <- function(data, default = NULL) { #' ) |> merge_expression() merge_expression <- function(data) { Reduce( - f = function(x, y) - rlang::expr(!!x %>% !!y), + f = function(x, y) rlang::expr(!!x %>% !!y), x = data ) } @@ -4184,8 +4163,7 @@ merge_expression <- function(data) { pipe_string <- function(data, collapse = "|>\n") { if (is.list(data)) { Reduce( - f = function(x, y) - glue::glue("{x}{collapse}{y}"), + f = function(x, y) glue::glue("{x}{collapse}{y}"), x = data ) } else { @@ -4209,15 +4187,10 @@ pipe_string <- function(data, collapse = "|>\n") { #' merge_expression() |> #' expression_string() expression_string <- function(data, assign.str = "") { - exp.str <- if (is.call(data)) - deparse(data) - else - data + exp.str <- if (is.call(data)) deparse(data) else data - out <- paste0(assign.str, gsub("%>%", "|>\n", paste(gsub( - '"', "'", paste(exp.str, collapse = "") - ), collapse = ""))) - out <- collapse_spaces(out, preserve_newlines = FALSE) + out <- paste0(assign.str, gsub("%>%", "|>\n", paste(gsub('"', "'", paste(exp.str, collapse = "")), collapse = ""))) + out <- collapse_spaces(out,preserve_newlines = FALSE) gsub("`", "", out) } @@ -4321,16 +4294,10 @@ remove_nested_list <- function(data) { #' rlang::expr(FreesearchR::set_column_label(label = !!ls3)) |> expression_string() set_column_label <- function(data, label, overwrite = TRUE) { purrr::imap(data, function(.data, .name) { - ls <- if (is.list(label)) - unlist(label) - else - label + ls <- if (is.list(label)) unlist(label) else label ls[ls == ""] <- NA if (.name %in% names(ls)) { - out <- REDCapCAST::set_attr(.data, - unname(ls[.name]), - attr = "label", - overwrite = overwrite) + out <- REDCapCAST::set_attr(.data, unname(ls[.name]), attr = "label", overwrite = overwrite) remove_empty_attr(out) } else { .data @@ -4381,8 +4348,11 @@ append_column <- function(data, column, name, index = "right") { } new_df <- setNames(data.frame(column), name) - list(data[seq_len(index - 1)], new_df, if (!index > ncol(data)) - data[index:ncol(data)]) |> + list( + data[seq_len(index - 1)], + new_df, + if (!index > ncol(data)) data[index:ncol(data)] + ) |> dplyr::bind_cols() } @@ -4407,7 +4377,7 @@ is_identical_to_previous <- function(data, no.name = TRUE) { lagged <- c(FALSE, data[seq_len(length(data) - 1)]) } - vapply(seq_len(length(data)), \(.x) { + vapply(seq_len(length(data)), \(.x){ if (isTRUE(no.name)) { identical(unname(lagged[.x]), unname(data[.x])) } else { @@ -4426,11 +4396,8 @@ is_identical_to_previous <- function(data, no.name = TRUE) { #' #' @examples #' c("foo bar", "fooBar21", "!!Foo'B'a-r", "foo_bar", "F OO bar") |> simple_snake() -simple_snake <- function(data) { - gsub("[\\s+]", - "_", - gsub("[^\\w\\s:-]", "", tolower(data), perl = TRUE), - perl = TRUE) +simple_snake <- function(data){ + gsub("[\\s+]","_",gsub("[^\\w\\s:-]", "", tolower(data), perl=TRUE), perl=TRUE) } #' Data type assessment. @@ -4467,8 +4434,7 @@ data_type <- function(data) { out <- "empty" } else if (l_unique < 2) { out <- "monotone" - } else if (any(c("factor", "logical") %in% cl_d) | - l_unique == 2) { + } else if (any(c("factor", "logical") %in% cl_d) | l_unique == 2) { if (identical("logical", cl_d) | l_unique == 2) { out <- "dichotomous" } else { @@ -4504,18 +4470,14 @@ data_type <- function(data) { #' data_types() data_types <- function() { list( - "empty" = list(descr = "Variable of all NAs", classes = "Any class"), - "monotone" = list(descr = "Variable with only one unique value", classes = - "Any class"), - "dichotomous" = list(descr = "Variable with only two unique values", classes = - "Any class"), - "categorical" = list(descr = "Factor variable", classes = "factor (ordered or unordered)"), - "text" = list(descr = "Character variable", classes = "character"), - "datetime" = list(descr = "Variable of time, date or datetime values", classes = - "hms, Date, POSIXct and POSIXt"), - "continuous" = list(descr = "Numeric variable", classes = "numeric, integer or double"), - "unknown" = list(descr = "Anything not falling within the previous", classes = - "Any other class") + "empty" = list(descr="Variable of all NAs",classes="Any class"), + "monotone" = list(descr="Variable with only one unique value",classes="Any class"), + "dichotomous" = list(descr="Variable with only two unique values",classes="Any class"), + "categorical"= list(descr="Factor variable",classes="factor (ordered or unordered)"), + "text"= list(descr="Character variable",classes="character"), + "datetime"= list(descr="Variable of time, date or datetime values",classes="hms, Date, POSIXct and POSIXt"), + "continuous"= list(descr="Numeric variable",classes="numeric, integer or double"), + "unknown"= list(descr="Anything not falling within the previous",classes="Any other class") ) } @@ -4524,7 +4486,7 @@ data_types <- function() { #### Current file: /Users/au301842/FreesearchR/R//hosted_version.R ######## -hosted_version <- function()'v26.2.2-260223' +hosted_version <- function()'v26.1.2-260112' ######## @@ -4548,8 +4510,6 @@ html_dependency_FreesearchR <- function() { ######## - - #' @title Import data from an Environment #' #' @description Let the user select a dataset from its own environment or from a package's environment. @@ -4569,6 +4529,7 @@ import_globalenv_ui <- function(id, globalenv = TRUE, packages = datamods::get_data_packages(), title = TRUE) { + ns <- NS(id) choices <- list() @@ -4581,14 +4542,15 @@ import_globalenv_ui <- function(id, if (isTRUE(globalenv)) { selected <- "Global Environment" - select_label <- i18n$t("Select a dataset from your environment or sample dataset from a package.") } else { selected <- packages[1] - select_label <- i18n$t("Select a sample dataset from a package.") } if (isTRUE(title)) { - title <- tags$h4(i18n$t("Import a dataset from an environment"), class = "datamods-title") + title <- tags$h4( + i18n$t("Import a dataset from an environment"), + class = "datamods-title" + ) } tags$div( @@ -4615,13 +4577,14 @@ import_globalenv_ui <- function(id, # options = list(title = i18n$t("List of datasets...")), width = "100%" ), + tags$div( id = ns("import-placeholder"), shinyWidgets::alert( id = ns("import-result"), status = "info", tags$b(i18n$t("No data selected!")), - select_label, + i18n$t("Use a dataset from your environment or from the environment of a package."), dismissible = TRUE ) ), @@ -4635,14 +4598,12 @@ import_globalenv_ui <- function(id, #' @param btn_show_data Display or not a button to display data in a modal window if import is successful. -#' #' @param show_data_in Where to display data: in a `"popup"` or in a `"modal"` window. #' @param trigger_return When to update selected data: #' `"button"` (when user click on button) or #' `"change"` (each time user select a dataset in the list). #' @param return_class Class of returned data: `data.frame`, `data.table`, `tbl_df` (tibble) or `raw`. #' @param reset A `reactive` function that when triggered resets the data. -#' @param limit_data upper limit to imported data #' #' @export #' @@ -4656,17 +4617,16 @@ import_globalenv_server <- function(id, show_data_in = c("popup", "modal"), trigger_return = c("button", "change"), return_class = c("data.frame", "data.table", "tbl_df", "raw"), - reset = reactive(NULL), - limit_data = NULL) { + reset = reactive(NULL)) { + trigger_return <- match.arg(trigger_return) return_class <- match.arg(return_class) module <- function(input, output, session) { + ns <- session$ns imported_rv <- reactiveValues(data = NULL, name = NULL) - temporary_rv <- reactiveValues(data = NULL, - name = NULL, - status = NULL) + temporary_rv <- reactiveValues(data = NULL, name = NULL, status = NULL) observeEvent(reset(), { temporary_rv$data <- NULL @@ -4681,7 +4641,6 @@ import_globalenv_server <- function(id, }) observeEvent(input$env, { - # browser() if (identical(input$env, "Global Environment")) { choices <- datamods:::search_obj("data.frame") } else { @@ -4691,14 +4650,9 @@ import_globalenv_server <- function(id, choices <- i18n$t("No dataset here...") choicesOpt <- list(disabled = TRUE) } else { - choicesOpt <- list(subtext = get_dimensions(choices,filter_df=TRUE)) - # browser() - ## choices are corrected if GlobalEnv is not chosen - if (!identical(input$env, "Global Environment")) { - choices <- structure(names(choicesOpt$subtext), - package = attr(choices, "package")) - } - + choicesOpt <- list( + subtext = datamods:::get_dimensions(choices) + ) } temporary_rv$package <- attr(choices, "package") shinyWidgets::updatePickerInput( @@ -4709,8 +4663,7 @@ import_globalenv_server <- function(id, choicesOpt = choicesOpt, options = list( title = i18n$t("List of datasets..."), - "live-search" = TRUE - ) + "live-search" = TRUE) ) }) @@ -4719,9 +4672,7 @@ import_globalenv_server <- function(id, id = "import-result", status = "info", tags$b(i18n$t("No data selected!")), - i18n$t( - "Use a dataset from your environment or from the environment of a package." - ), + i18n$t("Use a dataset from your environment or from the environment of a package."), dismissible = TRUE ) ) @@ -4735,68 +4686,58 @@ import_globalenv_server <- function(id, - observeEvent(input$data, - { - if (!isTruthy(input$data)) { - datamods:::toggle_widget(inputId = "confirm", enable = FALSE) - datamods:::insert_alert( - selector = ns("import"), - status = "info", - tags$b(i18n$t("No data selected!")), - i18n$t( - "Use a dataset from your environment or from the environment of a package." - ) - ) - } else { - # browser() - name_df <- input$data + observeEvent(input$data, { + if (!isTruthy(input$data)) { + datamods:::toggle_widget(inputId = "confirm", enable = FALSE) + datamods:::insert_alert( + selector = ns("import"), + status = "info", + tags$b(i18n$t("No data selected!")), + i18n$t("Use a dataset from your environment or from the environment of a package.") + ) + } else { + name_df <- input$data - if (!is.null(temporary_rv$package)) { - attr(name_df, "package") <- temporary_rv$package - } + if (!is.null(temporary_rv$package)) { + attr(name_df, "package") <- temporary_rv$package + } - imported <- try(get_env_data(name_df), silent = TRUE) + imported <- try(get_env_data(name_df), silent = TRUE) - if (inherits(imported, "try-error") || - NROW(imported) < 1) { - datamods:::toggle_widget(inputId = "confirm", enable = FALSE) - datamods:::insert_error(mssg = i18n$t(attr(imported, "condition")$message)) - temporary_rv$status <- "error" - temporary_rv$data <- NULL - temporary_rv$name <- NULL - } else { - datamods:::toggle_widget(inputId = "confirm", enable = TRUE) - datamods:::insert_alert( - selector = ns("import"), - status = "success", - make_success_alert( - data = imported, - trigger_return = trigger_return, - btn_show_data = btn_show_data - ) - ) - pkg <- attr(name_df, "package") - if (!is.null(pkg)) { - name <- paste(pkg, input$data, sep = "::") - } else { - name <- input$data - } - name <- trimws(sub("\\(([^\\)]+)\\)", "", name)) - temporary_rv$status <- "success" - - temporary_rv$data <- limit_data_size(imported,limit = limit_data) - temporary_rv$name <- name - } - } - }, - ignoreInit = TRUE, - ignoreNULL = FALSE) + if (inherits(imported, "try-error") || NROW(imported) < 1) { + datamods:::toggle_widget(inputId = "confirm", enable = FALSE) + datamods:::insert_error(mssg = i18n$t(attr(imported, "condition")$message)) + temporary_rv$status <- "error" + temporary_rv$data <- NULL + temporary_rv$name <- NULL + } else { + datamods:::toggle_widget(inputId = "confirm", enable = TRUE) + datamods:::insert_alert( + selector = ns("import"), + status = "success", + datamods:::make_success_alert( + imported, + trigger_return = trigger_return, + btn_show_data = btn_show_data + ) + ) + pkg <- attr(name_df, "package") + if (!is.null(pkg)) { + name <- paste(pkg, input$data, sep = "::") + } else { + name <- input$data + } + name <- trimws(sub("\\(([^\\)]+)\\)", "", name)) + temporary_rv$status <- "success" + temporary_rv$data <- imported + temporary_rv$name <- name + } + } + }, ignoreInit = TRUE, ignoreNULL = FALSE) observeEvent(input$see_data, { - show_data(temporary_rv$data, - title = i18n$t("Imported data"), - type = show_data_in) + show_data(temporary_rv$data, title = i18n$t("Imported data"), type = show_data_in) }) observeEvent(input$confirm, { @@ -4820,7 +4761,10 @@ import_globalenv_server <- function(id, } } - moduleServer(id = id, module = module) + moduleServer( + id = id, + module = module + ) } @@ -4867,7 +4811,6 @@ get_data_packages <- function() { #' list_pkg_data("ggplot2") list_pkg_data <- function(pkg) { if (isTRUE(requireNamespace(pkg, quietly = TRUE))) { - # browser() list_data <- data(package = pkg, envir = environment())$results[, "Item"] list_data <- sort(list_data) attr(list_data, "package") <- pkg @@ -4885,27 +4828,17 @@ list_pkg_data <- function(pkg) { get_env_data <- function(obj, env = globalenv()) { pkg <- attr(obj, "package") re <- regexpr(pattern = "\\(([^\\)]+)\\)", text = obj) - obj_ <- substr( - x = obj, - start = re + 1, - stop = re + attr(re, "match.length") - 2 - ) - obj <- gsub(pattern = "\\s.*", - replacement = "", - x = obj) + obj_ <- substr(x = obj, start = re + 1, stop = re + attr(re, "match.length") - 2) + obj <- gsub(pattern = "\\s.*", replacement = "", x = obj) if (obj %in% ls(name = env)) { get(x = obj, envir = env) } else if (!is.null(pkg) && !identical(pkg, "")) { - res <- suppressWarnings(try(get(utils::data( - list = obj, - package = pkg, - envir = environment() - )), silent = TRUE)) + res <- suppressWarnings(try( + get(utils::data(list = obj, package = pkg, envir = environment())), silent = TRUE + )) if (!inherits(res, "try-error")) return(res) - data(list = obj_, - package = pkg, - envir = environment()) + data(list = obj_, package = pkg, envir = environment()) get(obj, envir = environment()) } else { NULL @@ -4913,23 +4846,16 @@ get_env_data <- function(obj, env = globalenv()) { } -#' Extension of the helper function from datamods -#' -#' @param objs objs -#' @param filter_df flag to only include data frames -#' -#' @returns vector of data frames with the package names as attr -get_dimensions <- function(objs,filter_df=TRUE) { - if (is.null(objs)){ +get_dimensions <- function(objs) { + if (is.null(objs)) return(NULL) - } dataframes_dims <- Map( f = function(name, pkg) { attr(name, "package") <- pkg tmp <- suppressWarnings(get_env_data(name)) if (is.data.frame(tmp)) { sprintf("%d obs. of %d variables", nrow(tmp), ncol(tmp)) - } else if (isFALSE(filter_df)) { + } else { i18n$t("Not a data.frame") } }, @@ -4964,18 +4890,8 @@ get_dimensions <- function(objs,filter_df=TRUE) { import_file_ui <- function(id, title = "", preview_data = TRUE, - file_extensions = c(".csv", - ".txt", - ".xls", - ".xlsx", - ".rds", - ".fst", - ".sas7bdat", - ".sav"), - layout_params = c("dropdown", "inline"), - limit_default = 10000, - limit_upper = 10000, - limit_lower = 0) { + file_extensions = c(".csv", ".txt", ".xls", ".xlsx", ".rds", ".fst", ".sas7bdat", ".sav"), + layout_params = c("dropdown", "inline")) { ns <- shiny::NS(id) if (!is.null(layout_params)) { @@ -4983,7 +4899,10 @@ import_file_ui <- function(id, } if (isTRUE(title)) { - title <- shiny::tags$h4("Import a file", class = "datamods-title") + title <- shiny::tags$h4( + "Import a file", + class = "datamods-title" + ) } @@ -5008,26 +4927,7 @@ import_file_ui <- function(id, size = "sm", width = "100%" ), - shiny::helpText( - phosphoricons::ph("info"), - i18n$t("if several use a comma (',') to separate them") - ) - ), - shiny::tagAppendChild( - shinyWidgets::numericInputIcon( - inputId = ns("size_limit"), - label = i18n$t("Maximum number of observations:"), - value = limit_default, - min = limit_lower, - max = limit_upper, - icon = list("n ="), - size = "sm", - width = "100%" - ), - shiny::helpText( - phosphoricons::ph("info"), - i18n$t("setting to 0 includes all") - ) + shiny::helpText(phosphoricons::ph("info"), i18n$t("if several use a comma (',') to separate them")) ) ), shiny::column( @@ -5043,7 +4943,10 @@ import_file_ui <- function(id, selectInputIcon( inputId = ns("encoding"), label = i18n$t("Encoding:"), - choices = c("UTF-8" = "UTF-8", "Latin1" = "latin1"), + choices = c( + "UTF-8" = "UTF-8", + "Latin1" = "latin1" + ), icon = phosphoricons::ph("text-aa"), size = "sm", width = "100%" @@ -5097,8 +5000,7 @@ import_file_ui <- function(id, datamods:::html_dependency_datamods(), title, file_ui, - if (identical(layout_params, "inline")) - params_ui, + if (identical(layout_params, "inline")) params_ui, shiny::tags$div( class = "hidden", id = ns("sheet-container"), @@ -5118,8 +5020,7 @@ import_file_ui <- function(id, shiny::tags$b(i18n$t("No file selected.")), # shiny::textOutput(ns("trans_format_text")), # This is the easiest solution, though not gramatically perfect - i18n$t("You can choose between these file types:"), - paste(file_extensions, collapse = ", "), + i18n$t("You can choose between these file types:"), paste(file_extensions, collapse = ", "), # sprintf("You can import %s files", paste(file_extensions, collapse = ", ")), dismissible = TRUE ) @@ -5152,7 +5053,8 @@ import_file_server <- function(id, show_data_in = c("popup", "modal"), trigger_return = c("button", "change"), return_class = c("data.frame", "data.table", "tbl_df", "raw"), - reset = reactive(NULL)) { + reset = reactive(NULL), + limit=100000) { read_fns <- list( ods = "import_ods", dta = "import_dta", @@ -5170,12 +5072,7 @@ import_file_server <- function(id, module <- function(input, output, session) { ns <- session$ns imported_rv <- shiny::reactiveValues(data = NULL, name = NULL) - temporary_rv <- shiny::reactiveValues( - data = NULL, - name = NULL, - status = NULL, - sheets = 1 - ) + temporary_rv <- shiny::reactiveValues(data = NULL, name = NULL, status = NULL, sheets = 1) shiny::observeEvent(reset(), { temporary_rv$data <- NULL @@ -5224,12 +5121,10 @@ import_file_server <- function(id, input$skip_rows, input$dec, input$encoding, - input$na_label, - input$size_limit + input$na_label ), { req(input$file) - req(input$size_limit) if (!all(input$sheet %in% temporary_rv$sheets)) { sheets <- 1 @@ -5271,17 +5166,16 @@ import_file_server <- function(id, datamods:::insert_alert( selector = ns("import"), status = "success", - make_success_alert( - data = imported, + datamods:::make_success_alert( + imported, trigger_return = trigger_return, btn_show_data = btn_show_data, - extra = if (isTRUE(input$preview_data)) - i18n$t("First five rows are shown below:") + extra = if (isTRUE(input$preview_data)) i18n$t("First five rows are shown below:") ) ) ## As a protective measure, the dataset size is capped at cell limit - imported <- limit_data_size(imported, limit = input$size_limit) + imported <- limit_data_size(imported,limit = limit) temporary_rv$status <- "success" temporary_rv$data <- imported @@ -5293,35 +5187,34 @@ import_file_server <- function(id, ) observeEvent(input$see_data, { - tryCatch({ - datamods:::show_data( - default_parsing(temporary_rv$data), - title = i18n$t("Imported data"), - type = show_data_in - ) - }, # warning = function(warn) { - # showNotification(warn, type = "warning") - # }, - error = function(err) { - showNotification(err, type = "err") - }) + tryCatch( + { + datamods:::show_data(default_parsing(temporary_rv$data), title = i18n$t("Imported data"), type = show_data_in) + }, + # warning = function(warn) { + # showNotification(warn, type = "warning") + # }, + error = function(err) { + showNotification(err, type = "err") + } + ) }) output$table <- toastui::renderDatagrid2({ req(temporary_rv$data) - tryCatch({ - toastui::datagrid( - data = setNames( - head(temporary_rv$data, 5), - make.names(names(temporary_rv$data), unique = TRUE) - ), - theme = "striped", - colwidths = "guess", - minBodyHeight = 250 - ) - }, error = function(err) { - showNotification(err, type = "err") - }) + tryCatch( + { + toastui::datagrid( + data = setNames(head(temporary_rv$data, 5), make.names(names(temporary_rv$data), unique = TRUE)), + theme = "striped", + colwidths = "guess", + minBodyHeight = 250 + ) + }, + error = function(err) { + showNotification(err, type = "err") + } + ) }) observeEvent(input$confirm, { @@ -5347,7 +5240,10 @@ import_file_server <- function(id, } } - moduleServer(id = id, module = module) + moduleServer( + id = id, + module = module + ) } # utils ------------------------------------------------------------------- @@ -5406,37 +5302,39 @@ import_delim <- function(file, skip, encoding, na.strings) { #' @export #' import_xls <- function(file, sheet, skip, na.strings) { - tryCatch({ - ## If sheet is null, this allows purrr::map to run - if (is.null(sheet)) - sheet <- 1 + tryCatch( + { + ## If sheet is null, this allows purrr::map to run + if (is.null(sheet)) sheet <- 1 - sheet |> - purrr::map(\(.x) { - readxl::read_excel( - path = file, - sheet = .x, - na = na.strings, - skip = skip, - .name_repair = "unique_quiet", - trim_ws = TRUE - ) + sheet |> + purrr::map(\(.x){ + readxl::read_excel( + path = file, + sheet = .x, + na = na.strings, + skip = skip, + .name_repair = "unique_quiet", + trim_ws = TRUE + ) - # openxlsx2::read_xlsx( - # file = file, - # sheet = .x, - # skip_empty_rows = TRUE, - # start_row = skip - 1, - # na.strings = na.strings - # ) - }) |> - purrr::reduce(dplyr::full_join) - }, # warning = function(warn) { - # showNotification(paste0(warn), type = "warning") - # }, - error = function(err) { - showNotification(paste0(err), type = "err") - }) + # openxlsx2::read_xlsx( + # file = file, + # sheet = .x, + # skip_empty_rows = TRUE, + # start_row = skip - 1, + # na.strings = na.strings + # ) + }) |> + purrr::reduce(dplyr::full_join) + }, + # warning = function(warn) { + # showNotification(paste0(warn), type = "warning") + # }, + error = function(err) { + showNotification(paste0(err), type = "err") + } + ) } @@ -5446,25 +5344,27 @@ import_xls <- function(file, sheet, skip, na.strings) { #' @export #' import_ods <- function(file, sheet, skip, na.strings) { - tryCatch({ - if (is.null(sheet)) - sheet <- 1 - sheet |> - purrr::map(\(.x) { - readODS::read_ods( - path = file, - sheet = .x, - skip = skip, - na = na.strings - ) - }) |> - purrr::reduce(dplyr::full_join) - }, # warning = function(warn) { - # showNotification(paste0(warn), type = "warning") - # }, - error = function(err) { - showNotification(paste0(err), type = "err") - }) + tryCatch( + { + if (is.null(sheet)) sheet <- 1 + sheet |> + purrr::map(\(.x){ + readODS::read_ods( + path = file, + sheet = .x, + skip = skip, + na = na.strings + ) + }) |> + purrr::reduce(dplyr::full_join) + }, + # warning = function(warn) { + # showNotification(paste0(warn), type = "warning") + # }, + error = function(err) { + showNotification(paste0(err), type = "err") + } + ) } #' @name import-file-type @@ -5473,7 +5373,10 @@ import_ods <- function(file, sheet, skip, na.strings) { #' @export #' import_dta <- function(file) { - haven::read_dta(file = file, .name_repair = "unique_quiet") + haven::read_dta( + file = file, + .name_repair = "unique_quiet" + ) } #' @name import-file-type @@ -5482,7 +5385,9 @@ import_dta <- function(file) { #' @export #' import_rds <- function(file) { - out <- readr::read_rds(file = file) + out <- readr::read_rds( + file = file + ) if (is.data.frame(out)) { out @@ -5557,17 +5462,7 @@ import_file_demo_app <- function() { width = 4, import_file_ui( id = "myid", - file_extensions = c( - ".csv", - ".tsv", - ".txt", - ".xls", - ".xlsx", - ".rds", - ".sas7bdat", - ".ods", - ".dta" - ), + file_extensions = c(".csv", ".tsv", ".txt", ".xls", ".xlsx", ".rds", ".sas7bdat", ".ods", ".dta"), layout_params = "dropdown" # "inline" # or "dropdown" ) ), @@ -5615,7 +5510,6 @@ import_file_demo_app <- function() { #' This function may act to guard a hosted app against very large data sets in #' addition to the file size limitations. #' The function will limit the data set by dropping rows. -#' If limit is set to 0 or NULL, the original data set is returned. #' #' #' @param data data.frame @@ -5626,24 +5520,19 @@ import_file_demo_app <- function() { #' #' @examples #' prod(dim(mtcars)) -#' limit_data_size(mtcars,2) +#' limit_data_size(mtcars) #' limit_data_size(mtcars,100) limit_data_size <- function(data, limit = NULL) { - ## Add security to reduce large datasets to n observations below limit. + ## Add security to only allow dataset of 100.000 cells ## Ideally this should only go for the hosted version - if (is.null(limit) || limit == 0) { + if (is.null(limit)){ return(data) } data_dim <- dim(data) - ## If the limit is below nrow, the first observations from the first row - ## is included for a very pessimistic selection. - ## A more optimistic selection would just use ceiling instead of floor. - if (limit < data_dim[2]) { - head(data, 1)[seq_len(limit)] - } else if (prod(data_dim) > limit) { + if (prod(data_dim) > limit) { head(data, floor(limit / data_dim[2])) } else { data @@ -5651,48 +5540,6 @@ limit_data_size <- function(data, limit = NULL) { } -#' @importFrom htmltools tagList tags -#' @importFrom shiny icon getDefaultReactiveDomain -make_success_alert <- function(data, - trigger_return, - btn_show_data, - extra = NULL, - session = shiny::getDefaultReactiveDomain()) { - if (identical(trigger_return, "button")) { - success_message <- tagList(tags$b( - phosphoricons::ph("check", weight = "bold"), - i18n$t("Data ready to be imported!") - ), - sprintf( - i18n$t("Data has %s obs. of %s variables."), - nrow(data), - ncol(data) - ), - extra) - } else { - success_message <- tagList(tags$b( - phosphoricons::ph("check", weight = "bold"), - i18n$t("Data successfully imported!") - ), - sprintf( - i18n$t("Data has %s obs. of %s variables."), - nrow(data), - ncol(data) - ), - extra) - } - if (isTRUE(btn_show_data)) { - success_message <- tagList(success_message, - tags$br(), - actionLink( - inputId = session$ns("see_data"), - label = tagList(phosphoricons::ph("table"), i18n$t("Click to see data")) - )) - } - return(success_message) -} - - ######## #### Current file: /Users/au301842/FreesearchR/R//landing_page_ui.R ######## @@ -5721,7 +5568,6 @@ landing_page_ui <- function(i18n) { i18n$t("Start with FreesearchR for basic data evaluation and analysis."), i18n$t("The app contains a selelct number of features and will guide you through key analyses."), i18n$t("When you need more advanced tools, you'll be prepared to use R directly."), - shiny::actionLink(inputId = "act_data",label = i18n$t("Start by loading data.")), style = "font-size: 1.2rem; color: #555;" ) ), @@ -5969,11 +5815,6 @@ landing_page_ui <- function(i18n) { #' @description #' All data.frames in the global environment will be accessible through the app. #' -#' @param include_globalenv flag to include global env (local data) as option -#' when loading data -#' @param data_limit_default default data set observations limit -#' @param data_limit_upper data set observations upper limit -#' @param data_limit_lower data set observations lower limit #' @param ... passed on to `shiny::runApp()` #' #' @returns shiny app @@ -5984,29 +5825,18 @@ landing_page_ui <- function(i18n) { #' data(mtcars) #' launch_FreesearchR(launch.browser = TRUE) #' } -launch_FreesearchR <- function(inlcude_globalenv = TRUE, - data_limit_default = 1000, - data_limit_upper = 100000, - data_limit_lower = 1, - ...) { - global_freesearchR <- list( - include_globalenv = include_globalenv, - data_limit_default = data_limit_default, - data_limit_upper = data_limit_upper, - data_limit_lower = data_limit_lower - ) - +launch_FreesearchR <- function(...){ appDir <- system.file("apps", "FreesearchR", package = "FreesearchR") if (appDir == "") { - stop("Could not find the app directory. Try re-installing `FreesearchR`.", - call. = FALSE) + stop("Could not find the app directory. Try re-installing `FreesearchR`.", call. = FALSE) } - a <- shiny::runApp(appDir = paste0(appDir, "/app.R"), ...) + a <- shiny::runApp(appDir = paste0(appDir,"/app.R"), ...) return(invisible(a)) } + ######## #### Current file: /Users/au301842/FreesearchR/R//missings-module.R ######## @@ -6022,49 +5852,45 @@ launch_FreesearchR <- function(inlcude_globalenv = TRUE, data_missings_ui <- function(id, ...) { ns <- shiny::NS(id) - list(bslib::layout_sidebar( - uiOutput(outputId = ns("feedback")), - sidebar = bslib::sidebar( - bslib::accordion( - id = ns("acc_mis"), - open = "acc_chars", - multiple = FALSE, - bslib::accordion_panel( - value = "acc_pan_mis", - title = "Settings", - icon = bsicons::bs_icon("gear"), - shiny::conditionalPanel( - condition = "output.missings == true", + list( + bslib::layout_sidebar( + sidebar = bslib::sidebar( + bslib::accordion( + id = ns("acc_mis"), + open = "acc_chars", + multiple = FALSE, + bslib::accordion_panel( + value = "acc_pan_mis", + title = "Settings", + icon = bsicons::bs_icon("gear"), shiny::uiOutput(ns("missings_method")), shiny::uiOutput(ns("missings_var")), - ns = ns - ), - shiny::helpText( - i18n$t( - "Evaluate missingness by either comparing missing values across variables (optionally grouped by af categorical or dichotomous variable) or compare variables grouped by the missing status (missing or not) of an outcome variable. If there is a significant difference i the missingness, this may cause a bias in you data and should be considered carefully interpreting the data and analyses as data may not be missing at random." + shiny::helpText(i18n$t("Evaluate missingness by either comparing missing values across variables (optionally grouped by af categorical or dichotomous variable) or compare variables grouped by the missing status (missing or not) of an outcome variable. If there is a significant difference i the missingness, this may cause a bias in you data and should be considered carefully interpreting the data and analyses as data may not be missing at random.")), + shiny::br(), + shiny::actionButton( + inputId = ns("act_miss"), + label = i18n$t("Evaluate"), + width = "100%", + icon = shiny::icon("calculator"), + disabled = FALSE ) ), - shiny::br(), - shiny::actionButton( - inputId = ns("act_miss"), - label = i18n$t("Evaluate"), - width = "100%", - icon = shiny::icon("calculator"), - disabled = TRUE + do.call( + bslib::accordion_panel, + c( + list( + title = "Download", + icon = bsicons::bs_icon("file-earmark-arrow-down") + ), + table_download_ui(id = ns("tbl_dwn"), title = NULL) + ) ) - ), - do.call(bslib::accordion_panel, c( - list( - title = "Download", - icon = bsicons::bs_icon("file-earmark-arrow-down") - ), - table_download_ui(id = ns("tbl_dwn"), title = NULL) - )) - ) - ), - ..., - gt::gt_output(outputId = ns("missings_table")) - )) + ) + ), + ..., + gt::gt_output(outputId = ns("missings_table")) + ) + ) } ## This should really just be rebuild to only contain a function @@ -6076,71 +5902,46 @@ data_missings_ui <- function(id, ...) { #' @name data-missings #' @returns shiny server module #' @export -data_missings_server <- function(id, data, max_level = 20, ...) { +data_missings_server <- function(id, + data, + max_level = 20, + ...) { shiny::moduleServer( id = id, module = function(input, output, session) { ns <- session$ns - datar <- if (is.reactive(data)) - data - else - reactive(data) + datar <- if (is.reactive(data)) data else reactive(data) - rv <- shiny::reactiveValues(data = NULL, - table = NULL, - feedback = NULL) - - ## Case with no missings - - info_alert <- shinyWidgets::alert( - status = "info", - phosphoricons::ph("question"), - i18n$t("You have provided a complete dataset with no missing values.") + rv <- shiny::reactiveValues( + data = NULL, + table = NULL ) - output$missings <- shiny::reactive({ - # shiny::req(data()) - any(is.na(datar())) - }) - shiny::outputOptions(output, "missings", suspendWhenHidden = FALSE) - - shiny::observeEvent(list(datar(), input$missings_method, input$missings_var), - { - # shiny::req(data()) - # browser() - if (!any(is.na(datar()))) { - rv$feedback <- info_alert - shiny::updateActionButton(inputId = "act_miss", disabled = TRUE) - rv$table <- NULL - output$missings_table <- gt::render_gt({ NULL }) - } else { - rv$feedback <- NULL - shiny::updateActionButton(inputId = "act_miss", disabled = FALSE) - } - },ignoreInit = TRUE) - - - output$feedback <- renderUI(rv$feedback) - ## Notes ## ## Code export is still missing ## Direct table export would be nice - shiny::observe(output$missings_method <- shiny::renderUI({ - shiny::req(datar()) - vectorSelectInput( - inputId = ns("missings_method"), - label = i18n$t("Analysis method for missingness overview"), - choices = setNames(c("predictors", "outcome"), c( - i18n$t("Overview of missings across variables"), - i18n$t( - "Overview of difference in variables by missing status in outcome" + shiny::observe( + output$missings_method <- shiny::renderUI({ + shiny::req(data()) + vectorSelectInput( + inputId = ns("missings_method"), + label = i18n$t("Analysis method for missingness overview"), + choices = setNames( + c( + "predictors", + "outcome" + ), + c( + i18n$t("Overview of missings across variables"), + i18n$t("Overview of difference in variables by missing status in outcome") + ) ) - )) - ) - })) + ) + }) + ) shiny::observe({ output$missings_var <- shiny::renderUI({ @@ -6149,7 +5950,7 @@ data_missings_server <- function(id, data, max_level = 20, ...) { # browser() if (input$missings_method == "predictors") { label <- i18n$t("Select a variable for grouped overview") - df <- data_type_filter(datar(), type = c("categorical", "dichotomous")) + df <- data_type_filter(data(), type = c("categorical", "dichotomous")) col_subset <- c("none", names(df)) } else { label <- i18n$t("Select outcome variable for overview") @@ -6167,91 +5968,94 @@ data_missings_server <- function(id, data, max_level = 20, ...) { }) - shiny::observeEvent(list(input$act_miss), { - shiny::req(datar()) - shiny::req(input$missings_var) - # browser() - df_tbl <- datar() - by_var <- input$missings_var + shiny::observeEvent( + list(input$act_miss), + { + shiny::req(datar()) + shiny::req(input$missings_var) + # browser() + df_tbl <- datar() + by_var <- input$missings_var - parameters <- list( - by_var = by_var, - max_level = max_level, - type = input$missings_method - ) + parameters <- list( + by_var = by_var, + max_level = max_level, + type = input$missings_method + ) - tryCatch({ - shiny::withProgress(message = i18n$t("Calculating. Hold tight for a moment.."), { - out <- do.call(compare_missings, modifyList(parameters, list(data = df_tbl))) - }) - }, error = function(err) { - showNotification(paste0("Error: ", err), type = "err") - }) + tryCatch( + { + shiny::withProgress(message = i18n$t("Calculating. Hold tight for a moment.."), { + out <- do.call( + compare_missings, + modifyList(parameters, list(data = df_tbl)) + ) + }) + }, + error = function(err) { + showNotification(paste0("Error: ", err), type = "err") + } + ) - if (is.null(input$missings_var) || - input$missings_var == "" || - !input$missings_var %in% names(datar()) || - input$missings_var == "none") { - # if (is.null(variabler()) || variabler() == "" || !variabler() %in% names(data()) || variabler() == "none") { - # tbl <- rv$data() - if (anyNA(datar())) { - if (input$missings_method == "predictors") { - title <- i18n$t("Overview of missing observations") + if (is.null(input$missings_var) || input$missings_var == "" || !input$missings_var %in% names(datar()) || input$missings_var == "none") { + # if (is.null(variabler()) || variabler() == "" || !variabler() %in% names(data()) || variabler() == "none") { + # tbl <- rv$data() + if (anyNA(datar())) { + if (input$missings_method == "predictors") { + title <- i18n$t("Overview of missing observations") + } else { + title <- i18n$t("No outcome measure chosen") + } } else { - title <- i18n$t("No outcome measure chosen") + title <- i18n$t("No missing observations") } } else { - title <- i18n$t("No missing observations") - } - } else { - ## Due to reactivity, the table updates too quickly. this mitigates that issue.. - if (input$missings_method == "predictors") { - title <- glue::glue( - i18n$t( - "Missing observations across variables grouped by **'{input$missings_var}'**" - ) - ) - } else { - title <- glue::glue( - i18n$t( - "Differences by missing vs non-missing observations in **'{input$missings_var}'**" - ) - ) + ## Due to reactivity, the table updates too quickly. this mitigates that issue.. + + + if (input$missings_var == "predictors") { + title <- glue::glue(i18n$t("Missings across variables by the variable **'{input$missings_var}'**")) + } else { + title <- glue::glue(i18n$t("Missing vs non-missing observations in the variable **'{input$missings_var}'**")) + } } + + attr(out, "tbl_title") <- title + + rv$data <- shiny::reactive(out) } + ) - attr(out, "tbl_title") <- title - - rv$data <- shiny::reactive(out) - }) - - shiny::observeEvent(list( - # input$act_miss - rv$data - ), { - output$missings_table <- gt::render_gt({ - shiny::req(rv$data) - # shiny::req(input$missings_var) - # browser() - if ("p.value" %in% names(rv$data()[["table_body"]])) { - tbl <- rv$data() |> - gtsummary::bold_p() - } else { - tbl <- rv$data() - } + shiny::observeEvent( + list( + # input$act_miss + rv$data + ), + { + output$missings_table <- gt::render_gt({ + shiny::req(rv$data) + # shiny::req(input$missings_var) + # browser() + if ("p.value" %in% names(rv$data()[["table_body"]])) { + tbl <- rv$data() |> + gtsummary::bold_p() + } else { + tbl <- rv$data() + } - out <- tbl |> - gtsummary::as_gt() |> - gt::tab_header(title = gt::md(attr(tbl, "tbl_title"))) + out <- tbl |> + gtsummary::as_gt() |> + gt::tab_header(title = gt::md(attr(tbl, "tbl_title"))) - attr(out, "strat_var") <- input$missings_var + attr(out, "strat_var") <- input$missings_var - rv$table <- out + rv$table <- out - out - }) - }) + out + }) + } + ) table_download_server( @@ -6267,20 +6071,25 @@ data_missings_server <- function(id, data, max_level = 20, ...) { missing_demo_app <- function() { - ui <- do.call(bslib::page, c( - list( - title = i18n$t("Missings"), - icon = bsicons::bs_icon("x-circle") - ), - data_missings_ui(id = "data"), - gt::gt_output("table_p") - )) + ui <- do.call( + bslib::page, + c( + list( + title = i18n$t("Missings"), + icon = bsicons::bs_icon("x-circle") + ), + data_missings_ui(id = "data"), + gt::gt_output("table_p") + ) + ) server <- function(input, output, session) { data_demo <- mtcars data_demo[sample(1:32, 10), "cyl"] <- NA data_demo[sample(1:32, 8), "vs"] <- NA - rv <- shiny::reactiveValues(table = NULL) + rv <- shiny::reactiveValues( + table = NULL + ) rv$table <- data_missings_server(id = "data", data = data_demo) @@ -6314,15 +6123,17 @@ missing_demo_app <- function() { #' @returns gtsummary list object #' @export #' -compare_missings <- function(data, - by_var, - max_level = 20, - type = c("predictors", "outcome")) { +compare_missings <- function( + data, + by_var, + max_level = 20, + type = c("predictors", "outcome") +) { type <- match.arg(type) if (!is.null(by_var) && by_var != "" && by_var %in% names(data)) { data <- data |> - lapply(\(.x) { + lapply(\(.x){ if (is.factor(.x)) { cut_var(.x, breaks = 20, type = "top") } else { @@ -6366,7 +6177,7 @@ compare_missings <- function(data, missings_logic_across <- function(data, exclude = NULL) { # This function includes a approach way to preserve variable labels names(data) |> - lapply(\(.x) { + lapply(\(.x){ # browser() # Saving original labels lab <- REDCapCAST::get_attr(data[[.x]], attr = "label") @@ -6377,12 +6188,7 @@ missings_logic_across <- function(data, exclude = NULL) { } if (!is.na(lab)) { # Restoring original labels, if not NA - REDCapCAST::set_attr( - data = out, - label = lab, - attr = "label", - overwrite = TRUE - ) + REDCapCAST::set_attr(data = out, label = lab, attr = "label", overwrite = TRUE) } else { out } @@ -10590,6 +10396,7 @@ language_choices <- function() { } + ######## #### Current file: /Users/au301842/FreesearchR/R//ui_elements.R ######## @@ -10621,7 +10428,7 @@ ui_elements <- function(selection) { ## Default just output "NULL" ## This could probably be achieved more legantly, but this works. dev_banner(), - landing_page_ui(i18n = i18n), + landing_page_ui(i18n=i18n), # shiny::column(width = 2), # shiny::column( # width = 8, @@ -10664,11 +10471,7 @@ ui_elements <- function(selection) { ), # shiny::tags$script('document.querySelector("#source div").style.width = "100%"'), ## Update this to change depending on run locally or hosted - shiny::helpText( - i18n$t( - "Upload a file, get data directly from REDCap or use local or sample data." - ) - ), + shiny::helpText(i18n$t("Upload a file, get data directly from REDCap or use local or sample data.")), shiny::br(), shiny::br(), shiny::conditionalPanel( @@ -10677,11 +10480,7 @@ ui_elements <- function(selection) { id = "file_import", layout_params = "dropdown", # title = "Choose a datafile to upload", - file_extensions = c(".csv", ".tsv", ".txt", ".xls", ".xlsx", ".rds", ".ods", ".dta"), - limit_default = global_freesearchR$data_limit_default, - limit_lower = global_freesearchR$data_limit_lower, - limit_upper = global_freesearchR$data_limit_upper - + file_extensions = c(".csv", ".tsv", ".txt", ".xls", ".xlsx", ".rds", ".ods", ".dta") ) ), shiny::conditionalPanel( @@ -10694,15 +10493,17 @@ ui_elements <- function(selection) { # shiny::HTML(i18n$t("

The FreesearchR app only stores data for analyses, but please only use with sensitive data when running locally. Read more here

")), # dismissible = TRUE # ), - m_redcap_readUI(id = "redcap_import", title = "") + m_redcap_readUI( + id = "redcap_import", + title = "" + ) ), shiny::conditionalPanel( condition = "input.source=='env'", import_globalenv_ui( id = "env", title = NULL, - packages = c("NHANES", "stRoke", "datasets", "MASS"), - globalenv = global_freesearchR$include_globalenv + packages = c("NHANES", "stRoke", "datasets", "MASS") ) ), # shiny::conditionalPanel( @@ -10738,11 +10539,7 @@ ui_elements <- function(selection) { format = shinyWidgets::wNumbFormat(decimals = 0), color = datamods:::get_primary_color() ), - shiny::helpText( - i18n$t( - "At 0, only complete variables are included; at 100, all variables are included." - ) - ), + shiny::helpText(i18n$t("At 0, only complete variables are included; at 100, all variables are included.")), shiny::br() ), shiny::column( @@ -10791,9 +10588,7 @@ ui_elements <- function(selection) { width = 9, shiny::uiOutput(outputId = "data_info", inline = TRUE), shiny::tags$p( - i18n$t( - "Below you find a summary table for quick insigths, and on the right you can visualise data classes, browse observations and apply different data filters." - ) + i18n$t("Below you find a summary table for quick insigths, and on the right you can visualise data classes, browse observations and apply different data filters.") ) ), shiny::column( @@ -10829,18 +10624,16 @@ ui_elements <- function(selection) { shiny::column( width = 3, shiny::tags$h6(i18n$t("Filter data types")), - shiny::uiOutput(outputId = "column_filter"), - ## This needs to run in server for translation - shiny::helpText( - "Read more on how ", - tags$a( - "data types", - href = "https://agdamsbo.github.io/FreesearchR/articles/data-types.html", - target = "_blank", - rel = "noopener noreferrer" - ), - " are defined." + shiny::uiOutput( + outputId = "column_filter" ), + ## This needs to run in server for translation + shiny::helpText("Read more on how ", tags$a( + "data types", + href = "https://agdamsbo.github.io/FreesearchR/articles/data-types.html", + target = "_blank", + rel = "noopener noreferrer" + ), " are defined."), validation_ui("validation_var"), shiny::br(), shiny::br(), @@ -10860,26 +10653,21 @@ ui_elements <- function(selection) { title = i18n$t("Edit and create data"), icon = shiny::icon("file-pen"), tags$h3(i18n$t("Subset, rename and convert variables")), - fluidRow(shiny::column( - width = 9, shiny::tags$p( - i18n$t( - "Below, are several options for simple data manipulation like update variables by renaming, creating new labels (for nicer tables in the report) and changing variable classes (numeric, factor/categorical etc.)." - ), - i18n$t( - "There are more advanced options to modify factor/categorical variables as well as create new factor from an existing variable or new variables with R code. At the bottom you can restore the original data." - ), - i18n$t( - "Please note that data modifications are applied before any filtering." + fluidRow( + shiny::column( + width = 9, + shiny::tags$p( + i18n$t("Below, are several options for simple data manipulation like update variables by renaming, creating new labels (for nicer tables in the report) and changing variable classes (numeric, factor/categorical etc.)."), + i18n$t("There are more advanced options to modify factor/categorical variables as well as create new factor from an existing variable or new variables with R code. At the bottom you can restore the original data."), + i18n$t("Please note that data modifications are applied before any filtering.") ) ) - )), + ), update_variables_ui("modal_variables"), shiny::tags$br(), shiny::tags$br(), shiny::tags$h4(i18n$t("Advanced data manipulation")), - shiny::tags$p( - i18n$t("Below options allow more advanced varaible manipulations.") - ), + shiny::tags$p(i18n$t("Below options allow more advanced varaible manipulations.")), shiny::tags$br(), shiny::tags$br(), shiny::fluidRow( @@ -10891,9 +10679,7 @@ ui_elements <- function(selection) { width = "100%" ), shiny::tags$br(), - shiny::helpText( - i18n$t("Reorder or rename the levels of factor/categorical variables.") - ), + shiny::helpText(i18n$t("Reorder or rename the levels of factor/categorical variables.")), shiny::tags$br(), shiny::tags$br() ), @@ -10905,11 +10691,7 @@ ui_elements <- function(selection) { width = "100%" ), shiny::tags$br(), - shiny::helpText( - i18n$t( - "Create factor/categorical variable from a continous variable (number/date/time)." - ) - ), + shiny::helpText(i18n$t("Create factor/categorical variable from a continous variable (number/date/time).")), shiny::tags$br(), shiny::tags$br() ), @@ -10921,9 +10703,7 @@ ui_elements <- function(selection) { width = "100%" ), shiny::tags$br(), - shiny::helpText(i18n$t( - "Split a text column by a recognised delimiter." - )), + shiny::helpText(i18n$t("Split a text column by a recognised delimiter.")), shiny::tags$br(), shiny::tags$br() ), @@ -10935,18 +10715,16 @@ ui_elements <- function(selection) { width = "100%" ), shiny::tags$br(), - shiny::helpText(i18n$t( - "Create a new variable based on an R-expression." - )), + shiny::helpText(i18n$t("Create a new variable based on an R-expression.")), shiny::tags$br(), shiny::tags$br() ) ), tags$h4(i18n$t("Compare modified data to original")), shiny::tags$br(), - shiny::tags$p(i18n$t( - "Raw print of the original vs the modified data." - )), + shiny::tags$p( + i18n$t("Raw print of the original vs the modified data.") + ), shiny::tags$br(), shiny::fluidRow( shiny::column( @@ -10967,11 +10745,7 @@ ui_elements <- function(selection) { width = "100%" ), shiny::tags$br(), - shiny::helpText( - i18n$t( - "Reset to original imported dataset. Careful! There is no un-doing." - ) - ), + shiny::helpText(i18n$t("Reset to original imported dataset. Careful! There is no un-doing.")), shiny::tags$br(), shiny::tags$br() ) @@ -11017,11 +10791,7 @@ ui_elements <- function(selection) { # ), shiny::uiOutput("detail_level"), shiny::uiOutput("strat_var"), - shiny::helpText( - i18n$t( - "Only factor/categorical variables are available for stratification. Go back to the 'Prepare' tab to reclass a variable if it's not on the list." - ) - ), + shiny::helpText(i18n$t("Only factor/categorical variables are available for stratification. Go back to the 'Prepare' tab to reclass a variable if it's not on the list.")), shiny::conditionalPanel( condition = "input.strat_var!='none'", shiny::radioButtons( @@ -11029,7 +10799,10 @@ ui_elements <- function(selection) { label = i18n$t("Compare strata?"), selected = "no", inline = TRUE, - choices = list("No" = "no", "Yes" = "yes") + choices = list( + "No" = "no", + "Yes" = "yes" + ) ), # shiny::helpText(i18n$t("Option to perform statistical comparisons between strata in baseline table.")), shiny::br(), @@ -11038,7 +10811,10 @@ ui_elements <- function(selection) { label = i18n$t("Include group differences"), selected = "no", inline = TRUE, - choices = list("No" = "no", "Yes" = "yes") + choices = list( + "No" = "no", + "Yes" = "yes" + ) ) ), shiny::br(), @@ -11049,9 +10825,7 @@ ui_elements <- function(selection) { icon = shiny::icon("calculator"), disabled = TRUE ), - shiny::helpText(i18n$t( - "Press 'Evaluate' to create the comparison table." - )) + shiny::helpText(i18n$t("Press 'Evaluate' to create the comparison table.")) ) ) ), @@ -11073,11 +10847,7 @@ ui_elements <- function(selection) { title = "Settings", icon = bsicons::bs_icon("bounding-box"), shiny::uiOutput("outcome_var_cor"), - shiny::helpText( - i18n$t( - "To avoid evaluating the correlation of the outcome variable, this can be excluded from the plot or select 'none'." - ) - ), + shiny::helpText(i18n$t("To avoid evaluating the correlation of the outcome variable, this can be excluded from the plot or select 'none'.")), shiny::br(), shinyWidgets::noUiSliderInput( inputId = "cor_cutoff", @@ -11089,22 +10859,24 @@ ui_elements <- function(selection) { format = shinyWidgets::wNumbFormat(decimals = 2), color = datamods:::get_primary_color() ), - shiny::helpText(i18n$t( - "Set the cut-off for considered 'highly correlated'." - )) + shiny::helpText(i18n$t("Set the cut-off for considered 'highly correlated'.")) ) ) ), data_correlations_ui(id = "correlations", height = 600) ) ), - do.call(bslib::nav_panel, c( - list( - title = i18n$t("Missings"), - icon = bsicons::bs_icon("x-circle") - ), - data_missings_ui(id = "missingness", validation_ui("validation_mcar")) - )) + do.call( + bslib::nav_panel, + c( + list( + title = i18n$t("Missings"), + icon = bsicons::bs_icon("x-circle") + ), + data_missings_ui(id = "missingness", + validation_ui("validation_mcar")) + ) + ) ), ############################################################################## ######### @@ -11139,7 +10911,10 @@ ui_elements <- function(selection) { title = i18n$t("Regression"), icon = shiny::icon("calculator"), value = "nav_analyses", - do.call(bslib::navset_card_tab, regression_ui("regression")) + do.call( + bslib::navset_card_tab, + regression_ui("regression") + ) ), ############################################################################## ######### @@ -11161,11 +10936,7 @@ ui_elements <- function(selection) { shiny::column( width = 6, shiny::h4(i18n$t("Report")), - shiny::helpText( - i18n$t( - "Choose your favourite output file format for further work, and download, when the analyses are done." - ) - ), + shiny::helpText(i18n$t("Choose your favourite output file format for further work, and download, when the analyses are done.")), shiny::br(), shiny::br(), shiny::selectInput( @@ -11193,9 +10964,7 @@ ui_elements <- function(selection) { shiny::column( width = 6, shiny::h4("Data"), - shiny::helpText( - "Choose your favourite output data format to download the modified data." - ), + shiny::helpText("Choose your favourite output data format to download the modified data."), shiny::br(), shiny::br(), shiny::selectInput( @@ -11222,27 +10991,16 @@ ui_elements <- function(selection) { shiny::br(), shiny::br(), shiny::h4("Code snippets"), - shiny::tags$p( - "Below are the code bits used to create the final data set and the main analyses." + shiny::tags$p("Below are the code bits used to create the final data set and the main analyses."), + shiny::tags$p("This can be used as a starting point for learning to code and for reproducibility."), + shiny::tagList( + lapply( + paste0("code_", c( + "import", "format", "data", "variables", "filter", "table1", "univariable", "multivariable" + )), + \(.x)shiny::htmlOutput(outputId = .x) + ) ), - shiny::tags$p( - "This can be used as a starting point for learning to code and for reproducibility." - ), - shiny::tagList(lapply( - paste0( - "code_", - c( - "import", - "format", - "data", - "variables", - "filter", - "table1", - "univariable", - "multivariable" - ) - ), \(.x)shiny::htmlOutput(outputId = .x) - )), shiny::tags$br(), shiny::br() ), @@ -11258,8 +11016,7 @@ ui_elements <- function(selection) { # shiny::img(shiny::icon("book")), shiny::tags$a( href = "https://redcap.au.dk/surveys/?s=JPCLPTXYDKFA8DA8", - "Feedback", - shiny::icon("arrow-up-right-from-square"), + "Feedback", shiny::icon("arrow-up-right-from-square"), target = "_blank", rel = "noopener noreferrer" ) @@ -11273,8 +11030,7 @@ ui_elements <- function(selection) { # shiny::img(shiny::icon("book")), shiny::tags$a( href = "https://agdamsbo.github.io/FreesearchR/", - "Docs", - shiny::icon("arrow-up-right-from-square"), + "Docs", shiny::icon("arrow-up-right-from-square"), target = "_blank", rel = "noopener noreferrer" ) @@ -11383,10 +11139,7 @@ update_factor_ui <- function(id) { ), actionButton( inputId = ns("create"), - label = tagList( - phosphoricons::ph("arrow-clockwise"), - i18n$t("Update factor variable") - ), + label = tagList(phosphoricons::ph("arrow-clockwise"), i18n$t("Update factor variable")), class = "btn-outline-primary" ) ), @@ -11405,136 +11158,154 @@ update_factor_ui <- function(id) { #' #' @rdname update-factor update_factor_server <- function(id, data_r = reactive(NULL)) { - moduleServer(id, function(input, output, session) { - rv <- reactiveValues(data = NULL, data_grid = NULL) + moduleServer( + id, + function(input, output, session) { + rv <- reactiveValues(data = NULL, data_grid = NULL) - bindEvent(observe({ - data <- data_r() - rv$data <- data - vars_factor <- vapply(data, is.factor, logical(1)) - vars_factor <- names(vars_factor)[vars_factor] - updateVirtualSelect( - inputId = "variable", - choices = vars_factor, - selected = if (isTruthy(input$variable)) - input$variable - else - vars_factor[1] - ) - }), data_r(), input$hidden) + bindEvent(observe({ + data <- data_r() + rv$data <- data + vars_factor <- vapply(data, is.factor, logical(1)) + vars_factor <- names(vars_factor)[vars_factor] + updateVirtualSelect( + inputId = "variable", + choices = vars_factor, + selected = if (isTruthy(input$variable)) input$variable else vars_factor[1] + ) + }), data_r(), input$hidden) - observeEvent(input$variable, { - data <- req(data_r()) - variable <- req(input$variable) - grid <- as.data.frame(table(data[[variable]])) - rv$data_grid <- grid - }) - - observeEvent(input$sort_levels, { - if (input$sort_levels %% 2 == 1) { - decreasing <- FALSE - label <- tagList(phosphoricons::ph("sort-descending"), - i18n$t("Sort by Levels")) - } else { - decreasing <- TRUE - label <- tagList(phosphoricons::ph("sort-ascending"), - i18n$t("Sort by Levels")) - } - updateActionButton(inputId = "sort_levels", label = label) - rv$data_grid <- rv$data_grid[order(rv$data_grid[[1]], decreasing = decreasing), ] - }) - - observeEvent(input$sort_occurrences, { - if (input$sort_occurrences %% 2 == 1) { - decreasing <- FALSE - label <- tagList(phosphoricons::ph("sort-descending"), - i18n$t("Sort by count")) - } else { - decreasing <- TRUE - label <- tagList(phosphoricons::ph("sort-ascending"), - i18n$t("Sort by count")) - } - updateActionButton(inputId = "sort_occurrences", label = label) - rv$data_grid <- rv$data_grid[order(rv$data_grid[[2]], decreasing = decreasing), ] - }) - - - output$grid <- renderDatagrid({ - req(rv$data_grid) - gridTheme <- getOption("datagrid.theme") - if (length(gridTheme) < 1) { - datamods:::apply_grid_theme() - } - on.exit(toastui::reset_grid_theme()) - data <- rv$data_grid - data <- add_var_toset(data, "Var1", "New label") - - grid <- datagrid( - data = data, - draggable = TRUE, - sortable = FALSE, - data_as_input = TRUE - ) - grid <- grid_columns( - grid, - columns = c("Var1", "Var1_toset", "Freq"), - header = c(i18n$t("Levels"), "New label", i18n$t("Count")) - ) - grid <- grid_colorbar( - grid, - column = "Freq", - label_outside = TRUE, - label_width = "30px", - background = "#D8DEE9", - bar_bg = datamods:::get_primary_color(), - from = c(0, max(rv$data_grid$Freq) + 1) - ) - grid <- toastui::grid_style_column(grid = grid, - column = "Var1_toset", - fontStyle = "italic") - grid <- toastui::grid_editor(grid = grid, - column = "Var1_toset", - type = "text") - grid - }) - - data_updated_r <- reactive({ - data <- req(data_r()) - variable <- req(input$variable) - grid <- req(input$grid_data) - - parameters <- list( - variable = variable, - new_variable = isTRUE(input$new_var) | - any(grid[["Var1_toset"]] == "New label"), - new_levels = as.character(grid[["Var1"]]), - new_labels = as.character(grid[["Var1_toset"]]), - ignore = "New label" - ) - - data <- tryCatch({ - rlang::exec(factor_new_levels_labels, - !!!modifyList(parameters, val = list(data = data))) - }, error = function(err) { - showNotification(paste( - "We encountered the following error creating the new factor:", - err - ), - type = "err") + observeEvent(input$variable, { + data <- req(data_r()) + variable <- req(input$variable) + grid <- as.data.frame(table(data[[variable]])) + rv$data_grid <- grid }) - # browser() - code <- rlang::call2("factor_new_levels_labels", !!!parameters, .ns = "FreesearchR") - attr(data, "code") <- code + observeEvent(input$sort_levels, { + if (input$sort_levels %% 2 == 1) { + decreasing <- FALSE + label <- tagList( + phosphoricons::ph("sort-descending"), + i18n$t("Sort by Levels") + ) + } else { + decreasing <- TRUE + label <- tagList( + phosphoricons::ph("sort-ascending"), + i18n$t("Sort by Levels") + ) + } + updateActionButton(inputId = "sort_levels", label = label) + rv$data_grid <- rv$data_grid[order(rv$data_grid[[1]], decreasing = decreasing), ] + }) - data - }) + observeEvent(input$sort_occurrences, { + if (input$sort_occurrences %% 2 == 1) { + decreasing <- FALSE + label <- tagList( + phosphoricons::ph("sort-descending"), + i18n$t("Sort by count") + ) + } else { + decreasing <- TRUE + label <- tagList( + phosphoricons::ph("sort-ascending"), + i18n$t("Sort by count") + ) + } + updateActionButton(inputId = "sort_occurrences", label = label) + rv$data_grid <- rv$data_grid[order(rv$data_grid[[2]], decreasing = decreasing), ] + }) - data_returned_r <- observeEvent(input$create, { - rv$data <- data_updated_r() - }) - return(reactive(rv$data)) - }) + + output$grid <- renderDatagrid({ + req(rv$data_grid) + gridTheme <- getOption("datagrid.theme") + if (length(gridTheme) < 1) { + datamods:::apply_grid_theme() + } + on.exit(toastui::reset_grid_theme()) + data <- rv$data_grid + data <- add_var_toset(data, "Var1", "New label") + + grid <- datagrid( + data = data, + draggable = TRUE, + sortable = FALSE, + data_as_input = TRUE + ) + grid <- grid_columns( + grid, + columns = c("Var1", "Var1_toset", "Freq"), + header = c(i18n$t("Levels"), "New label", i18n$t("Count")) + ) + grid <- grid_colorbar( + grid, + column = "Freq", + label_outside = TRUE, + label_width = "30px", + background = "#D8DEE9", + bar_bg = datamods:::get_primary_color(), + from = c(0, max(rv$data_grid$Freq) + 1) + ) + grid <- toastui::grid_style_column( + grid = grid, + column = "Var1_toset", + fontStyle = "italic" + ) + grid <- toastui::grid_editor( + grid = grid, + column = "Var1_toset", + type = "text" + ) + grid + }) + + data_updated_r <- reactive({ + data <- req(data_r()) + variable <- req(input$variable) + grid <- req(input$grid_data) + + parameters <- list( + variable = variable, + new_variable = isTRUE(input$new_var) | any(grid[["Var1_toset"]] == "New label"), + new_levels = as.character(grid[["Var1"]]), + new_labels = as.character(grid[["Var1_toset"]]), + ignore = "New label" + ) + + data <- tryCatch( + { + rlang::exec( + factor_new_levels_labels, + !!!modifyList(parameters, + val = list(data = data) + ) + ) + }, + error = function(err) { + showNotification(paste("We encountered the following error creating the new factor:", err), type = "err") + } + ) + + # browser() + code <- rlang::call2( + "factor_new_levels_labels", + !!!parameters, + .ns = "FreesearchR" + ) + attr(data, "code") <- code + + data + }) + + data_returned_r <- observeEvent(input$create, { + rv$data <- data_updated_r() + }) + return(reactive(rv$data)) + } + ) } #' Simple function to apply new levels and/or labels to factor @@ -11551,12 +11322,13 @@ update_factor_server <- function(id, data_r = reactive(NULL)) { #' data_n <- mtcars #' data_n$cyl <- factor(data_n$cyl) #' factor_new_levels_labels(data_n, "cyl", new_labels = c("four", "New label", "New label")) -factor_new_levels_labels <- function(data, - variable, - new_variable = TRUE, - new_levels = NULL, - new_labels = NULL, - ignore = "New label") { +factor_new_levels_labels <- function( + data, + variable, + new_variable = TRUE, + new_levels = NULL, + new_labels = NULL, + ignore = "New label") { if (!is.factor(data[[variable]])) { return(data) } @@ -11569,19 +11341,21 @@ factor_new_levels_labels <- function(data, new_labels <- labels(data[[variable]]) } - with_level <- factor(as.character(data[[variable]]), levels = new_levels) - with_label <- factor(with_level, - labels = ifelse(new_labels == "New label", new_levels, new_labels)) + with_level <- factor( + as.character(data[[variable]]), + levels = new_levels + ) + with_label <- factor( + with_level, + labels = ifelse(new_labels == "New label", new_levels, new_labels) + ) if (isTRUE(new_variable)) { append_column( data = data, column = with_label, - name = unique_names( - new = paste0(variable, "_updated"), - existing = names(data) - ) + name = unique_names(new = paste0(variable, "_updated"), existing = names(data)) ) } else { data[[variable]] <- with_label @@ -11590,6 +11364,7 @@ factor_new_levels_labels <- function(data, } + #' @inheritParams shiny::modalDialog #' @export #' @@ -11603,23 +11378,17 @@ modal_update_factor <- function(id, size = "l", footer = NULL) { ns <- NS(id) - showModal( - modalDialog( - title = tagList(title, datamods:::button_close_modal()), - update_factor_ui(id), - tags$div( - style = "display: none;", - textInput( - inputId = ns("hidden"), - label = NULL, - value = datamods:::genId() - ) - ), - easyClose = easyClose, - size = size, - footer = footer - ) - ) + showModal(modalDialog( + title = tagList(title, datamods:::button_close_modal()), + update_factor_ui(id), + tags$div( + style = "display: none;", + textInput(inputId = ns("hidden"), label = NULL, value = datamods:::genId()) + ), + easyClose = easyClose, + size = size, + footer = footer + )) } @@ -11638,11 +11407,10 @@ winbox_update_factor <- function(id, title = title, ui = tagList( update_factor_ui(id), - tags$div(style = "display: none;", textInput( - inputId = ns("hidden"), - label = NULL, - value = genId() - )) + tags$div( + style = "display: none;", + textInput(inputId = ns("hidden"), label = NULL, value = genId()) + ) ), options = modifyList( shinyWidgets::wbOptions(height = "615px", modal = TRUE), @@ -13139,7 +12907,7 @@ visual_summary <- function(data, legend.title = NULL, ylab = "Observations", ... ggplot2::theme_minimal() + ggplot2::theme(axis.text.x = ggplot2::element_text( angle = 45, - vjust = 0, hjust = 1 + vjust = 1, hjust = 1 )) + ggplot2::scale_fill_manual(values = l$colors) + ggplot2::labs(x = "", y = ylab) + @@ -13590,7 +13358,9 @@ server <- function(input, output, session) { ######### ############################################################################## - rv_alerts <- shiny::reactiveValues(redcap_alert = NULL) + rv_alerts <- shiny::reactiveValues( + redcap_alert = NULL + ) # output$your_lang <- renderPrint(input$browser_lang) @@ -13637,26 +13407,28 @@ server <- function(input, output, session) { # ), # selected = "file" # ) - shiny::updateSelectInput(inputId = "source", choices = setNames(c("file", "redcap", "env"), c( - i18n$t("File upload"), - i18n$t("REDCap server export"), - i18n$t("Local or sample data") - ))) + shiny::updateSelectInput( + inputId = "source", + choices = setNames( + c( + "file", "redcap", "env" + ), + c( + i18n$t("File upload"), + i18n$t("REDCap server export"), + i18n$t("Local or sample data") + ) + ) + ) # output$intro_text <- renderUI(includeHTML(i18n$t("www/intro.html"))) }) shiny::observeEvent(input$language_select, { - bslib::accordion_panel_update(id = "acc_chars", - title = i18n$t("Settings"), - target = "acc_pan_chars") - bslib::accordion_panel_update(id = "acc_cor", - title = i18n$t("Settings"), - target = "acc_pan_cor") - bslib::accordion_panel_update(id = "acc_mis", - title = i18n$t("Settings"), - target = "acc_pan_mis") + bslib::accordion_panel_update(id = "acc_chars", title = i18n$t("Settings"), target = "acc_pan_chars") + bslib::accordion_panel_update(id = "acc_cor", title = i18n$t("Settings"), target = "acc_pan_cor") + bslib::accordion_panel_update(id = "acc_mis", title = i18n$t("Settings"), target = "acc_pan_mis") }) @@ -13671,32 +13443,30 @@ server <- function(input, output, session) { ######### ############################################################################## - shiny::observeEvent(input$source, { - ## Alert rendered on server as links do not render if only on client - if (input$source == "redcap") { - rv_alerts$redcap_alert <- shinyWidgets::alert( - id = "redcap_warning", - status = "info", - shiny::tags$h2(i18n$t( - "Please be mindfull handling sensitive data" - )), - shiny::markdown( - i18n$t( - "The ***FreesearchR*** app only stores data for analyses, but please only use with sensitive data when running locally. [Read more here](https://agdamsbo.github.io/FreesearchR/#run-locally-on-your-own-machine)." - ) - ), - # shiny::HTML(i18n$t("

The FreesearchR app only stores data for analyses, but please only use with sensitive data when running locally. Read more here

")), - dismissible = FALSE - ) + shiny::observeEvent( + input$source, + { + ## Alert rendered on server as links do not render if only on client + if (input$source == "redcap") { + rv_alerts$redcap_alert <- shinyWidgets::alert( + id = "redcap_warning", + status = "info", + shiny::tags$h2(i18n$t("Please be mindfull handling sensitive data")), + shiny::markdown(i18n$t("The ***FreesearchR*** app only stores data for analyses, but please only use with sensitive data when running locally. [Read more here](https://agdamsbo.github.io/FreesearchR/#run-locally-on-your-own-machine).")), + # shiny::HTML(i18n$t("

The FreesearchR app only stores data for analyses, but please only use with sensitive data when running locally. Read more here

")), + dismissible = FALSE + ) + } } - }) + ) data_file <- import_file_server( id = "file_import", show_data_in = "popup", trigger_return = "change", - return_class = "data.frame" + return_class = "data.frame", ## Added data.frame size limit (number of cells), rows are dropped to fit + limit = 100000 ) shiny::observeEvent(data_file$data(), { @@ -13705,7 +13475,9 @@ server <- function(input, output, session) { rv$code <- modifyList(x = rv$code, list(import = data_file$code())) }) - from_redcap <- m_redcap_readServer(id = "redcap_import") + from_redcap <- m_redcap_readServer( + id = "redcap_import" + ) shiny::observeEvent(from_redcap$data(), { rv$data_temp <- from_redcap$data() @@ -13717,8 +13489,7 @@ server <- function(input, output, session) { id = "env", trigger_return = "change", btn_show_data = FALSE, - reset = reactive(input$hidden), - limit_data = global_freesearchR$data_limit_upper + reset = reactive(input$hidden) ) shiny::observeEvent(from_env$data(), { @@ -13738,19 +13509,18 @@ server <- function(input, output, session) { ) observeEvent(input$modal_initial_view, { - tryCatch({ - modal_visual_summary( - id = "initial_summary", - footer = NULL, - size = "xl", - title = i18n$t("Data classes and missing observations") - ) - }, error = function(err) { - showNotification(paste( - i18n$t("We encountered the following error showing missingness:"), - err - ), type = "err") - }) + tryCatch( + { + modal_visual_summary( + id = "initial_summary", + footer = NULL, + size = "xl", title = i18n$t("Data classes and missing observations") + ) + }, + error = function(err) { + showNotification(paste(i18n$t("We encountered the following error showing missingness:"), err), type = "err") + } + ) }) output$import_var <- shiny::renderUI({ @@ -13776,13 +13546,16 @@ server <- function(input, output, session) { shiny::observeEvent(input$source, { rv$data_temp <- NULL - rv$code <- modifyList(x = rv$code, list(import = NULL)) }) shiny::outputOptions(output, "data_loaded", suspendWhenHidden = FALSE) shiny::observeEvent( - eventExpr = list(input$import_var, input$complete_cutoff, rv$data_temp), + eventExpr = list( + input$import_var, + input$complete_cutoff, + rv$data_temp + ), handlerExpr = { shiny::req(rv$data_temp) shiny::req(input$import_var) @@ -13790,34 +13563,17 @@ server <- function(input, output, session) { temp_data <- rv$data_temp if (all(input$import_var %in% names(temp_data))) { temp_data <- temp_data |> dplyr::select(input$import_var) - } else { - rv$data_original <- temp_data <- NULL } - if (!is.null(temp_data)) { - rv$data_original <- temp_data |> - default_parsing() - } - - }, - ignoreNULL = FALSE - ) - - shiny::observeEvent( - eventExpr = list(input$import_var, input$complete_cutoff, rv$data_temp), - handlerExpr = { - shiny::req(rv$data_temp) - shiny::req(input$import_var) - # browser() + rv$data_original <- temp_data |> + default_parsing() rv$code$import <- rv$code$import |> expression_string(assign.str = "df <-") rv$code$format <- list( "df", - rlang::expr(dplyr::select(dplyr::all_of( - !!input$import_var - ))), + rlang::expr(dplyr::select(dplyr::all_of(!!input$import_var))), rlang::call2(.fn = "default_parsing", .ns = "FreesearchR") ) |> lapply(expression_string) |> @@ -13826,8 +13582,7 @@ server <- function(input, output, session) { rv$code$filter <- NULL rv$code$modify <- NULL - }, - ignoreNULL = FALSE + }, ignoreNULL = FALSE ) output$data_info_import <- shiny::renderUI({ @@ -13859,9 +13614,7 @@ server <- function(input, output, session) { }) shiny::observeEvent(list(rv$data_original, rv$data), { - if (is.null(rv$data_original) | - NROW(rv$data_original) == 0 | - is.null(rv$data) | !any(is_splittable(rv$data))) { + if (is.null(rv$data_original) | NROW(rv$data_original) == 0 | is.null(rv$data) | !any(is_splittable(rv$data))) { shiny::updateActionButton(inputId = "modal_string", disabled = TRUE) } else if (!is.null(rv$data) && any(is_splittable(rv$data))) { shiny::updateActionButton(inputId = "modal_string", disabled = FALSE) @@ -13875,23 +13628,30 @@ server <- function(input, output, session) { ######### ############################################################################## - shiny::observeEvent(eventExpr = list(rv$data_original), - handlerExpr = { - shiny::req(rv$data_original) + shiny::observeEvent( + eventExpr = list( + rv$data_original + ), + handlerExpr = { + shiny::req(rv$data_original) - rv$data <- rv$data_original - }) + rv$data <- rv$data_original + } + ) ## For now this solution work, but I would prefer to solve this with the above - shiny::observeEvent(input$reset_confirm, { - if (isTRUE(input$reset_confirm)) { - shiny::req(rv$data_original) - rv$data <- rv$data_original - rv$code$filter <- NULL - rv$code$variables <- NULL - rv$code$modify <- NULL - } - }, ignoreNULL = TRUE) + shiny::observeEvent(input$reset_confirm, + { + if (isTRUE(input$reset_confirm)) { + shiny::req(rv$data_original) + rv$data <- rv$data_original + rv$code$filter <- NULL + rv$code$variables <- NULL + rv$code$modify <- NULL + } + }, + ignoreNULL = TRUE + ) shiny::observeEvent(input$data_reset, { @@ -13920,10 +13680,15 @@ server <- function(input, output, session) { ######### Create factor - shiny::observeEvent(input$modal_cut, - modal_cut_variable("modal_cut", title = i18n$t("Create new factor"))) + shiny::observeEvent( + input$modal_cut, + modal_cut_variable("modal_cut", title = i18n$t("Create new factor")) + ) - data_modal_cut <- cut_variable_server(id = "modal_cut", data_r = shiny::reactive(rv$data)) + data_modal_cut <- cut_variable_server( + id = "modal_cut", + data_r = shiny::reactive(rv$data) + ) shiny::observeEvent(data_modal_cut(), { rv$data <- data_modal_cut() @@ -13939,29 +13704,43 @@ server <- function(input, output, session) { ) # data_modal_update <- datamods::update_factor_server( - data_modal_update <- update_factor_server(id = "modal_update", data_r = reactive(rv$data)) + data_modal_update <- update_factor_server( + id = "modal_update", + data_r = reactive(rv$data) + ) - shiny::observeEvent(data_modal_update(), { - shiny::removeModal() - rv$data <- data_modal_update() - rv$code$modify[[length(rv$code$modify) + 1]] <- attr(rv$data, "code") - }) + shiny::observeEvent( + data_modal_update(), + { + shiny::removeModal() + rv$data <- data_modal_update() + rv$code$modify[[length(rv$code$modify) + 1]] <- attr(rv$data, "code") + } + ) ######### Split string - shiny::observeEvent(input$modal_string, - modal_string_split( - id = "modal_string", - title = i18n$t("Split a character string by a common delimiter") - )) + shiny::observeEvent( + input$modal_string, + modal_string_split( + id = "modal_string", + title = i18n$t("Split a character string by a common delimiter") + ) + ) - data_modal_string <- string_split_server(id = "modal_string", data_r = reactive(rv$data)) + data_modal_string <- string_split_server( + id = "modal_string", + data_r = reactive(rv$data) + ) - shiny::observeEvent(data_modal_string(), { - shiny::removeModal() - rv$data <- data_modal_string() - rv$code$modify[[length(rv$code$modify) + 1]] <- attr(rv$data, "code") - }) + shiny::observeEvent( + data_modal_string(), + { + shiny::removeModal() + rv$data <- data_modal_string() + rv$code$modify[[length(rv$code$modify) + 1]] <- attr(rv$data, "code") + } + ) ######### Create column @@ -13969,19 +13748,21 @@ server <- function(input, output, session) { input$modal_column, modal_create_column( id = "modal_column", - footer = shiny::markdown( - i18n$t( - "This window is aimed at advanced users and require some *R*-experience!" - ) - ), + footer = shiny::markdown(i18n$t("This window is aimed at advanced users and require some *R*-experience!")), title = i18n$t("Create new variables") ) ) - data_modal_r <- create_column_server(id = "modal_column", data_r = reactive(rv$data)) - shiny::observeEvent(data_modal_r(), { - rv$data <- data_modal_r() - rv$code$modify[[length(rv$code$modify) + 1]] <- attr(rv$data, "code") - }) + data_modal_r <- create_column_server( + id = "modal_column", + data_r = reactive(rv$data) + ) + shiny::observeEvent( + data_modal_r(), + { + rv$data <- data_modal_r() + rv$code$modify[[length(rv$code$modify) + 1]] <- attr(rv$data, "code") + } + ) ######### Subset, rename, reclass @@ -14038,21 +13819,42 @@ server <- function(input, output, session) { # ), { if (!is.null(rv$data_filtered)) { - rv_validations$obs_filter <- make_validation(ls = validation_lib("obs_filter"), list(x = rv$data, y = rv$data_filtered)) + rv_validations$obs_filter <- make_validation( + ls = validation_lib("obs_filter"), + list( + x = rv$data, + y = rv$data_filtered + ) + ) } if (!is.null(rv$data_variables)) { - rv_validations$var_filter <- make_validation(ls = validation_lib("var_filter"), - list(x = rv$data, y = rv$data_variables)) + rv_validations$var_filter <- make_validation( + ls = validation_lib("var_filter"), + list( + x = rv$data, + y = rv$data_variables + ) + ) } if (!is.null(rv$data)) { - rv_validations$missings <- make_validation(ls = validation_lib("missings"), list(x = rv$data)) + rv_validations$missings <- make_validation( + ls = validation_lib("missings"), + list( + x = rv$data + ) + ) } if (!is.null(rv$corr_pairs())) { req(rv$corr_pairs()) - rv_validations$corr_pairs <- make_validation(ls = validation_lib("corr_pairs"), list(x = rv$corr_pairs)) + rv_validations$corr_pairs <- make_validation( + ls = validation_lib("corr_pairs"), + list( + x = rv$corr_pairs + ) + ) } # mcar_validate(data=rv$missings()[["_data"]],outcome = input$missings_var) @@ -14060,10 +13862,13 @@ server <- function(input, output, session) { req(rv$missings()) # req(input$missings_var) # browser() - rv_validations$mcar <- make_validation(ls = validation_lib("mcar"), list( - x = rv$missings()[["_data"]], - y = attr(rv$missings(), "strat_var") - )) + rv_validations$mcar <- make_validation( + ls = validation_lib("mcar"), + list( + x = rv$missings()[["_data"]], + y = attr(rv$missings(), "strat_var") + ) + ) } } ) @@ -14072,17 +13877,35 @@ server <- function(input, output, session) { ## Individually to display at point of interest ## and as a whole to display on the final download panel - shiny::observeEvent(rv_validations$obs_filter, { - validation_server(id = "validation_obs", data = rv_validations$obs_filter) - }) + shiny::observeEvent( + rv_validations$obs_filter, + { + validation_server( + id = "validation_obs", + data = rv_validations$obs_filter + ) + } + ) - shiny::observeEvent(rv_validations$var_filter, { - validation_server(id = "validation_var", data = rv_validations$var_filter) - }) + shiny::observeEvent( + rv_validations$var_filter, + { + validation_server( + id = "validation_var", + data = rv_validations$var_filter + ) + } + ) - shiny::observeEvent(rv_validations$mcar, { - validation_server(id = "validation_mcar", data = rv_validations$mcar) - }) + shiny::observeEvent( + rv_validations$mcar, + { + validation_server( + id = "validation_mcar", + data = rv_validations$mcar + ) + } + ) shiny::observeEvent( list( @@ -14093,54 +13916,65 @@ server <- function(input, output, session) { rv_validations$corr_pairs ), { - validation_server(id = "validation_all", data = rv_validations) + validation_server( + id = "validation_all", + data = rv_validations + ) } ) ######### Data filter # IDEAFilter has the least cluttered UI, but might have a License issue # Consider using shinyDataFilter, though not on CRAN - data_filter <- IDEAFilter::IDEAFilter( - "data_filter", + data_filter <- IDEAFilter::IDEAFilter("data_filter", data = shiny::reactive(rv$data_variables), verbose = TRUE ) - shiny::observeEvent(list( - shiny::reactive(rv$data_variables), - shiny::reactive(rv$data_original), - data_filter(), - # regression_vars(), - input$complete_cutoff - ), - { - ### Save filtered data - rv$data_filtered <- data_filter() + shiny::observeEvent( + list( + shiny::reactive(rv$data_variables), + shiny::reactive(rv$data_original), + data_filter(), + # regression_vars(), + input$complete_cutoff + ), + { + ### Save filtered data + rv$data_filtered <- data_filter() - ### Save filtered data - ### without empty factor levels - rv$list$data <- data_filter() |> - REDCapCAST::fct_drop() |> - (\(.x) { - .x[!sapply(.x, is.character)] - })() + ### Save filtered data + ### without empty factor levels + rv$list$data <- data_filter() |> + REDCapCAST::fct_drop() |> + (\(.x){ + .x[!sapply(.x, is.character)] + })() - ## This looks messy!! But it works as intended for now + ## This looks messy!! But it works as intended for now - out <- gsub("filter", "dplyr::filter", gsub("\\s{2,}", " ", paste0(capture.output( - attr(rv$data_filtered, "code") - ), collapse = " "))) + out <- gsub( + "filter", "dplyr::filter", + gsub( + "\\s{2,}", " ", + paste0( + capture.output(attr(rv$data_filtered, "code")), + collapse = " " + ) + ) + ) - out <- strsplit(out, "%>%") |> - unlist() |> - (\(.x) { - paste(c("df <- df", .x[-1], "REDCapCAST::fct_drop()"), collapse = "|> \n ") - })() + out <- strsplit(out, "%>%") |> + unlist() |> + (\(.x){ + paste(c("df <- df", .x[-1], "REDCapCAST::fct_drop()"), + collapse = "|> \n " + ) + })() - rv$code <- append_list(data = out, - list = rv$code, - index = "filter") - }) + rv$code <- append_list(data = out, list = rv$code, index = "filter") + } + ) ######### Data preview @@ -14157,18 +13991,14 @@ server <- function(input, output, session) { ) observeEvent(input$modal_browse, { - tryCatch({ - show_data( - REDCapCAST::fct_drop(rv$data_filtered), - title = i18n$t("Uploaded data overview"), - type = "modal" - ) - }, error = function(err) { - showNotification(paste( - i18n$t("We encountered the following error browsing your data:"), - err - ), type = "err") - }) + tryCatch( + { + show_data(REDCapCAST::fct_drop(rv$data_filtered), title = i18n$t("Uploaded data overview"), type = "modal") + }, + error = function(err) { + showNotification(paste(i18n$t("We encountered the following error browsing your data:"), err), type = "err") + } + ) }) visual_summary_server( @@ -14181,20 +14011,18 @@ server <- function(input, output, session) { ) observeEvent(input$modal_visual_overview, { - tryCatch({ - modal_visual_summary( - id = "visual_overview", - footer = i18n$t( - "Here is an overview of how your data is interpreted, and where data is missing. Use this information to consider if data is missing at random or if some observations are missing systematically wich may be caused by an observation bias." - ), - size = "xl" - ) - }, error = function(err) { - showNotification(paste( - i18n$t("We encountered the following error showing missingness:"), - err - ), type = "err") - }) + tryCatch( + { + modal_visual_summary( + id = "visual_overview", + footer = i18n$t("Here is an overview of how your data is interpreted, and where data is missing. Use this information to consider if data is missing at random or if some observations are missing systematically wich may be caused by an observation bias."), + size = "xl" + ) + }, + error = function(err) { + showNotification(paste(i18n$t("We encountered the following error showing missingness:"), err), type = "err") + } + ) }) output$original_str <- renderPrint({ @@ -14202,19 +14030,25 @@ server <- function(input, output, session) { }) output$modified_str <- renderPrint({ - str( - as.data.frame(rv$data_filtered) |> - REDCapCAST::set_attr(label = NULL, attr = "code") - ) + str(as.data.frame(rv$data_filtered) |> + REDCapCAST::set_attr( + label = NULL, + attr = "code" + )) }) ## Evaluation table/plots reset on data change ## This does not work (!?) - shiny::observeEvent(list(rv$data_filtered), { - shiny::req(rv$data_filtered) + shiny::observeEvent( + list( + rv$data_filtered + ), + { + shiny::req(rv$data_filtered) - rv$list$table1 <- NULL - }) + rv$list$table1 <- NULL + } + ) ############################################################################## @@ -14272,12 +14106,7 @@ server <- function(input, output, session) { output$code_table1 <- shiny::renderUI({ shiny::req(rv$code$table1) - prismCodeBlock(paste0( - "#", - i18n$t("Data characteristics table"), - "\n", - rv$code$table1 - )) + prismCodeBlock(paste0("#", i18n$t("Data characteristics table"), "\n", rv$code$table1)) }) @@ -14285,7 +14114,7 @@ server <- function(input, output, session) { ## This is a very rewarding couple of lines marking new insights to dynamically rendering code shiny::observe({ shiny::req(rv$regression) - rv$regression()$regression$models |> purrr::imap(\(.x, .i) { + rv$regression()$regression$models |> purrr::imap(\(.x, .i){ output[[paste0("code_", tolower(.i))]] <- shiny::renderUI({ prismCodeBlock(paste0(paste("#", .i, "regression model\n"), .x$code_table)) }) @@ -14305,7 +14134,10 @@ server <- function(input, output, session) { selected = "none", label = i18n$t("Select variable to stratify baseline"), data = shiny::reactive(rv$data_filtered)(), - col_subset = c("none", names(rv$data_filtered)[unlist(lapply(rv$data_filtered, data_type)) %in% c("dichotomous", "categorical", "ordinal")]) + col_subset = c( + "none", + names(rv$data_filtered)[unlist(lapply(rv$data_filtered, data_type)) %in% c("dichotomous", "categorical", "ordinal")] + ) ) }) @@ -14330,9 +14162,14 @@ server <- function(input, output, session) { inputId = "detail_level", label = i18n$t("Level of detail"), selected = "minimal", - inline = TRUE, - choiceValues = c("minimal", "extended"), - choiceNames = c(i18n$t("Minimal"), i18n$t("Extensive")) + inline = TRUE, choiceValues = c( + "minimal", + "extended" + ), + choiceNames = c( + i18n$t("Minimal"), + i18n$t("Extensive") + ) ) }) @@ -14346,8 +14183,7 @@ server <- function(input, output, session) { output$data_info_nochar <- shiny::renderUI({ shiny::req(rv$list$data) - data_description(rv$list$data, - data_text = i18n$t("The dataset without text variables")) + data_description(rv$list$data, data_text = i18n$t("The dataset without text variables")) }) ## Only allow evaluation if the dataset has fewer then 50 variables @@ -14363,56 +14199,60 @@ server <- function(input, output, session) { # }) - shiny::observeEvent(list(input$act_eval), { - shiny::req(input$strat_var) - # shiny::req(input$baseline_theme) - shiny::req(input$detail_level) - shiny::req(rv$list$data) + shiny::observeEvent( + list( + input$act_eval + ), + { + shiny::req(input$strat_var) + # shiny::req(input$baseline_theme) + shiny::req(input$detail_level) + shiny::req(rv$list$data) - parameters <- list( - by.var = input$strat_var, - add.p = input$add_p == "yes", - add.overall = TRUE, - add.diff = input$add_diff == "yes", - # theme = input$baseline_theme, - detail_level = input$detail_level - ) + parameters <- list( + by.var = input$strat_var, + add.p = input$add_p == "yes", + add.overall = TRUE, + add.diff = input$add_diff == "yes", + # theme = input$baseline_theme, + detail_level = input$detail_level + ) - ## Limits maximum number of levels included in baseline table to 20. - data <- rv$list$data |> - lapply(\(.x) { - # browser() - if (is.factor(.x)) { - cut_var(.x, breaks = 20, type = "top") - } else { - .x - } - }) |> - dplyr::bind_cols() + ## Limits maximum number of levels included in baseline table to 20. + data <- rv$list$data |> + lapply(\(.x){ + # browser() + if (is.factor(.x)) { + cut_var(.x, breaks = 20, type = "top") + } else { + .x + } + }) |> + dplyr::bind_cols() - # Attempt to introduce error on analysing too large dataset - # tryCatch( - # { - # if (ncol(rv$list$data) > 10) { - # n_col <- ncol(rv$list$data) - # # stop(glue::glue(i18n$t("The data includes {n_col} variables. Please limit to 100."))) - # print("Please limit to 100.") - # } else { - shiny::withProgress(message = i18n$t("Creating the table. Hold on for a moment.."), { - rv$list$table1 <- rlang::exec(create_baseline, - !!!append_list(data, parameters, "data")) - }) - # } - # }, - # error = function(err) { - # showNotification(err, type = "err") - # } - # ) + # Attempt to introduce error on analysing too large dataset + # tryCatch( + # { + # if (ncol(rv$list$data) > 10) { + # n_col <- ncol(rv$list$data) + # # stop(glue::glue(i18n$t("The data includes {n_col} variables. Please limit to 100."))) + # print("Please limit to 100.") + # } else { + shiny::withProgress(message = i18n$t("Creating the table. Hold on for a moment.."), { + rv$list$table1 <- rlang::exec(create_baseline, !!!append_list(data, parameters, "data")) + }) + # } + # }, + # error = function(err) { + # showNotification(err, type = "err") + # } + # ) - rv$code$table1 <- glue::glue("FreesearchR::create_baseline(df,{list2str(parameters)})") - }) + rv$code$table1 <- glue::glue("FreesearchR::create_baseline(df,{list2str(parameters)})") + } + ) output$table1 <- gt::render_gt({ if (!is.null(rv$list$table1)) { @@ -14430,7 +14270,10 @@ server <- function(input, output, session) { selected = "none", data = rv$list$data, label = i18n$t("Select outcome variable"), - col_subset = c("none", colnames(rv$list$data)), + col_subset = c( + "none", + colnames(rv$list$data) + ), multiple = FALSE ) }) @@ -14440,8 +14283,7 @@ server <- function(input, output, session) { data = shiny::reactive({ shiny::req(rv$list$data) out <- rv$list$data - if (!is.null(input$outcome_var_cor) && - input$outcome_var_cor != "none") { + if (!is.null(input$outcome_var_cor) && input$outcome_var_cor != "none") { out <- out[!names(out) %in% input$outcome_var_cor] } out @@ -14452,8 +14294,10 @@ server <- function(input, output, session) { ## Missingness evaluation - rv$missings <- data_missings_server(id = "missingness", - data = shiny::reactive(rv$data_filtered)) + rv$missings <- data_missings_server( + id = "missingness", + data = shiny::reactive(rv$data_filtered) + ) @@ -14488,10 +14332,6 @@ server <- function(input, output, session) { ######### ############################################################################## - shiny::observeEvent(input$act_data, { - bslib::nav_select(id = "main_panel", selected = "nav_import") - }) - shiny::observeEvent(input$act_start, { bslib::nav_select(id = "main_panel", selected = "nav_prepare_overview") }) @@ -14545,33 +14385,31 @@ server <- function(input, output, session) { rv$list$missings <- rv$missings() shiny::withProgress(message = i18n$t("Generating the report. Hold on for a moment.."), { - tryCatch({ - out <- rv$list |> - write_rmd( - params.args = list( - regression.p = rv$list$regression$input$add_regression_p - ), - output_format = format, - input = file.path(getwd(), "www/report.rmd") - ) - # This only works locally and was disabled - # if (type == "docx") { - # ## This handles the the following MS Word warning: - # ## >> "This document contains fields that may refer to other files." - # out |> doconv::docx_update() - # } else { - # out - # } + tryCatch( + { + out <- rv$list |> + write_rmd( + params.args = list( + regression.p = rv$list$regression$input$add_regression_p + ), + output_format = format, + input = file.path(getwd(), "www/report.rmd") + ) + # This only works locally and was disabled + # if (type == "docx") { + # ## This handles the the following MS Word warning: + # ## >> "This document contains fields that may refer to other files." + # out |> doconv::docx_update() + # } else { + # out + # } - out - }, error = function(err) { - showNotification(paste0( - i18n$t( - "We encountered the following error creating your report: " - ), - err - ), type = "err") - }) + out + }, + error = function(err) { + showNotification(paste0(i18n$t("We encountered the following error creating your report: "), err), type = "err") + } + ) }) file.rename(paste0("www/report.", type), file) } @@ -14601,7 +14439,7 @@ server <- function(input, output, session) { session$onSessionEnded(function() { cat("Session Ended\n") files <- list.files("www/") - lapply(files[!files %in% files.to.keep], \(.x) { + lapply(files[!files %in% files.to.keep], \(.x){ unlink(paste0("www/", .x), recursive = FALSE) print(paste(.x, "deleted")) }) diff --git a/app_docker/renv.lock b/app_docker/renv.lock index dfbaf8cd..6841ab5e 100644 --- a/app_docker/renv.lock +++ b/app_docker/renv.lock @@ -1,6 +1,6 @@ { "R": { - "Version": "4.5.2", + "Version": "4.4.1", "Repositories": [ { "Name": "CRAN", @@ -169,9 +169,9 @@ }, "Hmisc": { "Package": "Hmisc", - "Version": "5.2-5", + "Version": "5.2-4", "Source": "Repository", - "Date": "2026-01-08", + "Date": "2025-10-02", "Title": "Harrell Miscellaneous", "Authors@R": "c(person(given = \"Frank E\", family = \"Harrell Jr\", role = c(\"aut\", \"cre\"), email = \"fh@fharrell.com\", comment = c(ORCID = \"0000-0002-8271-5493\")), person(given = \"Cole\", family = \"Beck\", role = c(\"ctb\"), email = \"cole.beck@vumc.org\" ), person(given = \"Charles\", family = \"Dupont\", role = \"ctb\") )", "Depends": [ @@ -537,28 +537,33 @@ }, "REDCapCAST": { "Package": "REDCapCAST", - "Version": "26.1.1", + "Version": "25.3.2", "Source": "Repository", "Title": "REDCap Metadata Casting and Castellated Data Handling", - "Authors@R": "c( person(\"Andreas Gammelgaard\", \"Damsbo\", email = \"andreas@gdamsbo.dk\", role = c(\"aut\", \"cre\"),comment = c(ORCID = \"0000-0002-7559-1154\")), person(\"Paul\", \"Egeler\", email = \"paulegeler@gmail.com\", role = c(\"aut\"), comment = c(ORCID = \"0000-0001-6948-9498\")))", + "Authors@R": "c( person(\"Andreas Gammelgaard\", \"Damsbo\", email = \"agdamsbo@clin.au.dk\", role = c(\"aut\", \"cre\"),comment = c(ORCID = \"0000-0002-7559-1154\")), person(\"Paul\", \"Egeler\", email = \"paulegeler@gmail.com\", role = c(\"aut\"), comment = c(ORCID = \"0000-0001-6948-9498\")))", "Description": "Casting metadata for REDCap database creation and handling of castellated data using repeated instruments and longitudinal projects in 'REDCap'. Keeps a focused data export approach, by allowing to only export required data from the database. Also for casting new REDCap databases based on datasets from other sources. Originally forked from the R part of 'REDCapRITS' by Paul Egeler. See . 'REDCap' (Research Electronic Data Capture) is a secure, web-based software platform designed to support data capture for research studies, providing 1) an intuitive interface for validated data capture; 2) audit trails for tracking data manipulation and export procedures; 3) automated export procedures for seamless data downloads to common statistical packages; and 4) procedures for data integration and interoperability with external sources (Harris et al (2009) ; Harris et al (2019) ).", "Depends": [ "R (>= 4.1.0)" ], "Suggests": [ + "httr", + "jsonlite", + "testthat", "Hmisc", "knitr", "rmarkdown", + "styler", "devtools", "roxygen2", "spelling", - "jsonlite", - "testthat" + "rhub", + "rsconnect", + "pkgconfig" ], "License": "GPL (>= 3)", "Encoding": "UTF-8", "LazyData": "true", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "URL": "https://github.com/agdamsbo/REDCapCAST, https://agdamsbo.github.io/REDCapCAST/", "BugReports": "https://github.com/agdamsbo/REDCapCAST/issues", "Imports": [ @@ -588,8 +593,8 @@ "VignetteBuilder": "knitr", "Collate": "'REDCapCAST-package.R' 'utils.r' 'process_user_input.r' 'REDCap_split.r' 'as_factor.R' 'as_logical.R' 'doc2dd.R' 'ds2dd_detailed.R' 'easy_redcap.R' 'export_redcap_instrument.R' 'fct_drop.R' 'html_styling.R' 'mtcars_redcap.R' 'read_redcap_instrument.R' 'read_redcap_tables.R' 'redcap_wider.R' 'redcapcast_data.R' 'redcapcast_meta.R' 'shiny_cast.R'", "NeedsCompilation": "no", - "Author": "Andreas Gammelgaard Damsbo [aut, cre] (ORCID: ), Paul Egeler [aut] (ORCID: )", - "Maintainer": "Andreas Gammelgaard Damsbo ", + "Author": "Andreas Gammelgaard Damsbo [aut, cre] (), Paul Egeler [aut] ()", + "Maintainer": "Andreas Gammelgaard Damsbo ", "Repository": "CRAN" }, "REDCapR": { @@ -643,15 +648,12 @@ }, "Rcpp": { "Package": "Rcpp", - "Version": "1.1.1", + "Version": "1.1.0", "Source": "Repository", "Title": "Seamless R and C++ Integration", - "Date": "2026-01-07", + "Date": "2025-07-01", "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Romain\", \"Francois\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"JJ\", \"Allaire\", role = \"aut\", comment = c(ORCID = \"0000-0003-0174-9868\")), person(\"Kevin\", \"Ushey\", role = \"aut\", comment = c(ORCID = \"0000-0003-2880-7407\")), person(\"Qiang\", \"Kou\", role = \"aut\", comment = c(ORCID = \"0000-0001-6786-5453\")), person(\"Nathan\", \"Russell\", role = \"aut\"), person(\"Iñaki\", \"Ucar\", role = \"aut\", comment = c(ORCID = \"0000-0001-6403-5550\")), person(\"Doug\", \"Bates\", role = \"aut\", comment = c(ORCID = \"0000-0001-8316-9503\")), person(\"John\", \"Chambers\", role = \"aut\"))", "Description": "The 'Rcpp' package provides R functions as well as C++ classes which offer a seamless integration of R and C++. Many R data types and objects can be mapped back and forth to C++ equivalents which facilitates both writing of new code as well as easier integration of third-party libraries. Documentation about 'Rcpp' is provided by several vignettes included in this package, via the 'Rcpp Gallery' site at , the paper by Eddelbuettel and Francois (2011, ), the book by Eddelbuettel (2013, ) and the paper by Eddelbuettel and Balamuta (2018, ); see 'citation(\"Rcpp\")' for details.", - "Depends": [ - "R (>= 3.5.0)" - ], "Imports": [ "methods", "utils" @@ -668,7 +670,6 @@ "MailingList": "rcpp-devel@lists.r-forge.r-project.org", "RoxygenNote": "6.1.1", "Encoding": "UTF-8", - "VignetteBuilder": "Rcpp", "NeedsCompilation": "yes", "Author": "Dirk Eddelbuettel [aut, cre] (ORCID: ), Romain Francois [aut] (ORCID: ), JJ Allaire [aut] (ORCID: ), Kevin Ushey [aut] (ORCID: ), Qiang Kou [aut] (ORCID: ), Nathan Russell [aut], Iñaki Ucar [aut] (ORCID: ), Doug Bates [aut] (ORCID: ), John Chambers [aut]", "Maintainer": "Dirk Eddelbuettel ", @@ -676,11 +677,11 @@ }, "RcppArmadillo": { "Package": "RcppArmadillo", - "Version": "15.2.3-1", + "Version": "15.2.2-1", "Source": "Repository", "Type": "Package", "Title": "'Rcpp' Integration for the 'Armadillo' Templated Linear Algebra Library", - "Date": "2025-12-16", + "Date": "2025-11-21", "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Romain\", \"Francois\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Doug\", \"Bates\", role = \"aut\", comment = c(ORCID = \"0000-0001-8316-9503\")), person(\"Binxiang\", \"Ni\", role = \"aut\"), person(\"Conrad\", \"Sanderson\", role = \"aut\", comment = c(ORCID = \"0000-0002-0049-4501\")))", "Description": "'Armadillo' is a templated C++ linear algebra library aiming towards a good balance between speed and ease of use. It provides high-level syntax and functionality deliberately similar to Matlab. It is useful for algorithm development directly in C++, or quick conversion of research code into production environments. It provides efficient classes for vectors, matrices and cubes where dense and sparse matrices are supported. Integer, floating point and complex numbers are supported. A sophisticated expression evaluator (based on template meta-programming) automatically combines several operations to increase speed and efficiency. Dynamic evaluation automatically chooses optimal code paths based on detected matrix structures. Matrix decompositions are provided through integration with LAPACK, or one of its high performance drop-in replacements (such as 'MKL' or 'OpenBLAS'). It can automatically use 'OpenMP' multi-threading (parallelisation) to speed up computationally expensive operations. . The 'RcppArmadillo' package includes the header files from the 'Armadillo' library; users do not need to install 'Armadillo' itself in order to use 'RcppArmadillo'. Starting from release 15.0.0, the minimum compilation standard is C++14 so 'Armadillo' version 14.6.3 is included as a fallback when an R package forces the C++11 standard. Package authors should set a '#define' to select the 'current' version, or select the 'legacy' version (also chosen as default) if they must. See 'GitHub issue #475' for details. . Since release 7.800.0, 'Armadillo' is licensed under Apache License 2; previous releases were under licensed as MPL 2.0 from version 3.800.0 onwards and LGPL-3 prior to that; 'RcppArmadillo' (the 'Rcpp' bindings/bridge to Armadillo) is licensed under the GNU GPL version 2 or later, as is the rest of 'Rcpp'.", "License": "GPL (>= 2)", @@ -751,13 +752,13 @@ }, "Rdpack": { "Package": "Rdpack", - "Version": "2.6.6", + "Version": "2.6.4", "Source": "Repository", "Type": "Package", "Title": "Update and Manipulate Rd Documentation Objects", "Authors@R": "c( person(given = c(\"Georgi\", \"N.\"), family = \"Boshnakov\", role = c(\"aut\", \"cre\"), email = \"georgi.boshnakov@manchester.ac.uk\", comment = c(ORCID = \"0000-0003-2839-346X\")), person(given = \"Duncan\", family = \"Murdoch\", role = \"ctb\", email = \"murdoch.duncan@gmail.com\") )", "Description": "Functions for manipulation of R documentation objects, including functions reprompt() and ereprompt() for updating 'Rd' documentation for functions, methods and classes; 'Rd' macros for citations and import of references from 'bibtex' files for use in 'Rd' files and 'roxygen2' comments; 'Rd' macros for evaluating and inserting snippets of 'R' code and the results of its evaluation or creating graphics on the fly; and many functions for manipulation of references and Rd files.", - "URL": "https://geobosh.github.io/Rdpack/ (doc), https://CRAN.R-project.org/package=Rdpack", + "URL": "https://geobosh.github.io/Rdpack/ (doc), https://github.com/GeoBosh/Rdpack (devel)", "BugReports": "https://github.com/GeoBosh/Rdpack/issues", "Depends": [ "R (>= 2.15.0)", @@ -766,7 +767,7 @@ "Imports": [ "tools", "utils", - "rbibutils (> 2.4)" + "rbibutils (>= 1.3)" ], "Suggests": [ "grDevices", @@ -777,10 +778,9 @@ ], "License": "GPL (>= 2)", "LazyLoad": "yes", - "Encoding": "UTF-8", "RoxygenNote": "7.1.1", "NeedsCompilation": "no", - "Author": "Georgi N. Boshnakov [aut, cre] (ORCID: ), Duncan Murdoch [ctb]", + "Author": "Georgi N. Boshnakov [aut, cre] (), Duncan Murdoch [ctb]", "Maintainer": "Georgi N. Boshnakov ", "Repository": "CRAN" }, @@ -903,7 +903,7 @@ }, "apexcharter": { "Package": "apexcharter", - "Version": "0.4.5", + "Version": "0.4.4", "Source": "Repository", "Title": "Create Interactive Chart with the JavaScript 'ApexCharts' Library", "Description": "Provides an 'htmlwidgets' interface to 'apexcharts.js'. 'Apexcharts' is a modern JavaScript charting library to build interactive charts and visualizations with simple API. 'Apexcharts' examples and documentation are available here: .", @@ -931,7 +931,7 @@ "rmarkdown", "covr" ], - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "URL": "https://github.com/dreamRs/apexcharter, https://dreamrs.github.io/apexcharter/", "BugReports": "https://github.com/dreamRs/apexcharter/issues", "VignetteBuilder": "knitr", @@ -1011,11 +1011,10 @@ }, "base64enc": { "Package": "base64enc", - "Version": "0.1-6", + "Version": "0.1-3", "Source": "Repository", - "Title": "Tools for 'base64' Encoding", - "Author": "Simon Urbanek [aut, cre, cph] (https://urbanek.nz, ORCID: )", - "Authors@R": "person(\"Simon\", \"Urbanek\", role=c(\"aut\",\"cre\",\"cph\"), email=\"Simon.Urbanek@r-project.org\", comment=c(\"https://urbanek.nz\", ORCID=\"0000-0003-2297-1732\"))", + "Title": "Tools for base64 encoding", + "Author": "Simon Urbanek ", "Maintainer": "Simon Urbanek ", "Depends": [ "R (>= 2.9.0)" @@ -1023,10 +1022,9 @@ "Enhances": [ "png" ], - "Description": "Tools for handling 'base64' encoding. It is more flexible than the orphaned 'base64' package.", + "Description": "This package provides tools for handling base64 encoding. It is more flexible than the orphaned base64 package.", "License": "GPL-2 | GPL-3", - "URL": "https://www.rforge.net/base64enc", - "BugReports": "https://github.com/s-u/base64enc/issues", + "URL": "http://www.rforge.net/base64enc", "NeedsCompilation": "yes", "Repository": "CRAN" }, @@ -1275,7 +1273,7 @@ }, "broom": { "Package": "broom", - "Version": "1.0.12", + "Version": "1.0.11", "Source": "Repository", "Type": "Package", "Title": "Convert Statistical Objects into Tidy Tibbles", @@ -1526,7 +1524,7 @@ }, "bslib": { "Package": "bslib", - "Version": "0.10.0", + "Version": "0.9.0", "Source": "Repository", "Title": "Custom 'Bootstrap' 'Sass' Themes for 'shiny' and 'rmarkdown'", "Authors@R": "c( person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Garrick\", \"Aden-Buie\", , \"garrick@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Javi\", \"Aguilar\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap colorpicker library\"), person(\"Thomas\", \"Park\", role = c(\"ctb\", \"cph\"), comment = \"Bootswatch library\"), person(, \"PayPal\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap accessibility plugin\") )", @@ -1552,18 +1550,16 @@ "sass (>= 0.4.9)" ], "Suggests": [ - "brand.yml", "bsicons", "curl", "fontawesome", "future", "ggplot2", "knitr", - "lattice", "magrittr", "rappdirs", "rmarkdown (>= 2.7)", - "shiny (>= 1.11.1)", + "shiny (> 1.8.1)", "testthat", "thematic", "tools", @@ -1578,10 +1574,10 @@ "Config/testthat/parallel": "true", "Config/testthat/start-first": "zzzz-bs-sass, fonts, zzz-precompile, theme-*, rmd-*", "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", - "Collate": "'accordion.R' 'breakpoints.R' 'bs-current-theme.R' 'bs-dependencies.R' 'bs-global.R' 'bs-remove.R' 'bs-theme-layers.R' 'bs-theme-preset-bootswatch.R' 'bs-theme-preset-brand.R' 'bs-theme-preset-builtin.R' 'bs-theme-preset.R' 'utils.R' 'bs-theme-preview.R' 'bs-theme-update.R' 'bs-theme.R' 'bslib-package.R' 'buttons.R' 'card.R' 'deprecated.R' 'files.R' 'fill.R' 'imports.R' 'input-code-editor.R' 'input-dark-mode.R' 'input-submit.R' 'input-switch.R' 'layout.R' 'nav-items.R' 'nav-update.R' 'navbar_options.R' 'navs-legacy.R' 'navs.R' 'onLoad.R' 'page.R' 'popover.R' 'precompiled.R' 'print.R' 'shiny-devmode.R' 'sidebar.R' 'staticimports.R' 'toast.R' 'tooltip.R' 'utils-deps.R' 'utils-shiny.R' 'utils-tags.R' 'value-box.R' 'version-default.R' 'versions.R'", + "RoxygenNote": "7.3.2", + "Collate": "'accordion.R' 'breakpoints.R' 'bs-current-theme.R' 'bs-dependencies.R' 'bs-global.R' 'bs-remove.R' 'bs-theme-layers.R' 'bs-theme-preset-bootswatch.R' 'bs-theme-preset-brand.R' 'bs-theme-preset-builtin.R' 'bs-theme-preset.R' 'utils.R' 'bs-theme-preview.R' 'bs-theme-update.R' 'bs-theme.R' 'bslib-package.R' 'buttons.R' 'card.R' 'deprecated.R' 'files.R' 'fill.R' 'imports.R' 'input-dark-mode.R' 'input-switch.R' 'layout.R' 'nav-items.R' 'nav-update.R' 'navbar_options.R' 'navs-legacy.R' 'navs.R' 'onLoad.R' 'page.R' 'popover.R' 'precompiled.R' 'print.R' 'shiny-devmode.R' 'sidebar.R' 'staticimports.R' 'tooltip.R' 'utils-deps.R' 'utils-shiny.R' 'utils-tags.R' 'value-box.R' 'version-default.R' 'versions.R'", "NeedsCompilation": "no", - "Author": "Carson Sievert [aut, cre] (ORCID: ), Joe Cheng [aut], Garrick Aden-Buie [aut] (ORCID: ), Posit Software, PBC [cph, fnd], Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Javi Aguilar [ctb, cph] (Bootstrap colorpicker library), Thomas Park [ctb, cph] (Bootswatch library), PayPal [ctb, cph] (Bootstrap accessibility plugin)", + "Author": "Carson Sievert [aut, cre] (), Joe Cheng [aut], Garrick Aden-Buie [aut] (), Posit Software, PBC [cph, fnd], Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Javi Aguilar [ctb, cph] (Bootstrap colorpicker library), Thomas Park [ctb, cph] (Bootswatch library), PayPal [ctb, cph] (Bootstrap accessibility plugin)", "Maintainer": "Carson Sievert ", "Repository": "CRAN" }, @@ -1710,7 +1706,7 @@ }, "cardx": { "Package": "cardx", - "Version": "0.3.2", + "Version": "0.3.1", "Source": "Repository", "Title": "Extra Analysis Results Data Utilities", "Authors@R": "c( person(\"Daniel D.\", \"Sjoberg\", , \"danield.sjoberg@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-0862-2018\")), person(\"Abinaya\", \"Yogasekaram\", , \"abinaya.yogasekaram@contractors.roche.com\", role = \"aut\"), person(\"Emily\", \"de la Rua\", , \"emily.de_la_rua@contractors.roche.com\", role = \"aut\"), person(\"Malcolm\", \"Barrett\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0299-5825\")), person(\"F. Hoffmann-La Roche AG\", role = c(\"cph\", \"fnd\")) )", @@ -1724,7 +1720,7 @@ "Imports": [ "cards (>= 0.7.0)", "cli (>= 3.6.1)", - "dplyr (>= 1.2.0)", + "dplyr (>= 1.1.2)", "glue (>= 1.6.2)", "lifecycle (>= 1.0.3)", "rlang (>= 1.1.1)", @@ -1792,7 +1788,7 @@ }, "checkmate": { "Package": "checkmate", - "Version": "2.3.4", + "Version": "2.3.3", "Source": "Repository", "Type": "Package", "Title": "Fast and Versatile Argument Checks", @@ -1827,7 +1823,7 @@ ], "License": "BSD_3_clause + file LICENSE", "VignetteBuilder": "knitr", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "Collate": "'AssertCollection.R' 'allMissing.R' 'anyInfinite.R' 'anyMissing.R' 'anyNaN.R' 'asInteger.R' 'assert.R' 'helper.R' 'makeExpectation.R' 'makeTest.R' 'makeAssertion.R' 'checkAccess.R' 'checkArray.R' 'checkAtomic.R' 'checkAtomicVector.R' 'checkCharacter.R' 'checkChoice.R' 'checkClass.R' 'checkComplex.R' 'checkCount.R' 'checkDataFrame.R' 'checkDataTable.R' 'checkDate.R' 'checkDirectoryExists.R' 'checkDisjunct.R' 'checkDouble.R' 'checkEnvironment.R' 'checkFALSE.R' 'checkFactor.R' 'checkFileExists.R' 'checkFlag.R' 'checkFormula.R' 'checkFunction.R' 'checkInt.R' 'checkInteger.R' 'checkIntegerish.R' 'checkList.R' 'checkLogical.R' 'checkMatrix.R' 'checkMultiClass.R' 'checkNamed.R' 'checkNames.R' 'checkNull.R' 'checkNumber.R' 'checkNumeric.R' 'checkOS.R' 'checkPOSIXct.R' 'checkPathForOutput.R' 'checkPermutation.R' 'checkR6.R' 'checkRaw.R' 'checkScalar.R' 'checkScalarNA.R' 'checkSetEqual.R' 'checkString.R' 'checkSubset.R' 'checkTRUE.R' 'checkTibble.R' 'checkVector.R' 'coalesce.R' 'isIntegerish.R' 'matchArg.R' 'qassert.R' 'qassertr.R' 'vname.R' 'wfwl.R' 'zzz.R'", "Author": "Michel Lang [cre, aut] (ORCID: ), Bernd Bischl [ctb], Dénes Tóth [ctb] (ORCID: )", "Maintainer": "Michel Lang ", @@ -1975,10 +1971,10 @@ }, "cluster": { "Package": "cluster", - "Version": "2.1.8.2", + "Version": "2.1.8.1", "Source": "Repository", - "VersionNote": "Last CRAN: 2.1.8.1 on 2025-03-11; 2.1.8 on 2024-12-10; 2.1.7 on 2024-12-06; 2.1.6 on 2023-11-30;", - "Date": "2026-02-03", + "VersionNote": "Last CRAN: 2.1.8 on 2024-12-10; 2.1.7 on 2024-12-06; 2.1.6 on 2023-11-30; 2.1.5 on 2023-11-27", + "Date": "2025-03-11", "Priority": "recommended", "Title": "\"Finding Groups in Data\": Cluster Analysis Extended Rousseeuw et al.", "Description": "Methods for Cluster analysis. Much extended the original from Peter Rousseeuw, Anja Struyf and Mia Hubert, based on Kaufman and Rousseeuw (1990) \"Finding Groups in Data\".", @@ -2012,7 +2008,7 @@ "License": "GPL (>= 2)", "URL": "https://svn.r-project.org/R-packages/trunk/cluster/", "NeedsCompilation": "yes", - "Author": "Martin Maechler [aut, cre] (ORCID: ), Peter Rousseeuw [aut] (Fortran original, ORCID: ), Anja Struyf [aut] (S original), Mia Hubert [aut] (S original, ORCID: ), Kurt Hornik [trl, ctb] (port to R; maintenance(1999-2000), ORCID: ), Matthias Studer [ctb], Pierre Roudier [ctb], Juan Gonzalez [ctb], Kamil Kozlowski [ctb], Erich Schubert [ctb] (fastpam options for pam(), ORCID: ), Keefe Murphy [ctb] (volume.ellipsoid({d >= 3}))", + "Author": "Martin Maechler [aut, cre] (), Peter Rousseeuw [aut] (Fortran original, ), Anja Struyf [aut] (S original), Mia Hubert [aut] (S original, ), Kurt Hornik [trl, ctb] (port to R; maintenance(1999-2000), ), Matthias Studer [ctb], Pierre Roudier [ctb], Juan Gonzalez [ctb], Kamil Kozlowski [ctb], Erich Schubert [ctb] (fastpam options for pam(), ), Keefe Murphy [ctb] (volume.ellipsoid({d >= 3}))", "Repository": "CRAN" }, "codetools": { @@ -2170,7 +2166,7 @@ }, "cpp11": { "Package": "cpp11", - "Version": "0.5.3", + "Version": "0.5.2", "Source": "Repository", "Title": "A C++11 Interface for R's C Interface", "Authors@R": "c( person(\"Davis\", \"Vaughan\", email = \"davis@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4777-038X\")), person(\"Jim\",\"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Romain\", \"François\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Benjamin\", \"Kietzman\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", @@ -2211,7 +2207,7 @@ "Encoding": "UTF-8", "RoxygenNote": "7.3.2", "NeedsCompilation": "no", - "Author": "Davis Vaughan [aut, cre] (ORCID: ), Jim Hester [aut] (ORCID: ), Romain François [aut] (ORCID: ), Benjamin Kietzman [ctb], Posit Software, PBC [cph, fnd]", + "Author": "Davis Vaughan [aut, cre] (), Jim Hester [aut] (), Romain François [aut] (), Benjamin Kietzman [ctb], Posit Software, PBC [cph, fnd]", "Maintainer": "Davis Vaughan ", "Repository": "CRAN" }, @@ -2313,11 +2309,11 @@ }, "data.table": { "Package": "data.table", - "Version": "1.18.2.1", + "Version": "1.17.8", "Source": "Repository", "Title": "Extension of `data.frame`", "Depends": [ - "R (>= 3.4.0)" + "R (>= 3.3.0)" ], "Imports": [ "methods" @@ -2325,7 +2321,7 @@ "Suggests": [ "bit64 (>= 4.0.0)", "bit (>= 4.0.4)", - "R.utils (>= 2.13.0)", + "R.utils", "xts", "zoo (>= 1.8-1)", "yaml", @@ -2339,9 +2335,9 @@ "VignetteBuilder": "knitr", "Encoding": "UTF-8", "ByteCompile": "TRUE", - "Authors@R": "c( person(\"Tyson\",\"Barrett\", role=c(\"aut\",\"cre\"), email=\"t.barrett88@gmail.com\", comment = c(ORCID=\"0000-0002-2137-1391\")), person(\"Matt\",\"Dowle\", role=\"aut\", email=\"mattjdowle@gmail.com\"), person(\"Arun\",\"Srinivasan\", role=\"aut\", email=\"asrini@pm.me\"), person(\"Jan\",\"Gorecki\", role=\"aut\", email=\"j.gorecki@wit.edu.pl\"), person(\"Michael\",\"Chirico\", role=\"aut\", email=\"michaelchirico4@gmail.com\", comment = c(ORCID=\"0000-0003-0787-087X\")), person(\"Toby\",\"Hocking\", role=\"aut\", email=\"toby.hocking@r-project.org\", comment = c(ORCID=\"0000-0002-3146-0865\")), person(\"Benjamin\",\"Schwendinger\",role=\"aut\", comment = c(ORCID=\"0000-0003-3315-8114\")), person(\"Ivan\", \"Krylov\", role=\"aut\", email=\"ikrylov@disroot.org\", comment = c(ORCID=\"0000-0002-0172-3812\")), person(\"Pasha\",\"Stetsenko\", role=\"ctb\"), person(\"Tom\",\"Short\", role=\"ctb\"), person(\"Steve\",\"Lianoglou\", role=\"ctb\"), person(\"Eduard\",\"Antonyan\", role=\"ctb\"), person(\"Markus\",\"Bonsch\", role=\"ctb\"), person(\"Hugh\",\"Parsonage\", role=\"ctb\"), person(\"Scott\",\"Ritchie\", role=\"ctb\"), person(\"Kun\",\"Ren\", role=\"ctb\"), person(\"Xianying\",\"Tan\", role=\"ctb\"), person(\"Rick\",\"Saporta\", role=\"ctb\"), person(\"Otto\",\"Seiskari\", role=\"ctb\"), person(\"Xianghui\",\"Dong\", role=\"ctb\"), person(\"Michel\",\"Lang\", role=\"ctb\"), person(\"Watal\",\"Iwasaki\", role=\"ctb\"), person(\"Seth\",\"Wenchel\", role=\"ctb\"), person(\"Karl\",\"Broman\", role=\"ctb\"), person(\"Tobias\",\"Schmidt\", role=\"ctb\"), person(\"David\",\"Arenburg\", role=\"ctb\"), person(\"Ethan\",\"Smith\", role=\"ctb\"), person(\"Francois\",\"Cocquemas\", role=\"ctb\"), person(\"Matthieu\",\"Gomez\", role=\"ctb\"), person(\"Philippe\",\"Chataignon\", role=\"ctb\"), person(\"Nello\",\"Blaser\", role=\"ctb\"), person(\"Dmitry\",\"Selivanov\", role=\"ctb\"), person(\"Andrey\",\"Riabushenko\", role=\"ctb\"), person(\"Cheng\",\"Lee\", role=\"ctb\"), person(\"Declan\",\"Groves\", role=\"ctb\"), person(\"Daniel\",\"Possenriede\", role=\"ctb\"), person(\"Felipe\",\"Parages\", role=\"ctb\"), person(\"Denes\",\"Toth\", role=\"ctb\"), person(\"Mus\",\"Yaramaz-David\", role=\"ctb\"), person(\"Ayappan\",\"Perumal\", role=\"ctb\"), person(\"James\",\"Sams\", role=\"ctb\"), person(\"Martin\",\"Morgan\", role=\"ctb\"), person(\"Michael\",\"Quinn\", role=\"ctb\"), person(given=\"@javrucebo\", role=\"ctb\", comment=\"GitHub user\"), person(\"Marc\",\"Halperin\", role=\"ctb\"), person(\"Roy\",\"Storey\", role=\"ctb\"), person(\"Manish\",\"Saraswat\", role=\"ctb\"), person(\"Morgan\",\"Jacob\", role=\"ctb\"), person(\"Michael\",\"Schubmehl\", role=\"ctb\"), person(\"Davis\",\"Vaughan\", role=\"ctb\"), person(\"Leonardo\",\"Silvestri\", role=\"ctb\"), person(\"Jim\",\"Hester\", role=\"ctb\"), person(\"Anthony\",\"Damico\", role=\"ctb\"), person(\"Sebastian\",\"Freundt\", role=\"ctb\"), person(\"David\",\"Simons\", role=\"ctb\"), person(\"Elliott\",\"Sales de Andrade\", role=\"ctb\"), person(\"Cole\",\"Miller\", role=\"ctb\"), person(\"Jens Peder\",\"Meldgaard\", role=\"ctb\"), person(\"Vaclav\",\"Tlapak\", role=\"ctb\"), person(\"Kevin\",\"Ushey\", role=\"ctb\"), person(\"Dirk\",\"Eddelbuettel\", role=\"ctb\"), person(\"Tony\",\"Fischetti\", role=\"ctb\"), person(\"Ofek\",\"Shilon\", role=\"ctb\"), person(\"Vadim\",\"Khotilovich\", role=\"ctb\"), person(\"Hadley\",\"Wickham\", role=\"ctb\"), person(\"Bennet\",\"Becker\", role=\"ctb\"), person(\"Kyle\",\"Haynes\", role=\"ctb\"), person(\"Boniface Christian\",\"Kamgang\", role=\"ctb\"), person(\"Olivier\",\"Delmarcell\", role=\"ctb\"), person(\"Josh\",\"O'Brien\", role=\"ctb\"), person(\"Dereck\",\"de Mezquita\", role=\"ctb\"), person(\"Michael\",\"Czekanski\", role=\"ctb\"), person(\"Dmitry\", \"Shemetov\", role=\"ctb\"), person(\"Nitish\", \"Jha\", role=\"ctb\"), person(\"Joshua\", \"Wu\", role=\"ctb\"), person(\"Iago\", \"Giné-Vázquez\", role=\"ctb\"), person(\"Anirban\", \"Chetia\", role=\"ctb\"), person(\"Doris\", \"Amoakohene\", role=\"ctb\"), person(\"Angel\", \"Feliz\", role=\"ctb\"), person(\"Michael\",\"Young\", role=\"ctb\"), person(\"Mark\", \"Seeto\", role=\"ctb\"), person(\"Philippe\", \"Grosjean\", role=\"ctb\"), person(\"Vincent\", \"Runge\", role=\"ctb\"), person(\"Christian\", \"Wia\", role=\"ctb\"), person(\"Elise\", \"Maigné\", role=\"ctb\"), person(\"Vincent\", \"Rocher\", role=\"ctb\"), person(\"Vijay\", \"Lulla\", role=\"ctb\"), person(\"Aljaž\", \"Sluga\", role=\"ctb\"), person(\"Bill\", \"Evans\", role=\"ctb\"), person(\"Reino\", \"Bruner\", role=\"ctb\"), person(given=\"@badasahog\", role=\"ctb\", comment=\"GitHub user\"), person(\"Vinit\", \"Thakur\", role=\"ctb\"), person(\"Mukul\", \"Kumar\", role=\"ctb\"), person(\"Ildikó\", \"Czeller\", role=\"ctb\"), person(\"Manmita\", \"Das\", role=\"ctb\") )", + "Authors@R": "c( person(\"Tyson\",\"Barrett\", role=c(\"aut\",\"cre\"), email=\"t.barrett88@gmail.com\", comment = c(ORCID=\"0000-0002-2137-1391\")), person(\"Matt\",\"Dowle\", role=\"aut\", email=\"mattjdowle@gmail.com\"), person(\"Arun\",\"Srinivasan\", role=\"aut\", email=\"asrini@pm.me\"), person(\"Jan\",\"Gorecki\", role=\"aut\"), person(\"Michael\",\"Chirico\", role=\"aut\", comment = c(ORCID=\"0000-0003-0787-087X\")), person(\"Toby\",\"Hocking\", role=\"aut\", comment = c(ORCID=\"0000-0002-3146-0865\")), person(\"Benjamin\",\"Schwendinger\",role=\"aut\", comment = c(ORCID=\"0000-0003-3315-8114\")), person(\"Ivan\", \"Krylov\", role=\"aut\", email=\"ikrylov@disroot.org\", comment = c(ORCID=\"0000-0002-0172-3812\")), person(\"Pasha\",\"Stetsenko\", role=\"ctb\"), person(\"Tom\",\"Short\", role=\"ctb\"), person(\"Steve\",\"Lianoglou\", role=\"ctb\"), person(\"Eduard\",\"Antonyan\", role=\"ctb\"), person(\"Markus\",\"Bonsch\", role=\"ctb\"), person(\"Hugh\",\"Parsonage\", role=\"ctb\"), person(\"Scott\",\"Ritchie\", role=\"ctb\"), person(\"Kun\",\"Ren\", role=\"ctb\"), person(\"Xianying\",\"Tan\", role=\"ctb\"), person(\"Rick\",\"Saporta\", role=\"ctb\"), person(\"Otto\",\"Seiskari\", role=\"ctb\"), person(\"Xianghui\",\"Dong\", role=\"ctb\"), person(\"Michel\",\"Lang\", role=\"ctb\"), person(\"Watal\",\"Iwasaki\", role=\"ctb\"), person(\"Seth\",\"Wenchel\", role=\"ctb\"), person(\"Karl\",\"Broman\", role=\"ctb\"), person(\"Tobias\",\"Schmidt\", role=\"ctb\"), person(\"David\",\"Arenburg\", role=\"ctb\"), person(\"Ethan\",\"Smith\", role=\"ctb\"), person(\"Francois\",\"Cocquemas\", role=\"ctb\"), person(\"Matthieu\",\"Gomez\", role=\"ctb\"), person(\"Philippe\",\"Chataignon\", role=\"ctb\"), person(\"Nello\",\"Blaser\", role=\"ctb\"), person(\"Dmitry\",\"Selivanov\", role=\"ctb\"), person(\"Andrey\",\"Riabushenko\", role=\"ctb\"), person(\"Cheng\",\"Lee\", role=\"ctb\"), person(\"Declan\",\"Groves\", role=\"ctb\"), person(\"Daniel\",\"Possenriede\", role=\"ctb\"), person(\"Felipe\",\"Parages\", role=\"ctb\"), person(\"Denes\",\"Toth\", role=\"ctb\"), person(\"Mus\",\"Yaramaz-David\", role=\"ctb\"), person(\"Ayappan\",\"Perumal\", role=\"ctb\"), person(\"James\",\"Sams\", role=\"ctb\"), person(\"Martin\",\"Morgan\", role=\"ctb\"), person(\"Michael\",\"Quinn\", role=\"ctb\"), person(\"@javrucebo\",\"\", role=\"ctb\"), person(\"@marc-outins\",\"\", role=\"ctb\"), person(\"Roy\",\"Storey\", role=\"ctb\"), person(\"Manish\",\"Saraswat\", role=\"ctb\"), person(\"Morgan\",\"Jacob\", role=\"ctb\"), person(\"Michael\",\"Schubmehl\", role=\"ctb\"), person(\"Davis\",\"Vaughan\", role=\"ctb\"), person(\"Leonardo\",\"Silvestri\", role=\"ctb\"), person(\"Jim\",\"Hester\", role=\"ctb\"), person(\"Anthony\",\"Damico\", role=\"ctb\"), person(\"Sebastian\",\"Freundt\", role=\"ctb\"), person(\"David\",\"Simons\", role=\"ctb\"), person(\"Elliott\",\"Sales de Andrade\", role=\"ctb\"), person(\"Cole\",\"Miller\", role=\"ctb\"), person(\"Jens Peder\",\"Meldgaard\", role=\"ctb\"), person(\"Vaclav\",\"Tlapak\", role=\"ctb\"), person(\"Kevin\",\"Ushey\", role=\"ctb\"), person(\"Dirk\",\"Eddelbuettel\", role=\"ctb\"), person(\"Tony\",\"Fischetti\", role=\"ctb\"), person(\"Ofek\",\"Shilon\", role=\"ctb\"), person(\"Vadim\",\"Khotilovich\", role=\"ctb\"), person(\"Hadley\",\"Wickham\", role=\"ctb\"), person(\"Bennet\",\"Becker\", role=\"ctb\"), person(\"Kyle\",\"Haynes\", role=\"ctb\"), person(\"Boniface Christian\",\"Kamgang\", role=\"ctb\"), person(\"Olivier\",\"Delmarcell\", role=\"ctb\"), person(\"Josh\",\"O'Brien\", role=\"ctb\"), person(\"Dereck\",\"de Mezquita\", role=\"ctb\"), person(\"Michael\",\"Czekanski\", role=\"ctb\"), person(\"Dmitry\", \"Shemetov\", role=\"ctb\"), person(\"Nitish\", \"Jha\", role=\"ctb\"), person(\"Joshua\", \"Wu\", role=\"ctb\"), person(\"Iago\", \"Giné-Vázquez\", role=\"ctb\"), person(\"Anirban\", \"Chetia\", role=\"ctb\"), person(\"Doris\", \"Amoakohene\", role=\"ctb\"), person(\"Angel\", \"Feliz\", role=\"ctb\"), person(\"Michael\",\"Young\", role=\"ctb\"), person(\"Mark\", \"Seeto\", role=\"ctb\"), person(\"Philippe\", \"Grosjean\", role=\"ctb\"), person(\"Vincent\", \"Runge\", role=\"ctb\"), person(\"Christian\", \"Wia\", role=\"ctb\"), person(\"Elise\", \"Maigné\", role=\"ctb\"), person(\"Vincent\", \"Rocher\", role=\"ctb\"), person(\"Vijay\", \"Lulla\", role=\"ctb\"), person(\"Aljaž\", \"Sluga\", role=\"ctb\"), person(\"Bill\", \"Evans\", role=\"ctb\") )", "NeedsCompilation": "yes", - "Author": "Tyson Barrett [aut, cre] (ORCID: ), Matt Dowle [aut], Arun Srinivasan [aut], Jan Gorecki [aut], Michael Chirico [aut] (ORCID: ), Toby Hocking [aut] (ORCID: ), Benjamin Schwendinger [aut] (ORCID: ), Ivan Krylov [aut] (ORCID: ), Pasha Stetsenko [ctb], Tom Short [ctb], Steve Lianoglou [ctb], Eduard Antonyan [ctb], Markus Bonsch [ctb], Hugh Parsonage [ctb], Scott Ritchie [ctb], Kun Ren [ctb], Xianying Tan [ctb], Rick Saporta [ctb], Otto Seiskari [ctb], Xianghui Dong [ctb], Michel Lang [ctb], Watal Iwasaki [ctb], Seth Wenchel [ctb], Karl Broman [ctb], Tobias Schmidt [ctb], David Arenburg [ctb], Ethan Smith [ctb], Francois Cocquemas [ctb], Matthieu Gomez [ctb], Philippe Chataignon [ctb], Nello Blaser [ctb], Dmitry Selivanov [ctb], Andrey Riabushenko [ctb], Cheng Lee [ctb], Declan Groves [ctb], Daniel Possenriede [ctb], Felipe Parages [ctb], Denes Toth [ctb], Mus Yaramaz-David [ctb], Ayappan Perumal [ctb], James Sams [ctb], Martin Morgan [ctb], Michael Quinn [ctb], @javrucebo [ctb] (GitHub user), Marc Halperin [ctb], Roy Storey [ctb], Manish Saraswat [ctb], Morgan Jacob [ctb], Michael Schubmehl [ctb], Davis Vaughan [ctb], Leonardo Silvestri [ctb], Jim Hester [ctb], Anthony Damico [ctb], Sebastian Freundt [ctb], David Simons [ctb], Elliott Sales de Andrade [ctb], Cole Miller [ctb], Jens Peder Meldgaard [ctb], Vaclav Tlapak [ctb], Kevin Ushey [ctb], Dirk Eddelbuettel [ctb], Tony Fischetti [ctb], Ofek Shilon [ctb], Vadim Khotilovich [ctb], Hadley Wickham [ctb], Bennet Becker [ctb], Kyle Haynes [ctb], Boniface Christian Kamgang [ctb], Olivier Delmarcell [ctb], Josh O'Brien [ctb], Dereck de Mezquita [ctb], Michael Czekanski [ctb], Dmitry Shemetov [ctb], Nitish Jha [ctb], Joshua Wu [ctb], Iago Giné-Vázquez [ctb], Anirban Chetia [ctb], Doris Amoakohene [ctb], Angel Feliz [ctb], Michael Young [ctb], Mark Seeto [ctb], Philippe Grosjean [ctb], Vincent Runge [ctb], Christian Wia [ctb], Elise Maigné [ctb], Vincent Rocher [ctb], Vijay Lulla [ctb], Aljaž Sluga [ctb], Bill Evans [ctb], Reino Bruner [ctb], @badasahog [ctb] (GitHub user), Vinit Thakur [ctb], Mukul Kumar [ctb], Ildikó Czeller [ctb], Manmita Das [ctb]", + "Author": "Tyson Barrett [aut, cre] (ORCID: ), Matt Dowle [aut], Arun Srinivasan [aut], Jan Gorecki [aut], Michael Chirico [aut] (ORCID: ), Toby Hocking [aut] (ORCID: ), Benjamin Schwendinger [aut] (ORCID: ), Ivan Krylov [aut] (ORCID: ), Pasha Stetsenko [ctb], Tom Short [ctb], Steve Lianoglou [ctb], Eduard Antonyan [ctb], Markus Bonsch [ctb], Hugh Parsonage [ctb], Scott Ritchie [ctb], Kun Ren [ctb], Xianying Tan [ctb], Rick Saporta [ctb], Otto Seiskari [ctb], Xianghui Dong [ctb], Michel Lang [ctb], Watal Iwasaki [ctb], Seth Wenchel [ctb], Karl Broman [ctb], Tobias Schmidt [ctb], David Arenburg [ctb], Ethan Smith [ctb], Francois Cocquemas [ctb], Matthieu Gomez [ctb], Philippe Chataignon [ctb], Nello Blaser [ctb], Dmitry Selivanov [ctb], Andrey Riabushenko [ctb], Cheng Lee [ctb], Declan Groves [ctb], Daniel Possenriede [ctb], Felipe Parages [ctb], Denes Toth [ctb], Mus Yaramaz-David [ctb], Ayappan Perumal [ctb], James Sams [ctb], Martin Morgan [ctb], Michael Quinn [ctb], @javrucebo [ctb], @marc-outins [ctb], Roy Storey [ctb], Manish Saraswat [ctb], Morgan Jacob [ctb], Michael Schubmehl [ctb], Davis Vaughan [ctb], Leonardo Silvestri [ctb], Jim Hester [ctb], Anthony Damico [ctb], Sebastian Freundt [ctb], David Simons [ctb], Elliott Sales de Andrade [ctb], Cole Miller [ctb], Jens Peder Meldgaard [ctb], Vaclav Tlapak [ctb], Kevin Ushey [ctb], Dirk Eddelbuettel [ctb], Tony Fischetti [ctb], Ofek Shilon [ctb], Vadim Khotilovich [ctb], Hadley Wickham [ctb], Bennet Becker [ctb], Kyle Haynes [ctb], Boniface Christian Kamgang [ctb], Olivier Delmarcell [ctb], Josh O'Brien [ctb], Dereck de Mezquita [ctb], Michael Czekanski [ctb], Dmitry Shemetov [ctb], Nitish Jha [ctb], Joshua Wu [ctb], Iago Giné-Vázquez [ctb], Anirban Chetia [ctb], Doris Amoakohene [ctb], Angel Feliz [ctb], Michael Young [ctb], Mark Seeto [ctb], Philippe Grosjean [ctb], Vincent Runge [ctb], Christian Wia [ctb], Elise Maigné [ctb], Vincent Rocher [ctb], Vijay Lulla [ctb], Aljaž Sluga [ctb], Bill Evans [ctb]", "Maintainer": "Tyson Barrett ", "Repository": "CRAN" }, @@ -2607,7 +2603,7 @@ }, "dplyr": { "Package": "dplyr", - "Version": "1.2.0", + "Version": "1.1.4", "Source": "Repository", "Type": "Package", "Title": "A Grammar of Data Manipulation", @@ -2617,25 +2613,27 @@ "URL": "https://dplyr.tidyverse.org, https://github.com/tidyverse/dplyr", "BugReports": "https://github.com/tidyverse/dplyr/issues", "Depends": [ - "R (>= 4.1.0)" + "R (>= 3.5.0)" ], "Imports": [ - "cli (>= 3.6.2)", + "cli (>= 3.4.0)", "generics", "glue (>= 1.3.2)", - "lifecycle (>= 1.0.5)", + "lifecycle (>= 1.0.3)", "magrittr (>= 1.5)", "methods", "pillar (>= 1.9.0)", "R6", - "rlang (>= 1.1.7)", + "rlang (>= 1.1.0)", "tibble (>= 3.2.0)", "tidyselect (>= 1.2.0)", "utils", - "vctrs (>= 0.7.1)" + "vctrs (>= 0.6.4)" ], "Suggests": [ + "bench", "broom", + "callr", "covr", "DBI", "dbplyr (>= 2.2.1)", @@ -2643,9 +2641,12 @@ "knitr", "Lahman", "lobstr", + "microbenchmark", "nycflights13", "purrr", "rmarkdown", + "RMySQL", + "RPostgreSQL", "RSQLite", "stringi (>= 1.7.6)", "testthat (>= 3.1.5)", @@ -2653,20 +2654,19 @@ "withr" ], "VignetteBuilder": "knitr", - "Config/build/compilation-database": "true", - "Config/Needs/website": "tidyverse/tidytemplate", + "Config/Needs/website": "tidyverse, shiny, pkgdown, tidyverse/tidytemplate", "Config/testthat/edition": "3", "Encoding": "UTF-8", "LazyData": "true", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.2.3", "NeedsCompilation": "yes", - "Author": "Hadley Wickham [aut, cre] (ORCID: ), Romain François [aut] (ORCID: ), Lionel Henry [aut], Kirill Müller [aut] (ORCID: ), Davis Vaughan [aut] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Author": "Hadley Wickham [aut, cre] (), Romain François [aut] (), Lionel Henry [aut], Kirill Müller [aut] (), Davis Vaughan [aut] (), Posit Software, PBC [cph, fnd]", "Maintainer": "Hadley Wickham ", "Repository": "CRAN" }, "e1071": { "Package": "e1071", - "Version": "1.7-17", + "Version": "1.7-16", "Source": "Repository", "Title": "Misc Functions of the Department of Statistics, Probability Theory Group (Formerly: E1071), TU Wien", "Imports": [ @@ -2695,7 +2695,7 @@ "License": "GPL-2 | GPL-3", "LazyLoad": "yes", "NeedsCompilation": "yes", - "Author": "David Meyer [aut, cre] (ORCID: ), Evgenia Dimitriadou [aut, cph], Kurt Hornik [aut] (ORCID: ), Andreas Weingessel [aut], Friedrich Leisch [aut], Chih-Chung Chang [ctb, cph] (libsvm C++-code), Chih-Chen Lin [ctb, cph] (libsvm C++-code)", + "Author": "David Meyer [aut, cre] (), Evgenia Dimitriadou [aut, cph], Kurt Hornik [aut] (), Andreas Weingessel [aut], Friedrich Leisch [aut], Chih-Chung Chang [ctb, cph] (libsvm C++-code), Chih-Chen Lin [ctb, cph] (libsvm C++-code)", "Maintainer": "David Meyer ", "Repository": "CRAN" }, @@ -2819,11 +2819,11 @@ }, "emmeans": { "Package": "emmeans", - "Version": "2.0.1", + "Version": "2.0.0", "Source": "Repository", "Type": "Package", "Title": "Estimated Marginal Means, aka Least-Squares Means", - "Date": "2025-12-10", + "Date": "2025-10-24", "Authors@R": "c(person(\"Russell V.\", \"Lenth\", role = c(\"aut\", \"cph\"), email = \"russell-lenth@uiowa.edu\"), person(\"Julia\", \"Piaskowski\", role = c(\"cre\", \"aut\"), email = \"julia.piask@gmail.com\"), person(\"Balazs\", \"Banfai\", role = \"ctb\"), person(\"Ben\", \"Bolker\", role = \"ctb\"), person(\"Paul\", \"Buerkner\", role = \"ctb\"), person(\"Iago\", \"Giné-Vázquez\", role = \"ctb\"), person(\"Maxime\", \"Hervé\", role = \"ctb\"), person(\"Maarten\", \"Jung\", role = \"ctb\"), person(\"Jonathon\", \"Love\", role = \"ctb\"), person(\"Fernando\", \"Miguez\", role = \"ctb\"), person(\"Hannes\", \"Riebl\", role = \"ctb\"), person(\"Henrik\", \"Singmann\", role = \"ctb\"))", "Maintainer": "Julia Piaskowski ", "Depends": [ @@ -3160,24 +3160,24 @@ }, "flextable": { "Package": "flextable", - "Version": "0.9.11", + "Version": "0.9.10", "Source": "Repository", "Type": "Package", "Title": "Functions for Tabular Reporting", "Authors@R": "c( person(\"David\", \"Gohel\", , \"david.gohel@ardata.fr\", role = c(\"aut\", \"cre\")), person(\"ArData\", role = \"cph\"), person(\"Clementine\", \"Jager\", role = \"ctb\"), person(\"Eli\", \"Daniels\", role = \"ctb\"), person(\"Panagiotis\", \"Skintzos\", , \"panagiotis.skintzos@ardata.fr\", role = \"aut\"), person(\"Quentin\", \"Fazilleau\", role = \"ctb\"), person(\"Maxim\", \"Nazarov\", role = \"ctb\"), person(\"Titouan\", \"Robert\", role = \"ctb\"), person(\"Michael\", \"Barrowman\", role = \"ctb\"), person(\"Atsushi\", \"Yasumoto\", role = \"ctb\"), person(\"Paul\", \"Julian\", role = \"ctb\"), person(\"Sean\", \"Browning\", role = \"ctb\"), person(\"Rémi\", \"Thériault\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4315-6788\")), person(\"Samuel\", \"Jobert\", role = \"ctb\"), person(\"Keith\", \"Newman\", role = \"ctb\") )", - "Description": "Use a grammar for creating and customizing pretty tables. The following formats are supported: 'HTML', 'PDF', 'RTF', 'Microsoft Word', 'Microsoft PowerPoint', R 'Grid Graphics' and 'patchwork'. 'R Markdown', 'Quarto' and the package 'officer' can be used to produce the result files. The syntax is the same for the user regardless of the type of output to be produced. A set of functions allows the creation, definition of cell arrangement, addition of headers or footers, formatting and definition of cell content with text and or images. The package also offers a set of high-level functions that allow tabular reporting of statistical models and the creation of complex cross tabulations.", + "Description": "Use a grammar for creating and customizing pretty tables. The following formats are supported: 'HTML', 'PDF', 'RTF', 'Microsoft Word', 'Microsoft PowerPoint' and R 'Grid Graphics'. 'R Markdown', 'Quarto' and the package 'officer' can be used to produce the result files. The syntax is the same for the user regardless of the type of output to be produced. A set of functions allows the creation, definition of cell arrangement, addition of headers or footers, formatting and definition of cell content with text and or images. The package also offers a set of high-level functions that allow tabular reporting of statistical models and the creation of complex cross tabulations.", "License": "GPL-3", "URL": "https://ardata-fr.github.io/flextable-book/, https://davidgohel.github.io/flextable/", "BugReports": "https://github.com/davidgohel/flextable/issues", "Imports": [ "data.table (>= 1.13.0)", - "gdtools (>= 0.5.0)", + "gdtools (>= 0.4.0)", "graphics", "grDevices", "grid", "htmltools", "knitr", - "officer (>= 0.7.3)", + "officer (>= 0.6.10)", "ragg", "rlang", "rmarkdown (>= 2.0)", @@ -3196,14 +3196,11 @@ "doconv (>= 0.3.0)", "equatags", "ggplot2", - "gtable", - "jsonlite", "lme4", "magick", "mgcv", "nlme", "officedown", - "patchwork", "pdftools", "pkgdown (>= 2.0.0)", "scales", @@ -3217,7 +3214,7 @@ "VignetteBuilder": "knitr", "Config/testthat/edition": "3", "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "NeedsCompilation": "no", "Author": "David Gohel [aut, cre], ArData [cph], Clementine Jager [ctb], Eli Daniels [ctb], Panagiotis Skintzos [aut], Quentin Fazilleau [ctb], Maxim Nazarov [ctb], Titouan Robert [ctb], Michael Barrowman [ctb], Atsushi Yasumoto [ctb], Paul Julian [ctb], Sean Browning [ctb], Rémi Thériault [ctb] (ORCID: ), Samuel Jobert [ctb], Keith Newman [ctb]", "Maintainer": "David Gohel ", @@ -3477,11 +3474,11 @@ }, "gap": { "Package": "gap", - "Version": "1.14", + "Version": "1.6", "Source": "Repository", "Type": "Package", "Title": "Genetic Analysis Package", - "Date": "2026-2-19", + "Date": "2024-8-26", "Authors@R": "c( person(\"Jing Hua\", \"Zhao\", role = c(\"aut\", \"cre\"), email = \"jinghuazhao@hotmail.com\", comment = c(ORCID = \"0000-0002-1463-5870\", \"0000-0003-4930-3582\")), person(\"Kurt\", \"Hornik\", role = \"ctb\"), person(\"Brian\", \"Ripley\", role = \"ctb\"), person(\"Uwe\", \"Ligges\", role = \"ctb\"), person(\"Achim\", \"Zeileis\", role = \"ctb\") )", "Description": "As first reported [Zhao, J. H. 2007. \"gap: Genetic Analysis Package\". J Stat Soft 23(8):1-18. ], it is designed as an integrated package for genetic data analysis of both population and family data. Currently, it contains functions for sample size calculations of both population-based and family-based designs, probability of familial disease aggregation, kinship calculation, statistics in linkage analysis, and association analysis involving genetic markers including haplotype analysis with or without environmental covariates. Over years, the package has been developed in-between many projects hence also in line with the name (gap).", "License": "GPL (>= 2)", @@ -3522,6 +3519,7 @@ "knitr", "lattice", "magic", + "manhattanly", "matrixStats", "meta", "metafor", @@ -3544,9 +3542,9 @@ "NeedsCompilation": "yes", "Encoding": "UTF-8", "VignetteBuilder": "knitr", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "RdMacros": "Rdpack", - "Author": "Jing Hua Zhao [aut, cre] (ORCID: , 0000-0003-4930-3582), Kurt Hornik [ctb], Brian Ripley [ctb], Uwe Ligges [ctb], Achim Zeileis [ctb]", + "Author": "Jing Hua Zhao [aut, cre] (, 0000-0003-4930-3582), Kurt Hornik [ctb], Brian Ripley [ctb], Uwe Ligges [ctb], Achim Zeileis [ctb]", "Maintainer": "Jing Hua Zhao ", "Repository": "CRAN" }, @@ -3573,11 +3571,11 @@ }, "gdtools": { "Package": "gdtools", - "Version": "0.5.0", + "Version": "0.4.4", "Source": "Repository", - "Title": "Font Metrics and Font Management Utilities for R Graphics", + "Title": "Utilities for Graphical Rendering and Fonts Management", "Authors@R": "c( person(\"David\", \"Gohel\", , \"david.gohel@ardata.fr\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@rstudio.com\", role = \"aut\"), person(\"Jeroen\", \"Ooms\", , \"jeroen@berkeley.edu\", role = \"aut\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Yixuan\", \"Qiu\", role = \"ctb\"), person(\"R Core Team\", role = \"cph\", comment = \"Cairo code from X11 device\"), person(\"ArData\", role = \"cph\"), person(\"RStudio\", role = \"cph\") )", - "Description": "Compute text metrics (width, ascent, descent) using 'Cairo' and 'FreeType', independently of the active graphic device. Font lookup is delegated to 'systemfonts'. Additional utilities let users register 'Google Fonts' or bundled 'Liberation' fonts, check font availability, and assemble 'htmlDependency' objects so that fonts are correctly embedded in 'Shiny' applications, 'R Markdown' documents, and 'htmlwidgets' outputs such as 'ggiraph'.", + "Description": "Tools are provided to compute metrics of formatted strings and to check the availability of a font. Another set of functions is provided to support the collection of fonts from 'Google Fonts' in a cache. Their use is simple within 'R Markdown' documents and 'shiny' applications but also with graphic productions generated with the 'ggiraph', 'ragg' and 'svglite' packages or with tabular productions from the 'flextable' package.", "License": "GPL-3 | file LICENSE", "URL": "https://davidgohel.github.io/gdtools/", "BugReports": "https://github.com/davidgohel/gdtools/issues", @@ -3775,7 +3773,7 @@ }, "ggplot2": { "Package": "ggplot2", - "Version": "4.0.2", + "Version": "4.0.1", "Source": "Repository", "Title": "Create Elegant Data Visualisations Using the Grammar of Graphics", "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Winston\", \"Chang\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Lionel\", \"Henry\", role = \"aut\"), person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Kohske\", \"Takahashi\", role = \"aut\"), person(\"Claus\", \"Wilke\", role = \"aut\", comment = c(ORCID = \"0000-0002-7470-9261\")), person(\"Kara\", \"Woo\", role = \"aut\", comment = c(ORCID = \"0000-0002-5125-4188\")), person(\"Hiroaki\", \"Yutani\", role = \"aut\", comment = c(ORCID = \"0000-0002-3385-7233\")), person(\"Dewey\", \"Dunnington\", role = \"aut\", comment = c(ORCID = \"0000-0002-9415-4582\")), person(\"Teun\", \"van den Brand\", role = \"aut\", comment = c(ORCID = \"0000-0002-9335-7468\")), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", @@ -3889,7 +3887,7 @@ }, "ggstats": { "Package": "ggstats", - "Version": "0.12.0", + "Version": "0.11.0", "Source": "Repository", "Type": "Package", "Title": "Extension to 'ggplot2' for Plotting Stats", @@ -3937,7 +3935,7 @@ "vdiffr" ], "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "Config/testthat/edition": "3", "Language": "en-US", "VignetteBuilder": "knitr", @@ -4019,17 +4017,17 @@ }, "gt": { "Package": "gt", - "Version": "1.3.0", + "Version": "1.1.0", "Source": "Repository", "Type": "Package", "Title": "Easily Create Presentation-Ready Display Tables", - "Authors@R": "c( person(\"Richard\", \"Iannone\", , \"rich@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Shannon\", \"Haughton\", , \"shannon.l.haughton@gsk.com\", role = \"aut\"), person(\"Ellis\", \"Hughes\", , \"ellis.h.hughes@gsk.com\", role = \"aut\", comment = c(ORCID = \"0000-0003-0637-4436\")), person(\"Alexandra\", \"Lauer\", , \"alexandralauer1@gmail.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-4191-6301\")), person(\"Romain\", \"François\", , \"romain@tada.science\", role = \"aut\"), person(\"JooYoung\", \"Seo\", , \"jseo1005@illinois.edu\", role = \"aut\", comment = c(ORCID = \"0000-0002-4064-6012\")), person(\"Ken\", \"Brevoort\", , \"ken@brevoort.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-4001-8358\")), person(\"Olivier\", \"Roy\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Authors@R": "c( person(\"Richard\", \"Iannone\", , \"rich@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Ellis\", \"Hughes\", , \"ellis.h.hughes@gsk.com\", role = \"aut\", comment = c(ORCID = \"0000-0003-0637-4436\")), person(\"Alexandra\", \"Lauer\", , \"alexandralauer1@gmail.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-4191-6301\")), person(\"JooYoung\", \"Seo\", , \"jseo1005@illinois.edu\", role = \"aut\", comment = c(ORCID = \"0000-0002-4064-6012\")), person(\"Ken\", \"Brevoort\", , \"ken@brevoort.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-4001-8358\")), person(\"Olivier\", \"Roy\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", "Description": "Build display tables from tabular data with an easy-to-use set of functions. With its progressive approach, we can construct display tables with a cohesive set of table parts. Table values can be formatted using any of the included formatting functions. Footnotes and cell styles can be precisely added through a location targeting system. The way in which 'gt' handles things for you means that you don't often have to worry about the fine details.", "License": "MIT + file LICENSE", "URL": "https://gt.rstudio.com, https://github.com/rstudio/gt", "BugReports": "https://github.com/rstudio/gt/issues", "Depends": [ - "R (>= 4.1.0)" + "R (>= 3.6.0)" ], "Imports": [ "base64enc (>= 0.1-3)", @@ -4054,7 +4052,6 @@ "xml2 (>= 1.3.6)" ], "Suggests": [ - "bit64", "farver", "fontawesome (>= 0.5.2)", "ggplot2", @@ -4082,9 +4079,9 @@ "Config/testthat/parallel": "true", "Encoding": "UTF-8", "LazyData": "true", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "NeedsCompilation": "no", - "Author": "Richard Iannone [aut, cre] (ORCID: ), Joe Cheng [aut], Barret Schloerke [aut] (ORCID: ), Shannon Haughton [aut], Ellis Hughes [aut] (ORCID: ), Alexandra Lauer [aut] (ORCID: ), Romain François [aut], JooYoung Seo [aut] (ORCID: ), Ken Brevoort [aut] (ORCID: ), Olivier Roy [aut], Posit Software, PBC [cph, fnd]", + "Author": "Richard Iannone [aut, cre] (ORCID: ), Joe Cheng [aut], Barret Schloerke [aut] (ORCID: ), Ellis Hughes [aut] (ORCID: ), Alexandra Lauer [aut] (ORCID: ), JooYoung Seo [aut] (ORCID: ), Ken Brevoort [aut] (ORCID: ), Olivier Roy [aut], Posit Software, PBC [cph, fnd]", "Maintainer": "Richard Iannone ", "Repository": "CRAN" }, @@ -4517,19 +4514,19 @@ }, "httr": { "Package": "httr", - "Version": "1.4.8", + "Version": "1.4.7", "Source": "Repository", "Title": "Tools for Working with URLs and HTTP", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\")) )", "Description": "Useful tools for working with HTTP organised by HTTP verbs (GET(), POST(), etc). Configuration functions make it easy to control additional request components (authenticate(), add_headers() and so on).", "License": "MIT + file LICENSE", "URL": "https://httr.r-lib.org/, https://github.com/r-lib/httr", "BugReports": "https://github.com/r-lib/httr/issues", "Depends": [ - "R (>= 3.6)" + "R (>= 3.5)" ], "Imports": [ - "curl (>= 5.1.0)", + "curl (>= 5.0.2)", "jsonlite", "mime", "openssl (>= 0.8)", @@ -4549,15 +4546,15 @@ "VignetteBuilder": "knitr", "Config/Needs/website": "tidyverse/tidytemplate", "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.2.3", "NeedsCompilation": "no", - "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd]", + "Author": "Hadley Wickham [aut, cre], Posit, PBC [cph, fnd]", "Maintainer": "Hadley Wickham ", "Repository": "CRAN" }, "insight": { "Package": "insight", - "Version": "1.4.6", + "Version": "1.4.4", "Source": "Repository", "Type": "Package", "Title": "Easy Access to Model Information for Various Model Objects", @@ -4679,7 +4676,6 @@ "quantreg", "Rcpp", "RcppEigen", - "recipes", "rmarkdown", "rms", "robustbase", @@ -4700,7 +4696,6 @@ "survival", "svylme", "testthat", - "tidymodels", "tinytable (>= 0.13.0)", "TMB", "truncreg", @@ -4708,8 +4703,7 @@ "tweedie", "VGAM", "WeightIt", - "withr", - "workflows" + "withr" ], "VignetteBuilder": "knitr", "Encoding": "UTF-8", @@ -4906,7 +4900,7 @@ }, "knitr": { "Package": "knitr", - "Version": "1.51", + "Version": "1.50", "Source": "Repository", "Type": "Package", "Title": "A General-Purpose Package for Dynamic Report Generation in R", @@ -4920,11 +4914,12 @@ "highr (>= 0.11)", "methods", "tools", - "xfun (>= 0.52)", + "xfun (>= 0.51)", "yaml (>= 2.1.19)" ], "Suggests": [ "bslib", + "codetools", "DBI (>= 0.4-1)", "digest", "formatR", @@ -4936,8 +4931,6 @@ "magick", "litedown", "markdown (>= 1.3)", - "otel", - "otelsdk", "png", "ragg", "reticulate (>= 1.4)", @@ -4962,10 +4955,10 @@ "Encoding": "UTF-8", "VignetteBuilder": "litedown, knitr", "SystemRequirements": "Package vignettes based on R Markdown v2 or reStructuredText require Pandoc (http://pandoc.org). The function rst2pdf() requires rst2pdf (https://github.com/rst2pdf/rst2pdf).", - "Collate": "'block.R' 'cache.R' 'citation.R' 'hooks-html.R' 'plot.R' 'utils.R' 'defaults.R' 'concordance.R' 'engine.R' 'highlight.R' 'themes.R' 'header.R' 'hooks-asciidoc.R' 'hooks-chunk.R' 'hooks-extra.R' 'hooks-latex.R' 'hooks-md.R' 'hooks-rst.R' 'hooks-textile.R' 'hooks.R' 'otel.R' 'output.R' 'package.R' 'pandoc.R' 'params.R' 'parser.R' 'pattern.R' 'rocco.R' 'spin.R' 'table.R' 'template.R' 'utils-conversion.R' 'utils-rd2html.R' 'utils-string.R' 'utils-sweave.R' 'utils-upload.R' 'utils-vignettes.R' 'zzz.R'", - "RoxygenNote": "7.3.3", + "Collate": "'block.R' 'cache.R' 'citation.R' 'hooks-html.R' 'plot.R' 'utils.R' 'defaults.R' 'concordance.R' 'engine.R' 'highlight.R' 'themes.R' 'header.R' 'hooks-asciidoc.R' 'hooks-chunk.R' 'hooks-extra.R' 'hooks-latex.R' 'hooks-md.R' 'hooks-rst.R' 'hooks-textile.R' 'hooks.R' 'output.R' 'package.R' 'pandoc.R' 'params.R' 'parser.R' 'pattern.R' 'rocco.R' 'spin.R' 'table.R' 'template.R' 'utils-conversion.R' 'utils-rd2html.R' 'utils-string.R' 'utils-sweave.R' 'utils-upload.R' 'utils-vignettes.R' 'zzz.R'", + "RoxygenNote": "7.3.2", "NeedsCompilation": "no", - "Author": "Yihui Xie [aut, cre] (ORCID: , URL: https://yihui.org), Abhraneel Sarma [ctb], Adam Vogt [ctb], Alastair Andrew [ctb], Alex Zvoleff [ctb], Amar Al-Zubaidi [ctb], Andre Simon [ctb] (the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de), Aron Atkins [ctb], Aaron Wolen [ctb], Ashley Manton [ctb], Atsushi Yasumoto [ctb] (ORCID: ), Ben Baumer [ctb], Brian Diggs [ctb], Brian Zhang [ctb], Bulat Yapparov [ctb], Cassio Pereira [ctb], Christophe Dervieux [ctb], David Hall [ctb], David Hugh-Jones [ctb], David Robinson [ctb], Doug Hemken [ctb], Duncan Murdoch [ctb], Elio Campitelli [ctb], Ellis Hughes [ctb], Emily Riederer [ctb], Fabian Hirschmann [ctb], Fitch Simeon [ctb], Forest Fang [ctb], Frank E Harrell Jr [ctb] (the Sweavel package at inst/misc/Sweavel.sty), Garrick Aden-Buie [ctb], Gregoire Detrez [ctb], Hadley Wickham [ctb], Hao Zhu [ctb], Heewon Jeon [ctb], Henrik Bengtsson [ctb], Hiroaki Yutani [ctb], Ian Lyttle [ctb], Hodges Daniel [ctb], Jacob Bien [ctb], Jake Burkhead [ctb], James Manton [ctb], Jared Lander [ctb], Jason Punyon [ctb], Javier Luraschi [ctb], Jeff Arnold [ctb], Jenny Bryan [ctb], Jeremy Ashkenas [ctb, cph] (the CSS file at inst/misc/docco-classic.css), Jeremy Stephens [ctb], Jim Hester [ctb], Joe Cheng [ctb], Johannes Ranke [ctb], John Honaker [ctb], John Muschelli [ctb], Jonathan Keane [ctb], JJ Allaire [ctb], Johan Toloe [ctb], Jonathan Sidi [ctb], Joseph Larmarange [ctb], Julien Barnier [ctb], Kaiyin Zhong [ctb], Kamil Slowikowski [ctb], Karl Forner [ctb], Kevin K. Smith [ctb], Kirill Mueller [ctb], Kohske Takahashi [ctb], Lorenz Walthert [ctb], Lucas Gallindo [ctb], Marius Hofert [ctb], Martin Modrák [ctb], Michael Chirico [ctb], Michael Friendly [ctb], Michal Bojanowski [ctb], Michel Kuhlmann [ctb], Miller Patrick [ctb], Nacho Caballero [ctb], Nick Salkowski [ctb], Niels Richard Hansen [ctb], Noam Ross [ctb], Obada Mahdi [ctb], Pavel N. Krivitsky [ctb] (ORCID: ), Pedro Faria [ctb], Qiang Li [ctb], Ramnath Vaidyanathan [ctb], Richard Cotton [ctb], Robert Krzyzanowski [ctb], Rodrigo Copetti [ctb], Romain Francois [ctb], Ruaridh Williamson [ctb], Sagiru Mati [ctb] (ORCID: ), Scott Kostyshak [ctb], Sebastian Meyer [ctb], Sietse Brouwer [ctb], Simon de Bernard [ctb], Sylvain Rousseau [ctb], Taiyun Wei [ctb], Thibaut Assus [ctb], Thibaut Lamadon [ctb], Thomas Leeper [ctb], Tim Mastny [ctb], Tom Torsney-Weir [ctb], Trevor Davis [ctb], Viktoras Veitas [ctb], Weicheng Zhu [ctb], Wush Wu [ctb], Zachary Foster [ctb], Zhian N. Kamvar [ctb] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Author": "Yihui Xie [aut, cre] (, https://yihui.org), Abhraneel Sarma [ctb], Adam Vogt [ctb], Alastair Andrew [ctb], Alex Zvoleff [ctb], Amar Al-Zubaidi [ctb], Andre Simon [ctb] (the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de), Aron Atkins [ctb], Aaron Wolen [ctb], Ashley Manton [ctb], Atsushi Yasumoto [ctb] (), Ben Baumer [ctb], Brian Diggs [ctb], Brian Zhang [ctb], Bulat Yapparov [ctb], Cassio Pereira [ctb], Christophe Dervieux [ctb], David Hall [ctb], David Hugh-Jones [ctb], David Robinson [ctb], Doug Hemken [ctb], Duncan Murdoch [ctb], Elio Campitelli [ctb], Ellis Hughes [ctb], Emily Riederer [ctb], Fabian Hirschmann [ctb], Fitch Simeon [ctb], Forest Fang [ctb], Frank E Harrell Jr [ctb] (the Sweavel package at inst/misc/Sweavel.sty), Garrick Aden-Buie [ctb], Gregoire Detrez [ctb], Hadley Wickham [ctb], Hao Zhu [ctb], Heewon Jeon [ctb], Henrik Bengtsson [ctb], Hiroaki Yutani [ctb], Ian Lyttle [ctb], Hodges Daniel [ctb], Jacob Bien [ctb], Jake Burkhead [ctb], James Manton [ctb], Jared Lander [ctb], Jason Punyon [ctb], Javier Luraschi [ctb], Jeff Arnold [ctb], Jenny Bryan [ctb], Jeremy Ashkenas [ctb, cph] (the CSS file at inst/misc/docco-classic.css), Jeremy Stephens [ctb], Jim Hester [ctb], Joe Cheng [ctb], Johannes Ranke [ctb], John Honaker [ctb], John Muschelli [ctb], Jonathan Keane [ctb], JJ Allaire [ctb], Johan Toloe [ctb], Jonathan Sidi [ctb], Joseph Larmarange [ctb], Julien Barnier [ctb], Kaiyin Zhong [ctb], Kamil Slowikowski [ctb], Karl Forner [ctb], Kevin K. Smith [ctb], Kirill Mueller [ctb], Kohske Takahashi [ctb], Lorenz Walthert [ctb], Lucas Gallindo [ctb], Marius Hofert [ctb], Martin Modrák [ctb], Michael Chirico [ctb], Michael Friendly [ctb], Michal Bojanowski [ctb], Michel Kuhlmann [ctb], Miller Patrick [ctb], Nacho Caballero [ctb], Nick Salkowski [ctb], Niels Richard Hansen [ctb], Noam Ross [ctb], Obada Mahdi [ctb], Pavel N. Krivitsky [ctb] (), Pedro Faria [ctb], Qiang Li [ctb], Ramnath Vaidyanathan [ctb], Richard Cotton [ctb], Robert Krzyzanowski [ctb], Rodrigo Copetti [ctb], Romain Francois [ctb], Ruaridh Williamson [ctb], Sagiru Mati [ctb] (), Scott Kostyshak [ctb], Sebastian Meyer [ctb], Sietse Brouwer [ctb], Simon de Bernard [ctb], Sylvain Rousseau [ctb], Taiyun Wei [ctb], Thibaut Assus [ctb], Thibaut Lamadon [ctb], Thomas Leeper [ctb], Tim Mastny [ctb], Tom Torsney-Weir [ctb], Trevor Davis [ctb], Viktoras Veitas [ctb], Weicheng Zhu [ctb], Wush Wu [ctb], Zachary Foster [ctb], Zhian N. Kamvar [ctb] (), Posit Software, PBC [cph, fnd]", "Maintainer": "Yihui Xie ", "Repository": "CRAN" }, @@ -5041,26 +5034,22 @@ }, "later": { "Package": "later", - "Version": "1.4.6", + "Version": "1.4.4", "Source": "Repository", "Type": "Package", "Title": "Utilities for Scheduling Functions to Execute Later with Event Loops", - "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Charlie\", \"Gao\", , \"charlie.gao@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-0750-061X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"Marcus\", \"Geelnard\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\"), person(\"Evan\", \"Nemerson\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\") )", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\"), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Charlie\", \"Gao\", , \"charlie.gao@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-0750-061X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"Marcus\", \"Geelnard\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\"), person(\"Evan\", \"Nemerson\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\") )", "Description": "Executes arbitrary R or C functions some time after the current time, after the R execution stack has emptied. The functions are scheduled in an event loop.", "License": "MIT + file LICENSE", "URL": "https://later.r-lib.org, https://github.com/r-lib/later", "BugReports": "https://github.com/r-lib/later/issues", - "Depends": [ - "R (>= 3.5)" - ], "Imports": [ - "Rcpp (>= 1.0.10)", + "Rcpp (>= 0.12.9)", "rlang" ], "Suggests": [ "knitr", "nanonext", - "promises", "rmarkdown", "testthat (>= 3.0.0)" ], @@ -5068,14 +5057,13 @@ "Rcpp" ], "VignetteBuilder": "knitr", - "Config/build/compilation-database": "true", "Config/Needs/website": "tidyverse/tidytemplate", "Config/testthat/edition": "3", "Config/usethis/last-upkeep": "2025-07-18", "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "NeedsCompilation": "yes", - "Author": "Winston Chang [aut] (ORCID: ), Joe Cheng [aut], Charlie Gao [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: ), Marcus Geelnard [ctb, cph] (TinyCThread library, https://tinycthread.github.io/), Evan Nemerson [ctb, cph] (TinyCThread library, https://tinycthread.github.io/)", + "Author": "Winston Chang [aut], Joe Cheng [aut], Charlie Gao [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: ), Marcus Geelnard [ctb, cph] (TinyCThread library, https://tinycthread.github.io/), Evan Nemerson [ctb, cph] (TinyCThread library, https://tinycthread.github.io/)", "Maintainer": "Charlie Gao ", "Repository": "CRAN" }, @@ -5145,7 +5133,7 @@ }, "lifecycle": { "Package": "lifecycle", - "Version": "1.0.5", + "Version": "1.0.4", "Source": "Repository", "Title": "Manage the Life Cycle of your Package Functions", "Authors@R": "c( person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", @@ -5158,34 +5146,35 @@ ], "Imports": [ "cli (>= 3.4.0)", + "glue", "rlang (>= 1.1.0)" ], "Suggests": [ "covr", + "crayon", "knitr", - "lintr (>= 3.1.0)", + "lintr", "rmarkdown", "testthat (>= 3.0.1)", "tibble", "tidyverse", "tools", "vctrs", - "withr", - "xml2" + "withr" ], "VignetteBuilder": "knitr", "Config/Needs/website": "tidyverse/tidytemplate, usethis", "Config/testthat/edition": "3", "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.2.1", "NeedsCompilation": "no", - "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut] (), Posit Software, PBC [cph, fnd]", "Maintainer": "Lionel Henry ", "Repository": "CRAN" }, "litedown": { "Package": "litedown", - "Version": "0.9", + "Version": "0.8", "Source": "Repository", "Type": "Package", "Title": "A Lightweight Version of R Markdown", @@ -5197,7 +5186,7 @@ "Imports": [ "utils", "commonmark (>= 2.0.0)", - "xfun (>= 0.55)" + "xfun (>= 0.54)" ], "Suggests": [ "rbibutils", @@ -5320,14 +5309,14 @@ }, "lubridate": { "Package": "lubridate", - "Version": "1.9.5", + "Version": "1.9.4", "Source": "Repository", "Type": "Package", "Title": "Make Dealing with Dates a Little Easier", "Authors@R": "c( person(\"Vitalie\", \"Spinu\", , \"spinuvit@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Garrett\", \"Grolemund\", role = \"aut\"), person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Davis\", \"Vaughan\", role = \"ctb\"), person(\"Ian\", \"Lyttle\", role = \"ctb\"), person(\"Imanuel\", \"Costigan\", role = \"ctb\"), person(\"Jason\", \"Law\", role = \"ctb\"), person(\"Doug\", \"Mitarotonda\", role = \"ctb\"), person(\"Joseph\", \"Larmarange\", role = \"ctb\"), person(\"Jonathan\", \"Boiser\", role = \"ctb\"), person(\"Chel Hee\", \"Lee\", role = \"ctb\") )", "Maintainer": "Vitalie Spinu ", "Description": "Functions to work with date-times and time-spans: fast and user friendly parsing of date-time data, extraction and updating of components of a date-time (years, months, days, hours, minutes, and seconds), algebraic manipulation on date-time and time-span objects. The 'lubridate' package has a consistent and memorable syntax that makes working with dates easy and fun.", - "License": "MIT + file LICENSE", + "License": "GPL (>= 2)", "URL": "https://lubridate.tidyverse.org, https://github.com/tidyverse/lubridate", "BugReports": "https://github.com/tidyverse/lubridate/issues", "Depends": [ @@ -5336,7 +5325,7 @@ ], "Imports": [ "generics", - "timechange (>= 0.4.0)" + "timechange (>= 0.3.0)" ], "Suggests": [ "covr", @@ -5357,8 +5346,8 @@ "Config/testthat/edition": "3", "Encoding": "UTF-8", "LazyData": "true", - "RoxygenNote": "7.3.3", - "SystemRequirements": "A system with zoneinfo data (e.g. /usr/share/zoneinfo). On Windows the zoneinfo included with R is used.", + "RoxygenNote": "7.2.3", + "SystemRequirements": "C++11, A system with zoneinfo data (e.g. /usr/share/zoneinfo). On Windows the zoneinfo included with R is used.", "Collate": "'Dates.r' 'POSIXt.r' 'util.r' 'parse.r' 'timespans.r' 'intervals.r' 'difftimes.r' 'durations.r' 'periods.r' 'accessors-date.R' 'accessors-day.r' 'accessors-dst.r' 'accessors-hour.r' 'accessors-minute.r' 'accessors-month.r' 'accessors-quarter.r' 'accessors-second.r' 'accessors-tz.r' 'accessors-week.r' 'accessors-year.r' 'am-pm.r' 'time-zones.r' 'numeric.r' 'coercion.r' 'constants.r' 'cyclic_encoding.r' 'data.r' 'decimal-dates.r' 'deprecated.r' 'format_ISO8601.r' 'guess.r' 'hidden.r' 'instants.r' 'leap-years.r' 'ops-addition.r' 'ops-compare.r' 'ops-division.r' 'ops-integer-division.r' 'ops-m+.r' 'ops-modulo.r' 'ops-multiplication.r' 'ops-subtraction.r' 'package.r' 'pretty.r' 'round.r' 'stamp.r' 'tzdir.R' 'update.r' 'vctrs.R' 'zzz.R'", "NeedsCompilation": "yes", "Author": "Vitalie Spinu [aut, cre], Garrett Grolemund [aut], Hadley Wickham [aut], Davis Vaughan [ctb], Ian Lyttle [ctb], Imanuel Costigan [ctb], Jason Law [ctb], Doug Mitarotonda [ctb], Joseph Larmarange [ctb], Jonathan Boiser [ctb], Chel Hee Lee [ctb]", @@ -5459,14 +5448,14 @@ }, "mgcv": { "Package": "mgcv", - "Version": "1.9-3", + "Version": "1.9-4", "Source": "Repository", "Authors@R": "person(given = \"Simon\", family = \"Wood\", role = c(\"aut\", \"cre\"), email = \"simon.wood@r-project.org\")", "Title": "Mixed GAM Computation Vehicle with Automatic Smoothness Estimation", - "Description": "Generalized additive (mixed) models, some of their extensions and other generalized ridge regression with multiple smoothing parameter estimation by (Restricted) Marginal Likelihood, Generalized Cross Validation and similar, or using iterated nested Laplace approximation for fully Bayesian inference. See Wood (2017) for an overview. Includes a gam() function, a wide variety of smoothers, 'JAGS' support and distributions beyond the exponential family.", + "Description": "Generalized additive (mixed) models, some of their extensions and other generalized ridge regression with multiple smoothing parameter estimation by (Restricted) Marginal Likelihood, Cross Validation and similar, or using iterated nested Laplace approximation for fully Bayesian inference. See Wood (2025) for an overview. Includes a gam() function, a wide variety of smoothers, 'JAGS' support and distributions beyond the exponential family.", "Priority": "recommended", "Depends": [ - "R (>= 3.6.0)", + "R (>= 4.4.0)", "nlme (>= 3.1-64)" ], "Imports": [ @@ -5535,20 +5524,20 @@ }, "minty": { "Package": "minty", - "Version": "0.0.6", + "Version": "0.0.5", "Source": "Repository", "Title": "Minimal Type Guesser", "Authors@R": "c( person(\"Chung-hong\", \"Chan\", role = c(\"aut\", \"cre\"), email = \"chainsawtiney@gmail.com\", comment = c(ORCID = \"0000-0002-6232-7530\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = \"author of the ported code from readr\"), person(\"Jim\", \"Hester\", role = \"aut\", comment = \"author of the ported code from readr\"), person(\"Romain\", \"Francois\", role = \"ctb\", comment = \"author of the ported code from readr\"), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\"), comment = \"author of the ported code from readr\"), person(\"Shelby\", \"Bearrows\", role = \"ctb\", comment = \"author of the ported code from readr\"), person(\"Posit Software, PBC\", role = \"cph\", comment = \"copyright holder of readr\"), person(\"David\", \"Olson\", role = \"aut\", comment = \"author of src/tzfile.h\") )", "Description": "Port the type guesser from 'readr' (so-called 'readr' first edition parsing engine, now superseded by 'vroom').", "License": "MIT + file LICENSE", - "URL": "https://gesistsa.github.io/minty/, https://codeberg.org/chainsawriot/minty", - "BugReports": "https://codeberg.org/chainsawriot/minty/issues", + "URL": "https://gesistsa.github.io/minty/, https://github.com/gesistsa/minty", + "BugReports": "https://github.com/gesistsa/minty/issues", "Depends": [ - "R (>= 4.0)" + "R (>= 3.6)" ], "LinkingTo": [ - "cpp11 (>= 0.5.3)", - "tzdb (>= 0.5.0)" + "cpp11 (>= 0.5.0)", + "tzdb (>= 0.1.1)" ], "Config/testthat/edition": "3", "Config/testthat/parallel": "false", @@ -5568,13 +5557,13 @@ ], "Config/Needs/website": "gesistsa/tsatemplate", "NeedsCompilation": "yes", - "Author": "Chung-hong Chan [aut, cre] (ORCID: ), Hadley Wickham [aut] (author of the ported code from readr), Jim Hester [aut] (author of the ported code from readr), Romain Francois [ctb] (author of the ported code from readr), Jennifer Bryan [aut] (author of the ported code from readr), Shelby Bearrows [ctb] (author of the ported code from readr), Posit Software, PBC [cph] (copyright holder of readr), David Olson [aut] (author of src/tzfile.h)", + "Author": "Chung-hong Chan [aut, cre] (), Hadley Wickham [aut] (author of the ported code from readr), Jim Hester [aut] (author of the ported code from readr), Romain Francois [ctb] (author of the ported code from readr), Jennifer Bryan [aut] (author of the ported code from readr), Shelby Bearrows [ctb] (author of the ported code from readr), Posit Software, PBC [cph] (copyright holder of readr), David Olson [aut] (author of src/tzfile.h)", "Maintainer": "Chung-hong Chan ", "Repository": "CRAN" }, "modelbased": { "Package": "modelbased", - "Version": "0.14.0", + "Version": "0.13.1", "Source": "Repository", "Type": "Package", "Title": "Estimation of Model-Based Predictions, Contrasts and Means", @@ -5590,7 +5579,7 @@ "Imports": [ "bayestestR (>= 0.17.0)", "datawizard (>= 1.3.0)", - "insight (>= 1.4.4)", + "insight (>= 1.4.3)", "parameters (>= 0.28.3)", "graphics", "stats", @@ -5802,11 +5791,11 @@ }, "officer": { "Package": "officer", - "Version": "0.7.3", + "Version": "0.7.2", "Source": "Repository", "Type": "Package", "Title": "Manipulation of Microsoft Word and PowerPoint Documents", - "Authors@R": "c( person(\"David\", \"Gohel\", , \"david.gohel@ardata.fr\", role = c(\"aut\", \"cre\")), person(\"Stefan\", \"Moog\", , \"moogs@gmx.de\", role = \"aut\"), person(\"Mark\", \"Heckmann\", , \"heckmann.mark@gmail.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-0736-7417\")), person(\"ArData\", role = \"cph\"), person(\"Frank\", \"Hangler\", , \"frank@plotandscatter.com\", role = \"ctb\", comment = \"function body_replace_all_text\"), person(\"Liz\", \"Sander\", , \"lsander@civisanalytics.com\", role = \"ctb\", comment = \"several documentation fixes\"), person(\"Anton\", \"Victorson\", , \"anton@victorson.se\", role = \"ctb\", comment = \"fixes xml structures\"), person(\"Jon\", \"Calder\", , \"jonmcalder@gmail.com\", role = \"ctb\", comment = \"update vignettes\"), person(\"John\", \"Harrold\", , \"john.m.harrold@gmail.com\", role = \"ctb\", comment = \"function annotate_base\"), person(\"John\", \"Muschelli\", , \"muschellij2@gmail.com\", role = \"ctb\", comment = \"google doc compatibility\"), person(\"Bill\", \"Denney\", , \"wdenney@humanpredictions.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5759-428X\", \"function as.matrix.rpptx\")), person(\"Nikolai\", \"Beck\", , \"beck.nikolai@gmail.com\", role = \"ctb\", comment = \"set speaker notes for .pptx documents\"), person(\"Greg\", \"Leleu\", , \"gregoire.leleu@gmail.com\", role = \"ctb\", comment = \"fields functionality in ppt\"), person(\"Majid\", \"Eismann\", role = \"ctb\"), person(\"Wahiduzzaman\", \"Khan\", role = \"ctb\", comment = \"vectorization of remove_slide\"), person(\"Hongyuan\", \"Jia\", , \"hongyuanjia@cqust.edu.cn\", role = \"ctb\", comment = c(ORCID = \"0000-0002-0075-8183\")), person(\"Michael\", \"Stackhouse\", , \"mike.stackhouse@atorusresearch.com\", role = \"ctb\") )", + "Authors@R": "c( person(\"David\", \"Gohel\", , \"david.gohel@ardata.fr\", role = c(\"aut\", \"cre\")), person(\"Stefan\", \"Moog\", , \"moogs@gmx.de\", role = \"aut\"), person(\"Mark\", \"Heckmann\", , \"heckmann.mark@gmail.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-0736-7417\")), person(\"ArData\", role = \"cph\"), person(\"Frank\", \"Hangler\", , \"frank@plotandscatter.com\", role = \"ctb\", comment = \"function body_replace_all_text\"), person(\"Liz\", \"Sander\", , \"lsander@civisanalytics.com\", role = \"ctb\", comment = \"several documentation fixes\"), person(\"Anton\", \"Victorson\", , \"anton@victorson.se\", role = \"ctb\", comment = \"fixes xml structures\"), person(\"Jon\", \"Calder\", , \"jonmcalder@gmail.com\", role = \"ctb\", comment = \"update vignettes\"), person(\"John\", \"Harrold\", , \"john.m.harrold@gmail.com\", role = \"ctb\", comment = \"function annotate_base\"), person(\"John\", \"Muschelli\", , \"muschellij2@gmail.com\", role = \"ctb\", comment = \"google doc compatibility\"), person(\"Bill\", \"Denney\", , \"wdenney@humanpredictions.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5759-428X\", \"function as.matrix.rpptx\")), person(\"Nikolai\", \"Beck\", , \"beck.nikolai@gmail.com\", role = \"ctb\", comment = \"set speaker notes for .pptx documents\"), person(\"Greg\", \"Leleu\", , \"gregoire.leleu@gmail.com\", role = \"ctb\", comment = \"fields functionality in ppt\"), person(\"Majid\", \"Eismann\", role = \"ctb\"), person(\"Hongyuan\", \"Jia\", , \"hongyuanjia@cqust.edu.cn\", role = \"ctb\", comment = c(ORCID = \"0000-0002-0075-8183\")), person(\"Michael\", \"Stackhouse\", , \"mike.stackhouse@atorusresearch.com\", role = \"ctb\") )", "Description": "Access and manipulate 'Microsoft Word', 'RTF' and 'Microsoft PowerPoint' documents from R. The package focuses on tabular and graphical reporting from R; it also provides two functions that let users get document content into data objects. A set of functions lets add and remove images, tables and paragraphs of text in new or existing documents. The package does not require any installation of Microsoft products to be able to write Microsoft files.", "License": "MIT + file LICENSE", "URL": "https://ardata-fr.github.io/officeverse/, https://davidgohel.github.io/officer/", @@ -5842,7 +5831,7 @@ "RoxygenNote": "7.3.3", "Collate": "'core_properties.R' 'custom_properties.R' 'defunct.R' 'dev-utils.R' 'docx_add.R' 'docx_comments.R' 'docx_cursor.R' 'docx_part.R' 'docx_replace.R' 'docx_section.R' 'docx_settings.R' 'docx_styles.R' 'docx_utils_funs.R' 'empty_content.R' 'formatting_properties.R' 'fortify_docx.R' 'fortify_pptx.R' 'knitr_utils.R' 'officer.R' 'ooxml.R' 'ooxml_block_objects.R' 'ooxml_run_objects.R' 'openxml_content_type.R' 'openxml_document.R' 'pack_folder.R' 'ph_location.R' 'post-proc.R' 'ppt_class_dir_collection.R' 'ppt_classes.R' 'ppt_notes.R' 'ppt_ph_dedupe_layout.R' 'ppt_ph_manipulate.R' 'ppt_ph_rename_layout.R' 'ppt_ph_with_methods.R' 'pptx_informations.R' 'pptx_layout_helper.R' 'pptx_matrix.R' 'utils.R' 'pptx_slide_manip.R' 'read_docx.R' 'docx_write.R' 'read_docx_styles.R' 'read_pptx.R' 'read_xlsx.R' 'relationship.R' 'rtf.R' 'shape_properties.R' 'shorcuts.R' 'docx_append_context.R' 'utils-xml.R' 'deprecated.R' 'zzz.R'", "NeedsCompilation": "no", - "Author": "David Gohel [aut, cre], Stefan Moog [aut], Mark Heckmann [aut] (ORCID: ), ArData [cph], Frank Hangler [ctb] (function body_replace_all_text), Liz Sander [ctb] (several documentation fixes), Anton Victorson [ctb] (fixes xml structures), Jon Calder [ctb] (update vignettes), John Harrold [ctb] (function annotate_base), John Muschelli [ctb] (google doc compatibility), Bill Denney [ctb] (ORCID: , function as.matrix.rpptx), Nikolai Beck [ctb] (set speaker notes for .pptx documents), Greg Leleu [ctb] (fields functionality in ppt), Majid Eismann [ctb], Wahiduzzaman Khan [ctb] (vectorization of remove_slide), Hongyuan Jia [ctb] (ORCID: ), Michael Stackhouse [ctb]", + "Author": "David Gohel [aut, cre], Stefan Moog [aut], Mark Heckmann [aut] (ORCID: ), ArData [cph], Frank Hangler [ctb] (function body_replace_all_text), Liz Sander [ctb] (several documentation fixes), Anton Victorson [ctb] (fixes xml structures), Jon Calder [ctb] (update vignettes), John Harrold [ctb] (function annotate_base), John Muschelli [ctb] (google doc compatibility), Bill Denney [ctb] (ORCID: , function as.matrix.rpptx), Nikolai Beck [ctb] (set speaker notes for .pptx documents), Greg Leleu [ctb] (fields functionality in ppt), Majid Eismann [ctb], Hongyuan Jia [ctb] (ORCID: ), Michael Stackhouse [ctb]", "Maintainer": "David Gohel ", "Repository": "CRAN" }, @@ -5915,7 +5904,7 @@ }, "openxlsx2": { "Package": "openxlsx2", - "Version": "1.23.1", + "Version": "1.22", "Source": "Repository", "Type": "Package", "Title": "Read, Write and Edit 'xlsx' Files", @@ -6234,7 +6223,7 @@ }, "performance": { "Package": "performance", - "Version": "0.16.0", + "Version": "0.15.3", "Source": "Repository", "Type": "Package", "Title": "Assessment of Regression Models Performance", @@ -6249,7 +6238,7 @@ ], "Imports": [ "bayestestR (>= 0.17.0)", - "insight (>= 1.4.4)", + "insight (>= 1.4.2)", "datawizard (>= 1.3.0)", "stats", "methods", @@ -6326,7 +6315,7 @@ "rstanarm", "rstantools", "sandwich", - "see (>= 0.13.0)", + "see (>= 0.9.0)", "survey", "survival", "testthat (>= 3.2.1)", @@ -6456,7 +6445,7 @@ }, "plotly": { "Package": "plotly", - "Version": "4.12.0", + "Version": "4.11.0", "Source": "Repository", "Title": "Create Interactive Web Graphics via 'plotly.js'", "Authors@R": "c(person(\"Carson\", \"Sievert\", role = c(\"aut\", \"cre\"), email = \"cpsievert1@gmail.com\", comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Chris\", \"Parmer\", role = \"aut\", email = \"chris@plot.ly\"), person(\"Toby\", \"Hocking\", role = \"aut\", email = \"tdhock5@gmail.com\"), person(\"Scott\", \"Chamberlain\", role = \"aut\", email = \"myrmecocystus@gmail.com\"), person(\"Karthik\", \"Ram\", role = \"aut\", email = \"karthik.ram@gmail.com\"), person(\"Marianne\", \"Corvellec\", role = \"aut\", email = \"marianne.corvellec@igdore.org\", comment = c(ORCID = \"0000-0002-1994-3581\")), person(\"Pedro\", \"Despouy\", role = \"aut\", email = \"pedro@plot.ly\"), person(\"Salim\", \"Brüggemann\", role = \"ctb\", email = \"salim-b@pm.me\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Plotly Technologies Inc.\", role = \"cph\"))", @@ -6465,7 +6454,7 @@ "URL": "https://plotly-r.com, https://github.com/plotly/plotly.R, https://plotly.com/r/", "BugReports": "https://github.com/plotly/plotly.R/issues", "Depends": [ - "R (>= 3.5.0)", + "R (>= 3.2.0)", "ggplot2 (>= 3.0.0)" ], "Imports": [ @@ -6523,7 +6512,7 @@ "ggridges" ], "LazyData": "true", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "Encoding": "UTF-8", "Config/Needs/check": "tidyverse/ggplot2, ggobi/GGally, rcmdcheck, devtools, reshape2, s2", "NeedsCompilation": "no", @@ -6591,7 +6580,7 @@ }, "polylabelr": { "Package": "polylabelr", - "Version": "1.0.0", + "Version": "0.3.0", "Source": "Repository", "Title": "Find the Pole of Inaccessibility (Visual Center) of a Polygon", "Authors@R": "c(person(given = \"Johan\", family = \"Larsson\", role = c(\"aut\", \"cre\"), email = \"johanlarsson@outlook.com\", comment = c(ORCID = \"0000-0002-4029-5945\")), person(given = \"Kent\", family = \"Johnson\", role = \"ctb\", email = \"kent@kentsjohnson.com\"), person(\"Mapbox\", role = \"cph\", comment = \"polylabel, variant, and geometry libraries\"))", @@ -6610,7 +6599,7 @@ "Imports": [ "Rcpp" ], - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "Suggests": [ "covr", "testthat", @@ -6619,7 +6608,7 @@ ], "Language": "en-US", "NeedsCompilation": "yes", - "Author": "Johan Larsson [aut, cre] (ORCID: ), Kent Johnson [ctb], Mapbox [cph] (polylabel, variant, and geometry libraries)", + "Author": "Johan Larsson [aut, cre] (), Kent Johnson [ctb], Mapbox [cph] (polylabel, variant, and geometry libraries)", "Maintainer": "Johan Larsson ", "Repository": "CRAN" }, @@ -6800,11 +6789,11 @@ }, "proxy": { "Package": "proxy", - "Version": "0.4-29", + "Version": "0.4-27", "Source": "Repository", "Type": "Package", "Title": "Distance and Similarity Measures", - "Authors@R": "c(person(given = \"David\", family = \"Meyer\", role = c(\"aut\", \"cre\"), email = \"David.Meyer@R-project.org\", comment = c(ORCID = \"0000-0002-5196-3048\")),\t person(given = \"Christian\", family = \"Buchta\", role = \"aut\"))", + "Authors@R": "c(person(given = \"David\", family = \"Meyer\", role = c(\"aut\", \"cre\"), email = \"David.Meyer@R-project.org\"), person(given = \"Christian\", family = \"Buchta\", role = \"aut\"))", "Description": "Provides an extensible framework for the efficient calculation of auto- and cross-proximities, along with implementations of the most popular ones.", "Depends": [ "R (>= 3.4.0)" @@ -6817,9 +6806,9 @@ "cba" ], "Collate": "registry.R database.R dist.R similarities.R dissimilarities.R util.R seal.R", - "License": "GPL-2 | GPL-3", + "License": "GPL-2", "NeedsCompilation": "yes", - "Author": "David Meyer [aut, cre] (ORCID: ), Christian Buchta [aut]", + "Author": "David Meyer [aut, cre], Christian Buchta [aut]", "Maintainer": "David Meyer ", "Repository": "CRAN" }, @@ -6864,7 +6853,7 @@ }, "purrr": { "Package": "purrr", - "Version": "1.2.1", + "Version": "1.2.0", "Source": "Repository", "Title": "Functional Programming Tools", "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"https://ror.org/03wc8by49\")) )", @@ -7153,45 +7142,43 @@ }, "rappdirs": { "Package": "rappdirs", - "Version": "0.3.4", + "Version": "0.3.3", "Source": "Repository", "Type": "Package", "Title": "Application Directories: Determine Where to Save Data, Caches, and Logs", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"trl\", \"cre\", \"cph\")), person(\"Sridhar\", \"Ratnakumar\", role = \"aut\"), person(\"Trent\", \"Mick\", role = \"aut\"), person(\"ActiveState\", role = \"cph\", comment = \"R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs\"), person(\"Eddy\", \"Petrisor\", role = \"ctb\"), person(\"Trevor\", \"Davis\", role = c(\"trl\", \"aut\"), comment = c(ORCID = \"0000-0001-6341-4639\")), person(\"Gabor\", \"Csardi\", role = \"ctb\"), person(\"Gregory\", \"Jefferis\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Authors@R": "c(person(given = \"Hadley\", family = \"Wickham\", role = c(\"trl\", \"cre\", \"cph\"), email = \"hadley@rstudio.com\"), person(given = \"RStudio\", role = \"cph\"), person(given = \"Sridhar\", family = \"Ratnakumar\", role = \"aut\"), person(given = \"Trent\", family = \"Mick\", role = \"aut\"), person(given = \"ActiveState\", role = \"cph\", comment = \"R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs\"), person(given = \"Eddy\", family = \"Petrisor\", role = \"ctb\"), person(given = \"Trevor\", family = \"Davis\", role = c(\"trl\", \"aut\")), person(given = \"Gabor\", family = \"Csardi\", role = \"ctb\"), person(given = \"Gregory\", family = \"Jefferis\", role = \"ctb\"))", "Description": "An easy way to determine which directories on the users computer you should use to save data, caches and logs. A port of Python's 'Appdirs' () to R.", "License": "MIT + file LICENSE", "URL": "https://rappdirs.r-lib.org, https://github.com/r-lib/rappdirs", "BugReports": "https://github.com/r-lib/rappdirs/issues", "Depends": [ - "R (>= 4.1)" + "R (>= 3.2)" ], "Suggests": [ - "covr", "roxygen2", - "testthat (>= 3.2.0)", + "testthat (>= 3.0.0)", + "covr", "withr" ], - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Config/usethis/last-upkeep": "2025-05-05", - "Copyright": "Original python appdirs module copyright (c) 2010 ActiveState Software Inc. R port copyright Hadley Wickham, Posit, PBC. See file LICENSE for details.", + "Copyright": "Original python appdirs module copyright (c) 2010 ActiveState Software Inc. R port copyright Hadley Wickham, RStudio. See file LICENSE for details.", "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.1.1", + "Config/testthat/edition": "3", "NeedsCompilation": "yes", - "Author": "Hadley Wickham [trl, cre, cph], Sridhar Ratnakumar [aut], Trent Mick [aut], ActiveState [cph] (R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs), Eddy Petrisor [ctb], Trevor Davis [trl, aut] (ORCID: ), Gabor Csardi [ctb], Gregory Jefferis [ctb], Posit Software, PBC [cph, fnd] (ROR: )", - "Maintainer": "Hadley Wickham ", + "Author": "Hadley Wickham [trl, cre, cph], RStudio [cph], Sridhar Ratnakumar [aut], Trent Mick [aut], ActiveState [cph] (R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs), Eddy Petrisor [ctb], Trevor Davis [trl, aut], Gabor Csardi [ctb], Gregory Jefferis [ctb]", + "Maintainer": "Hadley Wickham ", "Repository": "CRAN" }, "rbibutils": { "Package": "rbibutils", - "Version": "2.4.1", + "Version": "2.4", "Source": "Repository", "Type": "Package", "Title": "Read 'Bibtex' Files and Convert Between Bibliography Formats", - "Authors@R": "c( person(given = c(\"Georgi\", \"N.\"), family = \"Boshnakov\", role = c(\"aut\", \"cre\"), \t email = \"georgi.boshnakov@manchester.ac.uk\", comment = c(ORCID = \"0000-0003-2839-346X\", \"R port, R code, new C code and modifications to bibutils' C code, conversion to Bibentry (R and C code)\") ), person(given = \"Chris\", family = \"Putman\", role = \"aut\", comment = \"src/*, author of the bibutils libraries, https://sourceforge.net/projects/bibutils/\"), person(given = \"Richard\", family = \"Mathar\", role = \"ctb\", comment = \"src/addsout.c\"), person(given = \"Johannes\", family = \"Wilm\", role = \"ctb\", comment = \"src/biblatexin.c, src/bltypes.c\"), person(\"R Core Team\", role = \"ctb\", comment = \"base R's bibentry and bibstyle implementation\") )", + "Authors@R": "c( person(given = c(\"Georgi\", \"N.\"), family = \"Boshnakov\", role = c(\"aut\", \"cre\"), \t email = \"georgi.boshnakov@manchester.ac.uk\", comment = c(\"R port, R code, new C code and modifications to bibutils' C code, conversion to Bibentry (R and C code)\", comment = c(ORCID = \"0000-0003-2839-346X\")) ), person(given = \"Chris\", family = \"Putman\", role = \"aut\", comment = \"src/*, author of the bibutils libraries, https://sourceforge.net/projects/bibutils/\"), person(given = \"Richard\", family = \"Mathar\", role = \"ctb\", comment = \"src/addsout.c\"), person(given = \"Johannes\", family = \"Wilm\", role = \"ctb\", comment = \"src/biblatexin.c, src/bltypes.c\"), person(\"R Core Team\", role = \"ctb\", comment = \"base R's bibentry and bibstyle implementation\") )", "Description": "Read and write 'Bibtex' files. Convert between bibliography formats, including 'Bibtex', 'Biblatex', 'PubMed', 'Endnote', and 'Bibentry'. Includes a port of the 'bibutils' utilities by Chris Putnam . Supports all bibliography formats and character encodings implemented in 'bibutils'.", "License": "GPL-2", - "URL": "https://geobosh.github.io/rbibutils/ (doc), https://CRAN.R-project.org/package=rbibutils", + "URL": "https://geobosh.github.io/rbibutils/ (doc), https://github.com/GeoBosh/rbibutils (devel)", "BugReports": "https://github.com/GeoBosh/rbibutils/issues", "Depends": [ "R (>= 2.10)" @@ -7206,7 +7193,7 @@ "Encoding": "UTF-8", "NeedsCompilation": "yes", "Config/Needs/memcheck": "devtools, rcmdcheck", - "Author": "Georgi N. Boshnakov [aut, cre] (ORCID: , R port, R code, new C code and modifications to bibutils' C code, conversion to Bibentry (R and C code)), Chris Putman [aut] (src/*, author of the bibutils libraries, https://sourceforge.net/projects/bibutils/), Richard Mathar [ctb] (src/addsout.c), Johannes Wilm [ctb] (src/biblatexin.c, src/bltypes.c), R Core Team [ctb] (base R's bibentry and bibstyle implementation)", + "Author": "Georgi N. Boshnakov [aut, cre] (R port, R code, new C code and modifications to bibutils' C code, conversion to Bibentry (R and C code), comment.ORCID: 0000-0003-2839-346X), Chris Putman [aut] (src/*, author of the bibutils libraries, https://sourceforge.net/projects/bibutils/), Richard Mathar [ctb] (src/addsout.c), Johannes Wilm [ctb] (src/biblatexin.c, src/bltypes.c), R Core Team [ctb] (base R's bibentry and bibstyle implementation)", "Maintainer": "Georgi N. Boshnakov ", "Repository": "CRAN" }, @@ -7333,31 +7320,29 @@ }, "readr": { "Package": "readr", - "Version": "2.2.0", + "Version": "2.1.6", "Source": "Repository", "Title": "Read Rectangular Text Data", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Romain\", \"Francois\", role = \"ctb\"), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Shelby\", \"Bearrows\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"https://github.com/mandreyel/\", role = \"cph\", comment = \"mio library\"), person(\"Jukka\", \"Jylänki\", role = c(\"ctb\", \"cph\"), comment = \"grisu3 implementation\"), person(\"Mikkel\", \"Jørgensen\", role = c(\"ctb\", \"cph\"), comment = \"grisu3 implementation\") )", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Romain\", \"Francois\", role = \"ctb\"), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Shelby\", \"Bearrows\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"https://github.com/mandreyel/\", role = \"cph\", comment = \"mio library\"), person(\"Jukka\", \"Jylänki\", role = c(\"ctb\", \"cph\"), comment = \"grisu3 implementation\"), person(\"Mikkel\", \"Jørgensen\", role = c(\"ctb\", \"cph\"), comment = \"grisu3 implementation\") )", "Description": "The goal of 'readr' is to provide a fast and friendly way to read rectangular data (like 'csv', 'tsv', and 'fwf'). It is designed to flexibly parse many types of data found in the wild, while still cleanly failing when data unexpectedly changes.", "License": "MIT + file LICENSE", "URL": "https://readr.tidyverse.org, https://github.com/tidyverse/readr", "BugReports": "https://github.com/tidyverse/readr/issues", "Depends": [ - "R (>= 4.1)" + "R (>= 3.6)" ], "Imports": [ - "cli", + "cli (>= 3.2.0)", "clipr", "crayon", - "glue", "hms (>= 0.4.1)", - "lifecycle", + "lifecycle (>= 0.2.0)", "methods", "R6", "rlang", "tibble", "utils", - "vroom (>= 1.7.0)", - "withr" + "vroom (>= 1.6.0)" ], "Suggests": [ "covr", @@ -7370,6 +7355,7 @@ "testthat (>= 3.2.0)", "tzdb (>= 0.1.1)", "waldo", + "withr", "xml2" ], "LinkingTo": [ @@ -7380,12 +7366,11 @@ "Config/Needs/website": "tidyverse, tidyverse/tidytemplate", "Config/testthat/edition": "3", "Config/testthat/parallel": "false", - "Config/usethis/last-upkeep": "2025-11-14", "Encoding": "UTF-8", "Language": "en-US", "RoxygenNote": "7.3.3", "NeedsCompilation": "yes", - "Author": "Hadley Wickham [aut], Jim Hester [aut], Romain Francois [ctb], Jennifer Bryan [aut, cre] (ORCID: ), Shelby Bearrows [ctb], Posit Software, PBC [cph, fnd] (ROR: ), https://github.com/mandreyel/ [cph] (mio library), Jukka Jylänki [ctb, cph] (grisu3 implementation), Mikkel Jørgensen [ctb, cph] (grisu3 implementation)", + "Author": "Hadley Wickham [aut], Jim Hester [aut], Romain Francois [ctb], Jennifer Bryan [aut, cre] (ORCID: ), Shelby Bearrows [ctb], Posit Software, PBC [cph, fnd], https://github.com/mandreyel/ [cph] (mio library), Jukka Jylänki [ctb, cph] (grisu3 implementation), Mikkel Jørgensen [ctb, cph] (grisu3 implementation)", "Maintainer": "Jennifer Bryan ", "Repository": "CRAN" }, @@ -7431,10 +7416,10 @@ }, "reformulas": { "Package": "reformulas", - "Version": "0.4.4", + "Version": "0.4.2", "Source": "Repository", "Title": "Machinery for Processing Random Effect Formulas", - "Authors@R": "c( person(given = \"Ben\", family = \"Bolker\", role = c(\"aut\", \"cre\"), email = \"bolker@mcmaster.ca\", comment=c(ORCID=\"0000-0002-2127-0443\")), person(\"Anna\", \"Ly\", role = \"ctb\", comment = c(ORCID = \"0000-0002-0210-0342\")) )", + "Authors@R": "person(given = \"Ben\", family = \"Bolker\", role = c(\"aut\", \"cre\"), email = \"bolker@mcmaster.ca\", comment=c(ORCID=\"0000-0002-2127-0443\"))", "Description": "Takes formulas including random-effects components (formatted as in 'lme4', 'glmmTMB', etc.) and processes them. Includes various helper functions.", "URL": "https://github.com/bbolker/reformulas", "License": "GPL-3", @@ -7449,13 +7434,11 @@ "Suggests": [ "lme4", "tinytest", - "glmmTMB", - "Formula" + "glmmTMB" ], - "RoxygenNote": "7.3.3", - "Config/testthat/edition": "3", + "RoxygenNote": "7.3.2.9000", "NeedsCompilation": "no", - "Author": "Ben Bolker [aut, cre] (ORCID: ), Anna Ly [ctb] (ORCID: )", + "Author": "Ben Bolker [aut, cre] (ORCID: )", "Maintainer": "Ben Bolker ", "Repository": "CRAN" }, @@ -7541,7 +7524,7 @@ }, "renv": { "Package": "renv", - "Version": "1.1.7", + "Version": "1.1.5", "Source": "Repository", "Type": "Package", "Title": "Project Environments", @@ -7559,7 +7542,6 @@ "compiler", "covr", "cpp11", - "curl", "devtools", "generics", "gitcreds", @@ -7583,7 +7565,7 @@ "webfakes" ], "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "VignetteBuilder": "knitr", "Config/Needs/website": "tidyverse/tidytemplate", "Config/testthat/edition": "3", @@ -7596,7 +7578,7 @@ }, "report": { "Package": "report", - "Version": "0.6.3", + "Version": "0.6.2", "Source": "Repository", "Type": "Package", "Title": "Automated Reporting of Results and Statistical Models", @@ -7753,7 +7735,7 @@ }, "rlang": { "Package": "rlang", - "Version": "1.1.7", + "Version": "1.1.6", "Source": "Repository", "Title": "Functions for Base Types and Core R and 'Tidyverse' Features", "Description": "A toolbox for working with base types, core R features like the condition system, and core 'Tidyverse' features like tidy evaluation.", @@ -7762,7 +7744,7 @@ "ByteCompile": "true", "Biarch": "true", "Depends": [ - "R (>= 4.0.0)" + "R (>= 3.5.0)" ], "Imports": [ "utils" @@ -7791,7 +7773,7 @@ "winch" ], "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "URL": "https://rlang.r-lib.org, https://github.com/r-lib/rlang", "BugReports": "https://github.com/r-lib/rlang/issues", "Config/build/compilation-database": "true", @@ -7860,10 +7842,10 @@ }, "robustbase": { "Package": "robustbase", - "Version": "0.99-7", + "Version": "0.99-6", "Source": "Repository", - "VersionNote": "Released 0.99-6 on 2025-09-03, 0.99-5 on 2024-11-01, 0.99-4-1 on 2024-09-24, 0.99-4 on 2024-08-19 to CRAN", - "Date": "2026-02-03", + "VersionNote": "Released 0.99-5 on 2024-11-01, 0.99-4-1 on 2024-09-24, 0.99-4 on 2024-08-19, 0.99-3 on 2024-07-01 to CRAN", + "Date": "2025-09-03", "Title": "Basic Robust Statistics", "Authors@R": "c(person(\"Martin\",\"Maechler\", role=c(\"aut\",\"cre\"), email=\"maechler@stat.math.ethz.ch\", comment = c(ORCID = \"0000-0002-8685-9910\")) , person(\"Peter\", \"Rousseeuw\", role=\"ctb\", comment = \"Qn and Sn\") , person(\"Christophe\", \"Croux\", role=\"ctb\", comment = \"Qn and Sn\") , person(\"Valentin\", \"Todorov\", role = \"aut\", email = \"valentin.todorov@chello.at\", comment = \"most robust Cov\") , person(\"Andreas\", \"Ruckstuhl\", role = \"aut\", email = \"andreas.ruckstuhl@zhaw.ch\", comment = \"nlrob, anova, glmrob\") , person(\"Matias\", \"Salibian-Barrera\", role = \"aut\", email = \"matias@stat.ubc.ca\", comment = \"lmrob orig.\") , person(\"Tobias\", \"Verbeke\", role = c(\"ctb\",\"fnd\"), email = \"tobias.verbeke@openanalytics.eu\", comment = \"mc, adjbox\") , person(\"Manuel\", \"Koller\", role = \"aut\", email = \"koller.manuel@gmail.com\", comment = \"mc, lmrob, psi-func.\") , person(c(\"Eduardo\", \"L. T.\"), \"Conceicao\", role = \"aut\", email = \"mail@eduardoconceicao.org\", comment = \"MM-, tau-, CM-, and MTL- nlrob\") , person(\"Maria\", \"Anna di Palma\", role = \"ctb\", comment = \"initial version of Comedian\") )", "URL": "https://robustbase.R-forge.R-project.org/, https://R-forge.R-project.org/R/?group_id=59, https://R-forge.R-project.org/scm/viewvc.php/pkg/robustbase/?root=robustbase, svn://svn.r-forge.r-project.org/svnroot/robustbase/pkg/robustbase", @@ -7980,7 +7962,7 @@ }, "rstudioapi": { "Package": "rstudioapi", - "Version": "0.18.0", + "Version": "0.17.1", "Source": "Repository", "Title": "Safely Access the RStudio API", "Description": "Access the RStudio API (if available) and provide informative error messages when it's not.", @@ -7989,16 +7971,13 @@ "License": "MIT + file LICENSE", "URL": "https://rstudio.github.io/rstudioapi/, https://github.com/rstudio/rstudioapi", "BugReports": "https://github.com/rstudio/rstudioapi/issues", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "Suggests": [ "testthat", "knitr", "rmarkdown", "clipr", - "covr", - "curl", - "jsonlite", - "withr" + "covr" ], "VignetteBuilder": "knitr", "Encoding": "UTF-8", @@ -8088,12 +8067,12 @@ }, "see": { "Package": "see", - "Version": "0.13.0", + "Version": "0.12.0", "Source": "Repository", "Type": "Package", "Title": "Model Visualisation Toolbox for 'easystats' and 'ggplot2'", - "Authors@R": "c(person(given = \"Daniel\", family = \"Lüdecke\", role = c(\"aut\", \"cre\"), email = \"officialeasystats@gmail.com\", comment = c(ORCID = \"0000-0002-8895-3206\")), person(given = \"Dominique\", family = \"Makowski\", role = c(\"aut\", \"inv\"), email = \"dom.makowski@gmail.com\", comment = c(ORCID = \"0000-0001-5375-9967\")), person(given = \"Indrajeet\", family = \"Patil\", role = c(\"aut\"), email = \"patilindrajeet.science@gmail.com\", comment = c(ORCID = \"0000-0003-1995-6531\")), person(given = \"Mattan S.\", family = \"Ben-Shachar\", role = c(\"aut\", \"ctb\"), email = \"matanshm@post.bgu.ac.il\", comment = c(ORCID = \"0000-0002-4287-4801\")), person(given = \"Brenton M.\", family = \"Wiernik\", role = c(\"aut\", \"ctb\"), email = \"brenton@wiernik.org\", comment = c(ORCID = \"0000-0001-9560-6336\")), person(given = \"Rémi\", family = \"Thériault\", role = c(\"aut\", \"ctb\"), email = \"remi.theriault@mail.mcgill.ca\", comment = c(ORCID = \"0000-0003-4315-6788\")), person(given = \"Philip\", family = \"Waggoner\", role = c(\"aut\", \"ctb\"), email = \"philip.waggoner@gmail.com\", comment = c(ORCID = \"0000-0002-7825-7573\")), person(given = \"Jeffrey R.\", family = \"Stevens\", role = \"ctb\", email = \"jeffrey.r.stevens@gmail.com\", comment = c(ORCID = \"0000-0003-2375-1360\")), person(given = \"Matthew\", family = \"Smith\", role = \"rev\", email = \"M.Smith3@napier.ac.uk\"), person(given = \"Jakob\", family = \"Bossek\", role = \"rev\", email = \"bossek@wi.uni-muenster.de\"))", - "Maintainer": "Daniel Lüdecke ", + "Authors@R": "c(person(given = \"Daniel\", family = \"Lüdecke\", role = c(\"aut\", \"ctb\"), email = \"d.luedecke@uke.de\", comment = c(ORCID = \"0000-0002-8895-3206\")), person(given = \"Dominique\", family = \"Makowski\", role = c(\"aut\", \"inv\"), email = \"dom.makowski@gmail.com\", comment = c(ORCID = \"0000-0001-5375-9967\")), person(given = \"Indrajeet\", family = \"Patil\", role = c(\"aut\", \"cre\"), email = \"patilindrajeet.science@gmail.com\", comment = c(ORCID = \"0000-0003-1995-6531\")), person(given = \"Mattan S.\", family = \"Ben-Shachar\", role = c(\"aut\", \"ctb\"), email = \"matanshm@post.bgu.ac.il\", comment = c(ORCID = \"0000-0002-4287-4801\")), person(given = \"Brenton M.\", family = \"Wiernik\", role = c(\"aut\", \"ctb\"), email = \"brenton@wiernik.org\", comment = c(ORCID = \"0000-0001-9560-6336\")), person(given = \"Rémi\", family = \"Thériault\", role = c(\"aut\", \"ctb\"), email = \"remi.theriault@mail.mcgill.ca\", comment = c(ORCID = \"0000-0003-4315-6788\")), person(given = \"Philip\", family = \"Waggoner\", role = c(\"aut\", \"ctb\"), email = \"philip.waggoner@gmail.com\", comment = c(ORCID = \"0000-0002-7825-7573\")), person(given = \"Jeffrey R.\", family = \"Stevens\", role = \"ctb\", email = \"jeffrey.r.stevens@gmail.com\", comment = c(ORCID = \"0000-0003-2375-1360\")), person(given = \"Matthew\", family = \"Smith\", role = \"rev\", email = \"M.Smith3@napier.ac.uk\"), person(given = \"Jakob\", family = \"Bossek\", role = \"rev\", email = \"bossek@wi.uni-muenster.de\"))", + "Maintainer": "Indrajeet Patil ", "Description": "Provides plotting utilities supporting packages in the 'easystats' ecosystem () and some extra themes, geoms, and scales for 'ggplot2'. Color scales are based on . References: Lüdecke et al. (2021) .", "License": "MIT + file LICENSE", "URL": "https://easystats.github.io/see/", @@ -8107,14 +8086,14 @@ "Imports": [ "bayestestR (>= 0.17.0)", "correlation (>= 0.8.8)", - "datawizard (>= 1.3.0)", + "datawizard (>= 1.2.0)", "effectsize (>= 1.0.1)", - "ggplot2 (>= 4.0.1)", - "insight (>= 1.4.4)", - "modelbased (>= 0.13.1)", + "ggplot2 (>= 4.0.0)", + "insight (>= 1.4.1)", + "modelbased (>= 0.13.0)", "patchwork (>= 1.3.2)", - "parameters (>= 0.28.3)", - "performance (>= 0.15.3)" + "parameters (>= 0.28.1)", + "performance (>= 0.15.1)" ], "Suggests": [ "BH", @@ -8168,23 +8147,23 @@ "Config/Needs/website": "easystats/easystatstemplate", "Config/rcmdcheck/ignore-inconsequential-notes": "true", "NeedsCompilation": "no", - "Author": "Daniel Lüdecke [aut, cre] (ORCID: ), Dominique Makowski [aut, inv] (ORCID: ), Indrajeet Patil [aut] (ORCID: ), Mattan S. Ben-Shachar [aut, ctb] (ORCID: ), Brenton M. Wiernik [aut, ctb] (ORCID: ), Rémi Thériault [aut, ctb] (ORCID: ), Philip Waggoner [aut, ctb] (ORCID: ), Jeffrey R. Stevens [ctb] (ORCID: ), Matthew Smith [rev], Jakob Bossek [rev]", + "Author": "Daniel Lüdecke [aut, ctb] (ORCID: ), Dominique Makowski [aut, inv] (ORCID: ), Indrajeet Patil [aut, cre] (ORCID: ), Mattan S. Ben-Shachar [aut, ctb] (ORCID: ), Brenton M. Wiernik [aut, ctb] (ORCID: ), Rémi Thériault [aut, ctb] (ORCID: ), Philip Waggoner [aut, ctb] (ORCID: ), Jeffrey R. Stevens [ctb] (ORCID: ), Matthew Smith [rev], Jakob Bossek [rev]", "Repository": "CRAN" }, "shiny": { "Package": "shiny", - "Version": "1.13.0", + "Version": "1.12.1", "Source": "Repository", "Type": "Package", "Title": "Web Application Framework for R", "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"JJ\", \"Allaire\", , \"jj@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Garrick\", \"Aden-Buie\", , \"garrick@adenbuie.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Yihui\", \"Xie\", , \"yihui@posit.co\", role = \"aut\"), person(\"Jeff\", \"Allen\", role = \"aut\"), person(\"Jonathan\", \"McPherson\", , \"jonathan@posit.co\", role = \"aut\"), person(\"Alan\", \"Dipert\", role = \"aut\"), person(\"Barbara\", \"Borges\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(, \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library and jQuery UI library\"), person(, \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt\"), person(, \"jQuery UI contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery UI library; authors listed in inst/www/shared/jqueryui/AUTHORS.txt\"), person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"), person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Prem Nawaz\", \"Khan\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Victor\", \"Tsaran\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Dennis\", \"Lembree\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Srinivasu\", \"Chakravarthula\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Cathy\", \"O'Connor\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(, \"PayPal, Inc\", role = \"cph\", comment = \"Bootstrap accessibility plugin\"), person(\"Stefan\", \"Petre\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap-datepicker library\"), person(\"Andrew\", \"Rowls\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap-datepicker library\"), person(\"Brian\", \"Reavis\", role = c(\"ctb\", \"cph\"), comment = \"selectize.js library\"), person(\"Salmen\", \"Bejaoui\", role = c(\"ctb\", \"cph\"), comment = \"selectize-plugin-a11y library\"), person(\"Denis\", \"Ineshin\", role = c(\"ctb\", \"cph\"), comment = \"ion.rangeSlider library\"), person(\"Sami\", \"Samhuri\", role = c(\"ctb\", \"cph\"), comment = \"Javascript strftime library\"), person(, \"SpryMedia Limited\", role = c(\"ctb\", \"cph\"), comment = \"DataTables library\"), person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\"), person(\"R Core Team\", role = c(\"ctb\", \"cph\"), comment = \"tar implementation from R\") )", "Description": "Makes it incredibly easy to build interactive web applications with R. Automatic \"reactive\" binding between inputs and outputs and extensive prebuilt widgets make it possible to build beautiful, responsive, and powerful applications with minimal effort.", - "License": "MIT + file LICENSE", + "License": "GPL-3 | file LICENSE", "URL": "https://shiny.posit.co/, https://github.com/rstudio/shiny", "BugReports": "https://github.com/rstudio/shiny/issues", "Depends": [ "methods", - "R (>= 3.1.2)" + "R (>= 3.0.2)" ], "Imports": [ "bslib (>= 0.6.0)", @@ -8386,7 +8365,7 @@ }, "shinyjs": { "Package": "shinyjs", - "Version": "2.1.1", + "Version": "2.1.0", "Source": "Repository", "Title": "Easily Improve the User Experience of Your Shiny Apps in Seconds", "Authors@R": "person(\"Dean\", \"Attali\", email = \"daattali@gmail.com\", role = c(\"aut\", \"cre\"), comment= c(ORCID=\"0000-0002-5645-3493\"))", @@ -8411,10 +8390,10 @@ ], "License": "MIT + file LICENSE", "VignetteBuilder": "knitr", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.1.1", "Encoding": "UTF-8", "NeedsCompilation": "no", - "Author": "Dean Attali [aut, cre] (ORCID: )", + "Author": "Dean Attali [aut, cre] ()", "Maintainer": "Dean Attali ", "Repository": "CRAN" }, @@ -8775,10 +8754,10 @@ }, "tibble": { "Package": "tibble", - "Version": "3.3.1", + "Version": "3.3.0", "Source": "Repository", "Title": "Simple Data Frames", - "Authors@R": "c( person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = \"aut\"), person(\"Romain\", \"Francois\", , \"romain@r-enthusiasts.com\", role = \"ctb\"), person(\"Jennifer\", \"Bryan\", , \"jenny@rstudio.com\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Authors@R": "c(person(given = \"Kirill\", family = \"M\\u00fcller\", role = c(\"aut\", \"cre\"), email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(given = \"Hadley\", family = \"Wickham\", role = \"aut\", email = \"hadley@rstudio.com\"), person(given = \"Romain\", family = \"Francois\", role = \"ctb\", email = \"romain@r-enthusiasts.com\"), person(given = \"Jennifer\", family = \"Bryan\", role = \"ctb\", email = \"jenny@rstudio.com\"), person(given = \"RStudio\", role = c(\"cph\", \"fnd\")))", "Description": "Provides a 'tbl_df' class (the 'tibble') with stricter checking and better formatting than the traditional data frame.", "License": "MIT + file LICENSE", "URL": "https://tibble.tidyverse.org/, https://github.com/tidyverse/tibble", @@ -8823,37 +8802,36 @@ "withr" ], "VignetteBuilder": "knitr", - "Config/autostyle/rmd": "false", - "Config/autostyle/scope": "line_breaks", - "Config/autostyle/strict": "true", - "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", "Config/testthat/edition": "3", "Config/testthat/parallel": "true", "Config/testthat/start-first": "vignette-formats, as_tibble, add, invariants", - "Config/usethis/last-upkeep": "2025-06-07", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.3.9000", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "true", + "Config/autostyle/rmd": "false", + "Config/Needs/website": "tidyverse/tidytemplate", "NeedsCompilation": "yes", - "Author": "Kirill Müller [aut, cre] (ORCID: ), Hadley Wickham [aut], Romain Francois [ctb], Jennifer Bryan [ctb], Posit Software, PBC [cph, fnd] (ROR: )", + "Author": "Kirill Müller [aut, cre] (ORCID: ), Hadley Wickham [aut], Romain Francois [ctb], Jennifer Bryan [ctb], RStudio [cph, fnd]", "Maintainer": "Kirill Müller ", "Repository": "CRAN" }, "tidyr": { "Package": "tidyr", - "Version": "1.3.2", + "Version": "1.3.1", "Source": "Repository", "Title": "Tidy Messy Data", "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = \"aut\"), person(\"Maximilian\", \"Girlich\", role = \"aut\"), person(\"Kevin\", \"Ushey\", , \"kevin@posit.co\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", - "Description": "Tools to help to create tidy data, where each column is a variable, each row is an observation, and each cell contains a single value. 'tidyr' contains tools for changing the shape (pivoting) and hierarchy (nesting and 'unnesting') of a dataset, turning deeply nested lists into rectangular data frames ('rectangling'), and extracting values out of string columns. It also includes tools for working with missing values (both implicit and explicit).", + "Description": "Tools to help to create tidy data, where each column is a variable, each row is an observation, and each cell contains a single value. 'tidyr' contains tools for changing the shape (pivoting) and hierarchy (nesting and 'unnesting') of a dataset, turning deeply nested lists into rectangular data frames ('rectangling'), and extracting values out of string columns. It also includes tools for working with missing values (both implicit and explicit).", "License": "MIT + file LICENSE", "URL": "https://tidyr.tidyverse.org, https://github.com/tidyverse/tidyr", "BugReports": "https://github.com/tidyverse/tidyr/issues", "Depends": [ - "R (>= 4.1.0)" + "R (>= 3.6)" ], "Imports": [ "cli (>= 3.4.1)", - "dplyr (>= 1.1.0)", + "dplyr (>= 1.0.10)", "glue", "lifecycle (>= 1.0.3)", "magrittr", @@ -8861,7 +8839,7 @@ "rlang (>= 1.1.1)", "stringr (>= 1.5.0)", "tibble (>= 2.1.1)", - "tidyselect (>= 1.2.1)", + "tidyselect (>= 1.2.0)", "utils", "vctrs (>= 0.5.2)" ], @@ -8878,12 +8856,11 @@ "cpp11 (>= 0.4.0)" ], "VignetteBuilder": "knitr", - "Config/build/compilation-database": "true", "Config/Needs/website": "tidyverse/tidytemplate", "Config/testthat/edition": "3", "Encoding": "UTF-8", "LazyData": "true", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.0", "NeedsCompilation": "yes", "Author": "Hadley Wickham [aut, cre], Davis Vaughan [aut], Maximilian Girlich [aut], Kevin Ushey [ctb], Posit Software, PBC [cph, fnd]", "Maintainer": "Hadley Wickham ", @@ -8934,7 +8911,7 @@ }, "timechange": { "Package": "timechange", - "Version": "0.4.0", + "Version": "0.3.0", "Source": "Repository", "Title": "Efficient Manipulation of Date-Times", "Authors@R": "c(person(\"Vitalie\", \"Spinu\", email = \"spinuvit@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Google Inc.\", role = c(\"ctb\", \"cph\")))", @@ -8951,7 +8928,7 @@ "testthat (>= 0.7.1.99)", "knitr" ], - "SystemRequirements": "A system with zoneinfo data (e.g. /usr/share/zoneinfo). On Windows the zoneinfo included with R is used.", + "SystemRequirements": "A system with zoneinfo data (e.g. /usr/share/zoneinfo) as well as a recent-enough C++11 compiler (such as g++-4.8 or later). On Windows the zoneinfo included with R is used.", "BugReports": "https://github.com/vspinu/timechange/issues", "URL": "https://github.com/vspinu/timechange/", "RoxygenNote": "7.2.1", @@ -9147,10 +9124,10 @@ }, "uuid": { "Package": "uuid", - "Version": "1.2-2", + "Version": "1.2-1", "Source": "Repository", "Title": "Tools for Generating and Handling of UUIDs", - "Author": "Simon Urbanek [aut, cre, cph] (https://urbanek.org, ORCID: ), Theodore Ts'o [aut, cph] (libuuid)", + "Author": "Simon Urbanek [aut, cre, cph] (https://urbanek.org, ), Theodore Ts'o [aut, cph] (libuuid)", "Maintainer": "Simon Urbanek ", "Authors@R": "c(person(\"Simon\", \"Urbanek\", role=c(\"aut\",\"cre\",\"cph\"), email=\"Simon.Urbanek@r-project.org\", comment=c(\"https://urbanek.org\", ORCID=\"0000-0003-2297-1732\")), person(\"Theodore\",\"Ts'o\", email=\"tytso@thunk.org\", role=c(\"aut\",\"cph\"), comment=\"libuuid\"))", "Depends": [ @@ -9165,7 +9142,7 @@ }, "vctrs": { "Package": "vctrs", - "Version": "0.7.1", + "Version": "0.6.5", "Source": "Repository", "Title": "Vector Helpers", "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"aut\"), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = c(\"aut\", \"cre\")), person(\"data.table team\", role = \"cph\", comment = \"Radix sort based on data.table's forder() and their contribution to R's order()\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", @@ -9174,13 +9151,13 @@ "URL": "https://vctrs.r-lib.org/, https://github.com/r-lib/vctrs", "BugReports": "https://github.com/r-lib/vctrs/issues", "Depends": [ - "R (>= 4.0.0)" + "R (>= 3.5.0)" ], "Imports": [ "cli (>= 3.4.0)", "glue", "lifecycle (>= 1.0.3)", - "rlang (>= 1.1.7)" + "rlang (>= 1.1.0)" ], "Suggests": [ "bit64", @@ -9200,13 +9177,11 @@ "zeallot" ], "VignetteBuilder": "knitr", - "Config/build/compilation-database": "true", "Config/Needs/website": "tidyverse/tidytemplate", "Config/testthat/edition": "3", - "Config/testthat/parallel": "true", "Encoding": "UTF-8", "Language": "en-GB", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.2.3", "NeedsCompilation": "yes", "Author": "Hadley Wickham [aut], Lionel Henry [aut], Davis Vaughan [aut, cre], data.table team [cph] (Radix sort based on data.table's forder() and their contribution to R's order()), Posit Software, PBC [cph, fnd]", "Maintainer": "Davis Vaughan ", @@ -9260,11 +9235,11 @@ }, "viridisLite": { "Package": "viridisLite", - "Version": "0.4.3", + "Version": "0.4.2", "Source": "Repository", "Type": "Package", "Title": "Colorblind-Friendly Color Maps (Lite Version)", - "Date": "2026-02-03", + "Date": "2023-05-02", "Authors@R": "c( person(\"Simon\", \"Garnier\", email = \"garnier@njit.edu\", role = c(\"aut\", \"cre\")), person(\"Noam\", \"Ross\", email = \"noam.ross@gmail.com\", role = c(\"ctb\", \"cph\")), person(\"Bob\", \"Rudis\", email = \"bob@rud.is\", role = c(\"ctb\", \"cph\")), person(\"Marco\", \"Sciaini\", email = \"sciaini.marco@gmail.com\", role = c(\"ctb\", \"cph\")), person(\"Antônio Pedro\", \"Camargo\", role = c(\"ctb\", \"cph\")), person(\"Cédric\", \"Scherer\", email = \"scherer@izw-berlin.de\", role = c(\"ctb\", \"cph\")) )", "Maintainer": "Simon Garnier ", "Description": "Color maps designed to improve graph readability for readers with common forms of color blindness and/or color vision deficiency. The color maps are also perceptually-uniform, both in regular form and also when converted to black-and-white for printing. This is the 'lite' version of the 'viridis' package that also contains 'ggplot2' bindings for discrete and continuous color and fill scales and can be found at .", @@ -9281,20 +9256,20 @@ ], "URL": "https://sjmgarnier.github.io/viridisLite/, https://github.com/sjmgarnier/viridisLite/", "BugReports": "https://github.com/sjmgarnier/viridisLite/issues/", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.2.3", "NeedsCompilation": "no", "Author": "Simon Garnier [aut, cre], Noam Ross [ctb, cph], Bob Rudis [ctb, cph], Marco Sciaini [ctb, cph], Antônio Pedro Camargo [ctb, cph], Cédric Scherer [ctb, cph]", "Repository": "CRAN" }, "vroom": { "Package": "vroom", - "Version": "1.7.0", + "Version": "1.6.7", "Source": "Repository", "Title": "Read and Write Rectangular Text Data Quickly", "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Shelby\", \"Bearrows\", role = \"ctb\"), person(\"https://github.com/mandreyel/\", role = \"cph\", comment = \"mio library\"), person(\"Jukka\", \"Jylänki\", role = \"cph\", comment = \"grisu3 implementation\"), person(\"Mikkel\", \"Jørgensen\", role = \"cph\", comment = \"grisu3 implementation\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", "Description": "The goal of 'vroom' is to read and write data (like 'csv', 'tsv' and 'fwf') quickly. When reading it uses a quick initial indexing step, then reads the values lazily , so only the data you actually use needs to be read. The writer formats the data in parallel and writes to disk asynchronously from formatting.", "License": "MIT + file LICENSE", - "URL": "https://vroom.tidyverse.org, https://github.com/tidyverse/vroom", + "URL": "https://vroom.r-lib.org, https://github.com/tidyverse/vroom", "BugReports": "https://github.com/tidyverse/vroom/issues", "Depends": [ "R (>= 4.1)" @@ -9307,7 +9282,7 @@ "hms", "lifecycle (>= 1.0.3)", "methods", - "rlang (>= 1.1.0)", + "rlang (>= 0.4.2)", "stats", "tibble (>= 2.0.0)", "tidyselect", @@ -9352,7 +9327,6 @@ "Encoding": "UTF-8", "Language": "en-US", "RoxygenNote": "7.3.3", - "Config/build/compilation-database": "true", "NeedsCompilation": "yes", "Author": "Jim Hester [aut] (ORCID: ), Hadley Wickham [aut] (ORCID: ), Jennifer Bryan [aut, cre] (ORCID: ), Shelby Bearrows [ctb], https://github.com/mandreyel/ [cph] (mio library), Jukka Jylänki [cph] (grisu3 implementation), Mikkel Jørgensen [cph] (grisu3 implementation), Posit Software, PBC [cph, fnd] (ROR: )", "Maintainer": "Jennifer Bryan ", @@ -9425,7 +9399,7 @@ }, "xfun": { "Package": "xfun", - "Version": "0.56", + "Version": "0.54", "Source": "Repository", "Type": "Package", "Title": "Supporting Functions for Packages Maintained by 'Yihui Xie'", @@ -9458,7 +9432,7 @@ "magick", "yaml", "data.table", - "qs2" + "qs" ], "License": "MIT + file LICENSE", "URL": "https://github.com/yihui/xfun", @@ -9473,7 +9447,7 @@ }, "xml2": { "Package": "xml2", - "Version": "1.5.2", + "Version": "1.5.1", "Source": "Repository", "Title": "Parse XML", "Authors@R": "c( person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Jeroen\", \"Ooms\", email = \"jeroenooms@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"R Foundation\", role = \"ctb\", comment = \"Copy of R-project homepage cached as example\") )", @@ -9542,28 +9516,22 @@ }, "yaml": { "Package": "yaml", - "Version": "2.3.12", + "Version": "2.3.11", "Source": "Repository", "Type": "Package", "Title": "Methods to Convert R Data to YAML and Back", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"cre\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Shawn\", \"Garbett\", , \"shawn.garbett@vumc.org\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4079-5621\")), person(\"Jeremy\", \"Stephens\", role = c(\"aut\", \"ctb\")), person(\"Kirill\", \"Simonov\", role = \"aut\"), person(\"Yihui\", \"Xie\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Zhuoer\", \"Dong\", role = \"ctb\"), person(\"Jeffrey\", \"Horner\", role = \"ctb\"), person(\"reikoch\", role = \"ctb\"), person(\"Will\", \"Beasley\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5613-5006\")), person(\"Brendan\", \"O'Connor\", role = \"ctb\"), person(\"Michael\", \"Quinn\", role = \"ctb\"), person(\"Charlie\", \"Gao\", role = \"ctb\"), person(c(\"Gregory\", \"R.\"), \"Warnes\", role = \"ctb\"), person(c(\"Zhian\", \"N.\"), \"Kamvar\", role = \"ctb\") )", - "Description": "Implements the 'libyaml' 'YAML' 1.1 parser and emitter () for R.", - "License": "BSD_3_clause + file LICENSE", - "URL": "https://yaml.r-lib.org, https://github.com/r-lib/yaml/", - "BugReports": "https://github.com/r-lib/yaml/issues", + "Date": "2025-11-06", "Suggests": [ - "knitr", - "rmarkdown", - "testthat (>= 3.0.0)" + "RUnit" ], - "Config/testthat/edition": "3", - "Config/Needs/website": "tidyverse/tidytemplate", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", - "VignetteBuilder": "knitr", + "Authors@R": "c( person(\"Shawn\", \"Garbett\", role = c(\"cre\",\"ctb\"), email = \"shawn.garbett@vumc.org\", comment = c(ORCID=\"0000-0003-4079-5621\") ), person(\"Jeremy\", \"Stephens\", role = c(\"aut\", \"ctb\")), person(\"Kirill\", \"Simonov\", role = \"aut\"), person(\"Yihui\", \"Xie\", role = \"ctb\", comment = c(ORCID=\"0000-0003-0645-5666\")), person(\"Zhuoer\", \"Dong\", role = \"ctb\"), person(\"Hadley\", \"Wickham\", role = \"ctb\", comment = c(ORCID=\"0000-0003-4757-117X\")), person(\"Jeffrey\", \"Horner\", role = \"ctb\"), person(\"reikoch\", role = \"ctb\"), person(\"Will\", \"Beasley\", role = \"ctb\", comment = c(ORCID=\"0000-0002-5613-5006\")), person(\"Brendan\", \"O'Connor\", role = \"ctb\"), person(\"Michael\", \"Quinn\", role = \"ctb\"), person(\"Charlie\", \"Gao\", role = \"ctb\"), person(c(\"Gregory\", \"R.\"), \"Warnes\", role = \"ctb\"), person(c(\"Zhian\", \"N.\"), \"Kamvar\", role = \"ctb\") )", + "Maintainer": "Shawn Garbett ", + "License": "BSD_3_clause + file LICENSE", + "Description": "Implements the 'libyaml' 'YAML' 1.1 parser and emitter () for R.", + "URL": "https://github.com/vubiostat/r-yaml/", + "BugReports": "https://github.com/vubiostat/r-yaml/issues", "NeedsCompilation": "yes", - "Author": "Hadley Wickham [cre] (ORCID: ), Shawn Garbett [ctb] (ORCID: ), Jeremy Stephens [aut, ctb], Kirill Simonov [aut], Yihui Xie [ctb] (ORCID: ), Zhuoer Dong [ctb], Jeffrey Horner [ctb], reikoch [ctb], Will Beasley [ctb] (ORCID: ), Brendan O'Connor [ctb], Michael Quinn [ctb], Charlie Gao [ctb], Gregory R. Warnes [ctb], Zhian N. Kamvar [ctb]", - "Maintainer": "Hadley Wickham ", + "Author": "Shawn Garbett [cre, ctb] (ORCID: ), Jeremy Stephens [aut, ctb], Kirill Simonov [aut], Yihui Xie [ctb] (ORCID: ), Zhuoer Dong [ctb], Hadley Wickham [ctb] (ORCID: ), Jeffrey Horner [ctb], reikoch [ctb], Will Beasley [ctb] (ORCID: ), Brendan O'Connor [ctb], Michael Quinn [ctb], Charlie Gao [ctb], Gregory R. Warnes [ctb], Zhian N. Kamvar [ctb]", "Repository": "CRAN" }, "zip": { @@ -9596,9 +9564,9 @@ }, "zoo": { "Package": "zoo", - "Version": "1.8-15", + "Version": "1.8-14", "Source": "Repository", - "Date": "2025-12-15", + "Date": "2025-04-09", "Title": "S3 Infrastructure for Regular and Irregular Time Series (Z's Ordered Observations)", "Authors@R": "c(person(given = \"Achim\", family = \"Zeileis\", role = c(\"aut\", \"cre\"), email = \"Achim.Zeileis@R-project.org\", comment = c(ORCID = \"0000-0003-0918-3766\")), person(given = \"Gabor\", family = \"Grothendieck\", role = \"aut\", email = \"ggrothendieck@gmail.com\"), person(given = c(\"Jeffrey\", \"A.\"), family = \"Ryan\", role = \"aut\", email = \"jeff.a.ryan@gmail.com\"), person(given = c(\"Joshua\", \"M.\"), family = \"Ulrich\", role = \"ctb\", email = \"josh.m.ulrich@gmail.com\"), person(given = \"Felix\", family = \"Andrews\", role = \"ctb\", email = \"felix@nfrac.org\"))", "Description": "An S3 class with methods for totally ordered indexed observations. It is particularly aimed at irregular time series of numeric vectors/matrices and factors. zoo's key design goals are independence of a particular index/date/time class and consistency with ts and base R by providing methods to extend standard generics.", @@ -9631,7 +9599,7 @@ "License": "GPL-2 | GPL-3", "URL": "https://zoo.R-Forge.R-project.org/", "NeedsCompilation": "yes", - "Author": "Achim Zeileis [aut, cre] (ORCID: ), Gabor Grothendieck [aut], Jeffrey A. Ryan [aut], Joshua M. Ulrich [ctb], Felix Andrews [ctb]", + "Author": "Achim Zeileis [aut, cre] (), Gabor Grothendieck [aut], Jeffrey A. Ryan [aut], Joshua M. Ulrich [ctb], Felix Andrews [ctb]", "Maintainer": "Achim Zeileis ", "Repository": "CRAN" } diff --git a/app_docker/translations/translation_da.csv b/app_docker/translations/translation_da.csv index cf5fc05c..83406f05 100644 --- a/app_docker/translations/translation_da.csv +++ b/app_docker/translations/translation_da.csv @@ -5,6 +5,7 @@ "REDCap server export","Eksport fra REDCap server" "Local or sample data","Lokal eller testdata" "Please be mindfull handling sensitive data","Pas godt på og overvej nøje hvordan du håndterer personfølsomme data" +"The ***FreesearchR*** app only stores data for analyses, but please only use with sensitive data when running locally. [Read more here](https://agdamsbo.github.io/FreesearchR/#run-locally-on-your-own-machine).","***FreesearchR*** opbevarer alene data i forbindelse med din analyse, men du bør kun behandle personfølsomme data når du kører ***FreesearchR*** direkte på din egen maskine. [Læs mere her](https://agdamsbo.github.io/FreesearchR/#run-locally-on-your-own-machine)." "Quick overview","Hurtigt overblik" "Select variables for final import","Vælg variabler til den endelige import" "Exclude incomplete variables:","Ekskluder inkomplette variabler:" @@ -23,11 +24,16 @@ "Apply filter on observation","Anvend filtre af observationer" "Edit and create data","Ændr og opret variabler" "Subset, rename and convert variables","Udvælg, omdøb og konverter variabler" +"Below, are several options for simple data manipulation like update variables by renaming, creating new labels (for nicer tables in the report) and changing variable classes (numeric, factor/categorical etc.).","Nedenfor er der mulighed for at lave simple ændringer i dit datasæt, såsom at redigere variabelnavne eller beskrivelser (bedre tabeller), eller omklassificering af variabler (numerisk, factoriel/kategorisk)." +"Please note that data modifications are applied before any filtering.","Bemærk at alle ændringer i data anvendes inden filtreringen." "Advanced data manipulation","Avanceret datamanipulation" "Below options allow more advanced varaible manipulations.","Nedenfor er mulighed for avancerede ændringer i data." "New factor","Ny faktor" +"Create factor/categorical variable from a continous variable (number/date/time).","Opret kategorisk variabel på baggrund af kontinuert variabel (numerisk/dato/tid)." "New variable","Ny variabel" +"Create a new variable based on an R-expression.","Opret ny variabel baseret på R-kode." "Compare modified data to original","Sammenlign ændret data med det originale datasæt" +"Raw print of the original vs the modified data.","Simpel sammenligning af det originale og det ændrede datasæt." "Original data:","Original data:" "Modified data:","Ændret data:" "New column name:","Navn til ny variabel:" @@ -58,6 +64,7 @@ "Imported data","Importeret data" "www/intro.md","www/intro.md" "Choose your data","Vælg dine data" +"Upload a file, get data directly from REDCap or use local or sample data.","Upload en fil, hent data direkte fra en REDCap-server eller brug test-data eller lokal data." "Factor variable to reorder:","Kategoriske variabel der skal ændres:" "Sort by levels","Sorter efter niveauer" "Sort by count","Sorter efter antal" @@ -88,7 +95,9 @@ "Visuals","Grafik" "Regression","Regression" "Download","Download" +"{data_text} has {n} observations and {n_var} variables, with {n_complete} ({p_complete} %) complete cases.","{data_text} har {n} observationer og {n_var} variabler, med {n_complete} ({p_complete} %) komplette cases." "Prepare","Forbered" +"At 0, only complete variables are included; at 100, all variables are included.","Ved 0 inkluderes alene komplette variabler; ved 100 inkluderes alle variabler." "The following variable pairs are highly correlated: {sentence_paste(.x,and_str)}.\nConsider excluding one {more}from the dataset to ensure variables are independent.","De følgende variabel-par er stærkt korrelerede: {sentence_paste(.x,and_str)}.\nOvervej at fjerne en {more}fra datasættet for at sikre at prædiktorer er internt uafhængige." "No variables have a correlation measure above the threshold.","Ingen variabler er korrelerede over den angivne tærskelværdi." "and","og" @@ -132,17 +141,23 @@ "Create plot","Dan grafik" "Coefficients plot","Koefficientgraf" "Checks","Test af model" +"Below you find a summary table for quick insigths, and on the right you can visualise data classes, browse observations and apply different data filters.","Nedenfor er en opsummerende tabel, der giver hurtigt overblik. Til højre kan du få et visuelt overblik, gennemgå observationer og oprette datafiltre." "Browse observations","Gennemse observationer" "Settings","Indstillinger" "The following error occured on determining correlations:","Følgende fejl opstod i forbindelse med korrelationsanalysen:" +"We encountered the following error creating your report:","Følgende fejl opstod, da rapporten blev dannet:" "No missing observations","Ingen manglende observationer" "There is a total of {p_miss} % missing observations.","Der er i alt {p_miss} % manglende observationer." "Median:","Median:" "Restore original data","Gendan originale data" +"Reset to original imported dataset. Careful! There is no un-doing.","Gendan det oprindeligt importerede datasæt. Forsigtig! Alle dine ændringer vil forsvinde." "Characteristics","Karakteristika" +"Only factor/categorical variables are available for stratification. Go back to the 'Prepare' tab to reclass a variable if it's not on the list.","Alene kategoriske variabler kan danne grundlag for stratificering. Mangler du en variabel, så gå til ""Forbered"" og omklassificer til kategorisk." "Compare strata?","Sammenlign strata?" "Correlations","Korrelationer" +"To avoid evaluating the correlation of the outcome variable, this can be excluded from the plot or select 'none'.","For at udelukke svarvariablen fra korrelationsanalysen, så kan du vælge din svarvariabel eller vælge 'non', hvis du ikke vil angive en." "Correlation cut-off","Korrelationsgrænse" +"Set the cut-off for considered 'highly correlated'.","Angiv grænsen for. hvad, der tolkes som 'betydelig korrelation'." "Missings","Manglende observationer" "Class","Klasse" "Observations","Observationer" @@ -152,9 +167,11 @@ "Confirm","Bekræft" "The filtered data","Filtreret data" "Create new factor","Ny kategorisk variabel" +"This window is aimed at advanced users and require some *R*-experience!","Dette vindue er primært for avancerede brugere med nogen *R*-erfaring!" "Create new variables","Opret nye variabler" "Select data types to include","Vælg datatyper, der skal inkluderes" "Uploaded data overview","Overblik over uploaded data" +"Here is an overview of how your data is interpreted, and where data is missing. Use this information to consider if data is missing at random or if some observations are missing systematically wich may be caused by an observation bias.","Her har du en oversigt over hvordan data er blevet formateret, og hvor der er manglende observationer. Brug informationen til at overveje om manglende data mangler tilfældigt eller og der er et mønster, som kan være et udtryk for systematisk manglende data (observationsbias)." "Specify covariables","Angiv kovariabler" "If none are selected, all are included.","Hvis ingen er valgt inkluderes alle." "Analyse","Analysér" @@ -192,6 +209,7 @@ "List of datasets...","Liste af datasæt..." "No data selected!","Ingen data valgt!" "No dataset here...","Ingen datasæt her..." +"Use a dataset from your environment or from the environment of a package.","Brug et datasæt fra dit lokale kodemiljø eller fra en tilgængelig pakke." "Not a data.frame","Ikke en data.frame" "Select source","Vælg datakilde" "Select a data source:","Vælg datakilde:" @@ -211,6 +229,7 @@ "Multivariable regression model checks","Tests af multivariabel regressionsmodel" "Grouped by {get_label(data,ter)}","Grupperet efter {get_label(data,ter)}" "Option to perform statistical comparisons between strata in baseline table.","Mulighed for at udføre statistiske tests mellem strata i oversigtstabellen." +"Press 'Evaluate' to create the comparison table.","Tryk 'Evaluér' for at oprette en oversigtstabel." "The data includes {n_col} variables. Please limit to 100.","Data indeholder {n_col} variabler. Begræns venligst til 100." "Data import","Data import" "Data import formatting","Formatering af data ved import" @@ -242,6 +261,7 @@ "By specified numbers","Efter specifikke værdier" "By quantiles (groups of equal size)","I grupper af samme størrelse" "By week number","Efter ugenummer alene" +"There are more advanced options to modify factor/categorical variables as well as create new factor from an existing variable or new variables with R code. At the bottom you can restore the original data.","Der er mere avancerede muligheder for at ændre kategoriske variable, oprette nye kategoriske variabler fra eksisterende data eller nye variable baseret på R-kode. Nederst kan du gendanne originale data." "Split the variable","Opdel variablen" "Original data","Oprindelige data" "Preview of result","Forhåndsvisning af resultat" @@ -255,6 +275,7 @@ "Browse data preview","Forhåndsvisning af resultat" "Split character string","Opdel tegnstreng" "Split text","Opdel tekst" +"Split a text column by a recognised delimiter.","Ingen tegnvariabler med accepterede afgrænsere fundet." "Split a character string by a common delimiter","Opdel en tekstkolonne med en fælles afgrænser" "Apply split","Anvend opdeling" "Stacked relative barplot","Stablet relativt søjlediagram" @@ -269,10 +290,14 @@ "Words","Ord" "Shorten to first letters","Afkort til første bogstaver" "Shorten to first words","Afkort til de første ord" +"Missings across variables by the variable **'{input$missings_var}'**","Manglende værdier på tværs af variablerne **'{input$missings_var}'**" +"Missing vs non-missing observations in the variable **'{input$missings_var}'**","Manglende vs. ikke-manglende observationer i variablen **'{input$missings_var}'**" +"Evaluate missingness by either comparing missing values across variables (optionally grouped by af categorical or dichotomous variable) or compare variables grouped by the missing status (missing or not) of an outcome variable. If there is a significant difference i the missingness, this may cause a bias in you data and should be considered carefully interpreting the data and analyses as data may not be missing at random.","Evaluer manglende værdier ved enten at sammenligne manglende værdier på tværs af variabler (valgfrit grupperet efter en kategorisk eller dikotom variabel) eller sammenligne variabler grupperet efter manglende status (mangler eller ej) for en udfaldsvariabel. Hvis der er en signifikant forskel i manglende værdier, kan dette forårsage en bias i dine data, og det bør overvejes omhyggeligt at fortolke dataene og analyserne, da data muligvis ikke mangler tilfældigt." "Calculating. Hold tight for a moment..","Beregner. Hold lige fast et øjeblik.." "Overview of missing observations","Oversigt over manglende observationer" "Analysis method for missingness overview","Analysemetode for oversigt over manglende indhold" "Overview of missings across variables","Oversigt over mangler på tværs af variabler" +"Overview of difference in variables by missing status in outcome","Oversigt over forskel i variabler ved manglende status i resultat" "Select a variable for grouped overview","Vælg en variabel til grupperet oversigt" "Select outcome variable for overview","Vælg resultatvariabel for oversigt" "No outcome measure chosen","Ingen resultatmål valgt" @@ -316,14 +341,3 @@ "Reorder factor levels","Omarranger niveauer" "Modify factor levels","Modify factor levels" "Reorder or rename the levels of factor/categorical variables.","Reorder or rename the levels of factor/categorical variables." -"Maximum number of observations:","Maximum number of observations:" -"setting to 0 includes all","setting to 0 includes all" -"Select a dataset from your environment or sample dataset from a package.","Select a dataset from your environment or sample dataset from a package." -"Select a sample dataset from a package.","Select a sample dataset from a package." -"Data ready to be imported!","Data ready to be imported!" -"Data has %s obs. of %s variables.","Data has %s obs. of %s variables." -"Data successfully imported!","Data successfully imported!" -"Click to see data","Click to see data" -"No data present.","No data present." -"You have provided a complete dataset with no missing values.","You have provided a complete dataset with no missing values." -"Start by loading data.","Start by loading data." diff --git a/app_docker/translations/translation_sw.csv b/app_docker/translations/translation_sw.csv index f17394c2..84b00b3e 100644 --- a/app_docker/translations/translation_sw.csv +++ b/app_docker/translations/translation_sw.csv @@ -5,6 +5,7 @@ "REDCap server export","Usafirishaji wa seva ya REDCap" "Local or sample data","Data ya ndani au ya sampuli" "Please be mindfull handling sensitive data","Tafadhali kuwa mwangalifu kushughulikia data nyeti" +"The ***FreesearchR*** app only stores data for analyses, but please only use with sensitive data when running locally. [Read more here](https://agdamsbo.github.io/FreesearchR/#run-locally-on-your-own-machine).","Programu ya ***FreesearchR*** huhifadhi data kwa ajili ya uchambuzi pekee, lakini tafadhali tumia tu na data nyeti unapoendesha ndani. [Soma zaidi hapa](https://agdamsbo.github.io/FreesearchR/#run-locally-on-your-own-machine)." "Quick overview","Muhtasari wa haraka" "Select variables for final import","Chagua vigezo vya kuingiza mwisho" "Exclude incomplete variables:","Ondoa vigezo visivyokamilika:" @@ -23,11 +24,16 @@ "Apply filter on observation","Tumia kichujio wakati wa uchunguzi" "Edit and create data","Hariri na uunde data" "Subset, rename and convert variables","Weka sehemu ndogo, badilisha jina na ubadilishe vigezo" +"Below, are several options for simple data manipulation like update variables by renaming, creating new labels (for nicer tables in the report) and changing variable classes (numeric, factor/categorical etc.).","Hapa chini, kuna chaguo kadhaa za urekebishaji rahisi wa data kama vile kusasisha vigezo kwa kubadilisha majina, kuunda lebo mpya (kwa majedwali mazuri zaidi katika ripoti) na kubadilisha madarasa ya vigezo (nambari, vipengele/kategoria n.k.)." +"Please note that data modifications are applied before any filtering.","Tafadhali kumbuka kwamba marekebisho ya data hutumika kabla ya kuchuja yoyote." "Advanced data manipulation","Udhibiti wa data wa hali ya juu" "Below options allow more advanced varaible manipulations.","Chaguzi zilizo hapa chini huruhusu udanganyifu wa hali ya juu zaidi unaoweza kubadilika." "New factor","Kipengele kipya" +"Create factor/categorical variable from a continous variable (number/date/time).","Unda kigezo cha kipengele/kitengo kutoka kwa kigezo endelevu (nambari/tarehe/saa)." "New variable","Kigezo kipya" +"Create a new variable based on an R-expression.","Unda kigezo kipya kulingana na usemi wa R." "Compare modified data to original","Linganisha data iliyobadilishwa na ya asili" +"Raw print of the original vs the modified data.","Chapisho ghafi la data asili dhidi ya data iliyorekebishwa." "Original data:","Data asilia:" "Modified data:","Data iliyorekebishwa:" "New column name:","Jina jipya la safu wima:" @@ -58,6 +64,7 @@ "Imported data","Data iliyoingizwa" "www/intro.md","www/intro.md" "Choose your data","Chagua data yako" +"Upload a file, get data directly from REDCap or use local or sample data.","Pakia faili, pata data moja kwa moja kutoka REDCap au tumia data ya ndani au sampuli." "Factor variable to reorder:","Kigezo cha vipengele ili kupanga upya:" "Sort by levels","Panga kwa viwango" "Sort by count","Panga kwa hesabu" @@ -88,7 +95,9 @@ "Visuals","Picha" "Regression","Urejeshaji" "Download","Pakua" +"{data_text} has {n} observations and {n_var} variables, with {n_complete} ({p_complete} %) complete cases.","{data_text} ina uchunguzi wa {n} na vigezo vya {n_var}, pamoja na visa kamili vya {n_complete} ({p_complete}%)." "Prepare","Tayarisha" +"At 0, only complete variables are included; at 100, all variables are included.","Katika 0, ni vigezo kamili pekee vilivyojumuishwa; katika 100, vigezo vyote vimejumuishwa." "The following variable pairs are highly correlated: {sentence_paste(.x,and_str)}.\nConsider excluding one {more}from the dataset to ensure variables are independent.","Jozi zifuatazo za vigeu zina uhusiano wa hali ya juu: {sentence_paste(.x,and_str)}.\nFikiria kutenga moja {zaidi} kutoka kwenye seti ya data ili kuhakikisha vigeu vinajitegemea." "No variables have a correlation measure above the threshold.","Hakuna vigezo vyenye kipimo cha uhusiano kilicho juu ya kizingiti." "and","na" @@ -132,17 +141,23 @@ "Create plot","Unda njama" "Coefficients plot","Mchoro wa viambato" "Checks","Hundi" +"Below you find a summary table for quick insigths, and on the right you can visualise data classes, browse observations and apply different data filters.","Hapa chini kuna jedwali la muhtasari kwa ajili ya ufahamu wa haraka, na upande wa kulia unaweza kuibua madarasa ya data, kuvinjari uchunguzi na kutumia vichujio tofauti vya data." "Browse observations","Vinjari uchunguzi" "Settings","Mipangilio" "The following error occured on determining correlations:","Hitilafu ifuatayo ilitokea katika kubaini uhusiano:" +"We encountered the following error creating your report:","Tulikutana na hitilafu ifuatayo katika kuunda ripoti yako:" "No missing observations","Hakuna uchunguzi unaokosekana" "There is a total of {p_miss} % missing observations.","Kuna jumla ya uchunguzi wa {p_miss}% unaokosekana." "Median:","Wastani:" "Restore original data","Rejesha data asili" +"Reset to original imported dataset. Careful! There is no un-doing.","Rudisha kwenye seti ya data asili iliyoingizwa. Kuwa mwangalifu! Hakuna kutengua." "Characteristics","Sifa" +"Only factor/categorical variables are available for stratification. Go back to the 'Prepare' tab to reclass a variable if it's not on the list.","Vigezo vya vipengele/kategoria pekee ndivyo vinavyopatikana kwa ajili ya uainishaji wa tabaka. Rudi kwenye kichupo cha 'Tayarisha' ili kupanga upya kigezo ikiwa hakipo kwenye orodha." "Compare strata?","Linganisha tabaka?" "Correlations","Uhusiano" +"To avoid evaluating the correlation of the outcome variable, this can be excluded from the plot or select 'none'.","Ili kuepuka kutathmini uhusiano wa kigezo cha matokeo, hii inaweza kutengwa kwenye njama au kuchagua 'hakuna'." "Correlation cut-off","Kikomo cha uhusiano" +"Set the cut-off for considered 'highly correlated'.","Weka kikomo cha 'kinachohusiana sana'." "Missings","Hazipo" "Class","Darasa" "Observations","Uchunguzi" @@ -152,9 +167,11 @@ "Confirm","Thibitisha" "The filtered data","Data iliyochujwa" "Create new factor","Unda kipengele kipya" +"This window is aimed at advanced users and require some *R*-experience!","Dirisha hili linalenga watumiaji wa hali ya juu na linahitaji uzoefu wa *R*!" "Create new variables","Unda vigezo vipya" "Select data types to include","Chagua aina za data za kujumuisha" "Uploaded data overview","Muhtasari wa data iliyopakiwa" +"Here is an overview of how your data is interpreted, and where data is missing. Use this information to consider if data is missing at random or if some observations are missing systematically wich may be caused by an observation bias.","Hapa kuna muhtasari wa jinsi data yako inavyotafsiriwa, na mahali ambapo data inakosekana. Tumia taarifa hii kuzingatia ikiwa data inakosekana bila mpangilio au ikiwa baadhi ya uchunguzi unakosekana kimfumo ambao unaweza kusababishwa na upendeleo wa uchunguzi." "Specify covariables","Bainisha vigeu vinavyoweza kuunganishwa" "If none are selected, all are included.","Ikiwa hakuna aliyechaguliwa, wote wamejumuishwa." "Analyse","Changanua" @@ -192,6 +209,7 @@ "List of datasets...","Orodha ya seti za data..." "No data selected!","Hakuna data iliyochaguliwa!" "No dataset here...","Hakuna seti ya data hapa..." +"Use a dataset from your environment or from the environment of a package.","Tumia seti ya data kutoka kwa mazingira yako au kutoka kwa mazingira ya kifurushi." "Not a data.frame","Sio data.frame" "Select source","Chagua chanzo" "Select a data source:","Chagua chanzo cha data:" @@ -211,6 +229,7 @@ "Multivariable regression model checks","Ukaguzi wa modeli ya urejeshaji unaoweza kubadilika-badilika" "Grouped by {get_label(data,ter)}","Imepangwa kwa makundi kulingana na {get_label(data,ter)}" "Option to perform statistical comparisons between strata in baseline table.","Chaguo la kufanya ulinganisho wa takwimu kati ya tabaka katika jedwali la msingi." +"Press 'Evaluate' to create the comparison table.","Bonyeza 'Tathmini' ili kuunda jedwali la kulinganisha." "The data includes {n_col} variables. Please limit to 100.","Data inajumuisha vigezo vya {n_col}. Tafadhali punguza hadi 100." "Data import","Uingizaji wa data" "Data import formatting","Uumbizaji wa kuingiza data" @@ -242,6 +261,7 @@ "By specified numbers","Kwa nambari zilizoainishwa" "By quantiles (groups of equal size)","Kwa quantiles (vikundi vya ukubwa sawa)" "Please fill in web address and API token, then press 'Connect'.","Tafadhali jaza anwani ya wavuti na tokeni ya API, kisha bonyeza 'Unganisha'." +"There are more advanced options to modify factor/categorical variables as well as create new factor from an existing variable or new variables with R code. At the bottom you can restore the original data.","Kuna chaguo za hali ya juu zaidi za kurekebisha vigezo vya vipengele/kategoria pamoja na kuunda kipengele kipya kutoka kwa kigezo kilichopo au vigezo vipya vyenye msimbo wa R. Chini unaweza kurejesha data asili." "Text or character to split string by","Maandishi au herufi ya kugawanya mfuatano kwa" "Split the variable","Gawanya kigezo" "Variable to split:","Kinachoweza kubadilika hadi kugawanyika:" @@ -256,6 +276,7 @@ "Original data","Data asili" "Preview of result","Hakikisho la matokeo" "No character variables with accepted delimiters detected.","Hakuna vigezo vya herufi vilivyo na vidhibiti vinavyokubalika vilivyogunduliwa." +"Split a text column by a recognised delimiter.","Gawanya safu wima ya maandishi kwa kitenga kinachotambulika." "Apply split","Tumia mgawanyiko" "Stacked relative barplot","Kipande cha baruni kilichopangwa kwa mirundiko" "Create relative stacked barplots to show the distribution of categorical levels","Unda viwanja vya baruni vilivyopangwa ili kuonyesha usambazaji wa viwango vya kategoria" @@ -269,10 +290,14 @@ "Words","Maneno" "Shorten to first letters","Fupisha herufi za kwanza" "Shorten to first words","Fupisha maneno ya kwanza" +"Missings across variables by the variable **'{input$missings_var}'**","Hazipo katika vigezo kwa kigezo **'{input$missings_var}'**" +"Missing vs non-missing observations in the variable **'{input$missings_var}'**","Uchunguzi unaokosekana dhidi ya usiokosekana katika kigezo **'{input$missings_var}'**" +"Evaluate missingness by either comparing missing values across variables (optionally grouped by af categorical or dichotomous variable) or compare variables grouped by the missing status (missing or not) of an outcome variable. If there is a significant difference i the missingness, this may cause a bias in you data and should be considered carefully interpreting the data and analyses as data may not be missing at random.","Tathmini upungufu kwa kulinganisha thamani zinazokosekana katika vigezo (hiari zilizopangwa kwa mujibu wa kigezo cha kategoria au cha pande mbili) au linganisha vigezo vilivyopangwa kwa mujibu wa hali inayokosekana (inayokosekana au isiyokosekana) ya kigezo cha matokeo. Ikiwa kuna tofauti kubwa katika upungufu, hii inaweza kusababisha upendeleo katika data yako na inapaswa kuzingatiwa kwa uangalifu kutafsiri data na uchambuzi kwani data inaweza isikosekane bila mpangilio." "Calculating. Hold tight for a moment..","Kuhesabu. Shikilia kwa muda.." "Overview of missing observations","Muhtasari wa uchunguzi uliokosekana" "Analysis method for missingness overview","Mbinu ya uchambuzi wa muhtasari wa kukosekana" "Overview of missings across variables","Muhtasari wa mambo yanayokosekana katika vigezo" +"Overview of difference in variables by missing status in outcome","Muhtasari wa tofauti katika vigezo kwa kukosa hali katika matokeo" "Select a variable for grouped overview","Chagua kigezo cha muhtasari wa kikundi" "Select outcome variable for overview","Chagua kigezo cha matokeo kwa muhtasari" "No outcome measure chosen","Hakuna kipimo cha matokeo kilichochaguliwa" @@ -316,14 +341,3 @@ "Reorder factor levels","Reorder factor levels" "Modify factor levels","Modify factor levels" "Reorder or rename the levels of factor/categorical variables.","Reorder or rename the levels of factor/categorical variables." -"Maximum number of observations:","Maximum number of observations:" -"setting to 0 includes all","setting to 0 includes all" -"Select a dataset from your environment or sample dataset from a package.","Select a dataset from your environment or sample dataset from a package." -"Select a sample dataset from a package.","Select a sample dataset from a package." -"Data ready to be imported!","Data ready to be imported!" -"Data has %s obs. of %s variables.","Data has %s obs. of %s variables." -"Data successfully imported!","Data successfully imported!" -"Click to see data","Click to see data" -"No data present.","No data present." -"You have provided a complete dataset with no missing values.","You have provided a complete dataset with no missing values." -"Start by loading data.","Start by loading data." diff --git a/inst/apps/FreesearchR/app.R b/inst/apps/FreesearchR/app.R index b72cf92c..346f3ec4 100644 --- a/inst/apps/FreesearchR/app.R +++ b/inst/apps/FreesearchR/app.R @@ -1,7 +1,7 @@ ######## -#### Current file: /var/folders/9l/xbc19wxx0g79jdd2sf_0v291mhwh7f/T//Rtmpp0JgLn/file73e17f71b1a4.R +#### Current file: /var/folders/9l/xbc19wxx0g79jdd2sf_0v291mhwh7f/T//RtmpBwniSk/file141b66174230e.R ######## i18n_path <- system.file("translations", package = "FreesearchR") @@ -51,16 +51,6 @@ i18n <- shiny.i18n::Translator$new(translation_csvs_path = i18n_path) # i18n <- shiny.i18n::Translator$new(translation_csvs_path = here::here("inst/translations/")) i18n$set_translation_language("en") -## Global freesearchR vars -if (!"global_freesearchR" %in% ls(name = globalenv())) { - global_freesearchR <- list( - include_globalenv = FALSE, - data_limit_default = 1000, - data_limit_upper = 10000, - data_limit_lower = 1 - ) -} - ######## #### Current file: /Users/au301842/FreesearchR/app/functions.R @@ -72,7 +62,7 @@ if (!"global_freesearchR" %in% ls(name = globalenv())) { #### Current file: /Users/au301842/FreesearchR/R//app_version.R ######## -app_version <- function()'26.2.2' +app_version <- function()'26.1.2' ######## @@ -3726,7 +3716,7 @@ write_quarto <- function(data, ...) { ) } -write_rmd <- function(data, ..., params.args = NULL) { +write_rmd <- function(data, ..., params.args=NULL) { # Exports data to temporary location # # I assume this is more secure than putting it in the www folder and deleting @@ -3741,10 +3731,7 @@ write_rmd <- function(data, ..., params.args = NULL) { ## Ref: https://github.com/quarto-dev/quarto-cli/discussions/4041 ## Outputs to the same as the .qmd file rmarkdown::render( - params = modifyList( - list(data.file = "web_data.rds", version = app_version()), - params.args - ), + params = modifyList(list(data.file = "web_data.rds",version=app_version()),params.args), # execute_params = list(data.file = temp), ... ) @@ -3812,7 +3799,12 @@ argsstring2list <- function(string) { factorize <- function(data, vars) { if (!is.null(vars)) { data |> - dplyr::mutate(dplyr::across(dplyr::all_of(vars), REDCapCAST::as_factor)) + dplyr::mutate( + dplyr::across( + dplyr::all_of(vars), + REDCapCAST::as_factor + ) + ) } else { data } @@ -3845,30 +3837,32 @@ dummy_Imports <- function() { #' @returns data #' @export #' -file_export <- function(data, - output.format = c("df", "teal", "list"), - filename, - ...) { +file_export <- function(data, output.format = c("df", "teal", "list"), filename, ...) { output.format <- match.arg(output.format) filename <- gsub("-", "_", filename) if (output.format == "teal") { - out <- within(teal_data(), { - assign( - name, - value |> + out <- within( + teal_data(), + { + assign(name, value |> dplyr::bind_cols(.name_repair = "unique_quiet") |> - default_parsing() - ) - }, value = data, name = filename) + default_parsing()) + }, + value = data, + name = filename + ) datanames(out) <- filename } else if (output.format == "df") { out <- data |> default_parsing() } else if (output.format == "list") { - out <- list(data = data, name = filename) + out <- list( + data = data, + name = filename + ) out <- c(out, ...) } @@ -3903,8 +3897,7 @@ default_parsing <- function(data) { remove_nested_list() |> REDCapCAST::parse_data() |> REDCapCAST::as_factor() |> - REDCapCAST::numchar2fct(numeric.threshold = 8, - character.throshold = 10) |> + REDCapCAST::numchar2fct(numeric.threshold = 8, character.throshold = 10) |> REDCapCAST::as_logical() |> REDCapCAST::fct_drop() @@ -3968,11 +3961,9 @@ remove_empty_attr <- function(data) { #' @examples #' data.frame(a = 1:10, b = NA, c = c(2, NA)) |> remove_empty_cols(cutoff = .5) remove_empty_cols <- function(data, cutoff = .7) { - filter <- apply(X = data, - MARGIN = 2, - FUN = \(.x) { - sum(as.numeric(!is.na(.x))) / length(.x) - }) >= cutoff + filter <- apply(X = data, MARGIN = 2, FUN = \(.x){ + sum(as.numeric(!is.na(.x))) / length(.x) + }) >= cutoff data[filter] } @@ -4032,25 +4023,14 @@ missing_fraction <- function(data) { #' sample(c(1:8, NA), 20, TRUE) #' ) |> data_description() data_description <- function(data, data_text = "Data") { - data <- if (shiny::is.reactive(data)) - data() - else - data + data <- if (shiny::is.reactive(data)) data() else data n <- nrow(data) n_var <- ncol(data) n_complete <- sum(complete.cases(data)) p_complete <- signif(100 * n_complete / n, 3) - if (is.null(data)) { - i18n$t("No data present.") - } else { - glue::glue( - i18n$t( - "{data_text} has {n} observations and {n_var} variables, with {n_complete} ({p_complete} %) complete cases." - ) - ) - } + glue::glue(i18n$t("{data_text} has {n} observations and {n_var} variables, with {n_complete} ({p_complete} %) complete cases.")) # sprintf( # "%s has %s observations and %s variables, with %s (%s%%) complete cases.", # data_text, @@ -4159,8 +4139,7 @@ if_not_missing <- function(data, default = NULL) { #' ) |> merge_expression() merge_expression <- function(data) { Reduce( - f = function(x, y) - rlang::expr(!!x %>% !!y), + f = function(x, y) rlang::expr(!!x %>% !!y), x = data ) } @@ -4184,8 +4163,7 @@ merge_expression <- function(data) { pipe_string <- function(data, collapse = "|>\n") { if (is.list(data)) { Reduce( - f = function(x, y) - glue::glue("{x}{collapse}{y}"), + f = function(x, y) glue::glue("{x}{collapse}{y}"), x = data ) } else { @@ -4209,15 +4187,10 @@ pipe_string <- function(data, collapse = "|>\n") { #' merge_expression() |> #' expression_string() expression_string <- function(data, assign.str = "") { - exp.str <- if (is.call(data)) - deparse(data) - else - data + exp.str <- if (is.call(data)) deparse(data) else data - out <- paste0(assign.str, gsub("%>%", "|>\n", paste(gsub( - '"', "'", paste(exp.str, collapse = "") - ), collapse = ""))) - out <- collapse_spaces(out, preserve_newlines = FALSE) + out <- paste0(assign.str, gsub("%>%", "|>\n", paste(gsub('"', "'", paste(exp.str, collapse = "")), collapse = ""))) + out <- collapse_spaces(out,preserve_newlines = FALSE) gsub("`", "", out) } @@ -4321,16 +4294,10 @@ remove_nested_list <- function(data) { #' rlang::expr(FreesearchR::set_column_label(label = !!ls3)) |> expression_string() set_column_label <- function(data, label, overwrite = TRUE) { purrr::imap(data, function(.data, .name) { - ls <- if (is.list(label)) - unlist(label) - else - label + ls <- if (is.list(label)) unlist(label) else label ls[ls == ""] <- NA if (.name %in% names(ls)) { - out <- REDCapCAST::set_attr(.data, - unname(ls[.name]), - attr = "label", - overwrite = overwrite) + out <- REDCapCAST::set_attr(.data, unname(ls[.name]), attr = "label", overwrite = overwrite) remove_empty_attr(out) } else { .data @@ -4381,8 +4348,11 @@ append_column <- function(data, column, name, index = "right") { } new_df <- setNames(data.frame(column), name) - list(data[seq_len(index - 1)], new_df, if (!index > ncol(data)) - data[index:ncol(data)]) |> + list( + data[seq_len(index - 1)], + new_df, + if (!index > ncol(data)) data[index:ncol(data)] + ) |> dplyr::bind_cols() } @@ -4407,7 +4377,7 @@ is_identical_to_previous <- function(data, no.name = TRUE) { lagged <- c(FALSE, data[seq_len(length(data) - 1)]) } - vapply(seq_len(length(data)), \(.x) { + vapply(seq_len(length(data)), \(.x){ if (isTRUE(no.name)) { identical(unname(lagged[.x]), unname(data[.x])) } else { @@ -4426,11 +4396,8 @@ is_identical_to_previous <- function(data, no.name = TRUE) { #' #' @examples #' c("foo bar", "fooBar21", "!!Foo'B'a-r", "foo_bar", "F OO bar") |> simple_snake() -simple_snake <- function(data) { - gsub("[\\s+]", - "_", - gsub("[^\\w\\s:-]", "", tolower(data), perl = TRUE), - perl = TRUE) +simple_snake <- function(data){ + gsub("[\\s+]","_",gsub("[^\\w\\s:-]", "", tolower(data), perl=TRUE), perl=TRUE) } #' Data type assessment. @@ -4467,8 +4434,7 @@ data_type <- function(data) { out <- "empty" } else if (l_unique < 2) { out <- "monotone" - } else if (any(c("factor", "logical") %in% cl_d) | - l_unique == 2) { + } else if (any(c("factor", "logical") %in% cl_d) | l_unique == 2) { if (identical("logical", cl_d) | l_unique == 2) { out <- "dichotomous" } else { @@ -4504,18 +4470,14 @@ data_type <- function(data) { #' data_types() data_types <- function() { list( - "empty" = list(descr = "Variable of all NAs", classes = "Any class"), - "monotone" = list(descr = "Variable with only one unique value", classes = - "Any class"), - "dichotomous" = list(descr = "Variable with only two unique values", classes = - "Any class"), - "categorical" = list(descr = "Factor variable", classes = "factor (ordered or unordered)"), - "text" = list(descr = "Character variable", classes = "character"), - "datetime" = list(descr = "Variable of time, date or datetime values", classes = - "hms, Date, POSIXct and POSIXt"), - "continuous" = list(descr = "Numeric variable", classes = "numeric, integer or double"), - "unknown" = list(descr = "Anything not falling within the previous", classes = - "Any other class") + "empty" = list(descr="Variable of all NAs",classes="Any class"), + "monotone" = list(descr="Variable with only one unique value",classes="Any class"), + "dichotomous" = list(descr="Variable with only two unique values",classes="Any class"), + "categorical"= list(descr="Factor variable",classes="factor (ordered or unordered)"), + "text"= list(descr="Character variable",classes="character"), + "datetime"= list(descr="Variable of time, date or datetime values",classes="hms, Date, POSIXct and POSIXt"), + "continuous"= list(descr="Numeric variable",classes="numeric, integer or double"), + "unknown"= list(descr="Anything not falling within the previous",classes="Any other class") ) } @@ -4524,7 +4486,7 @@ data_types <- function() { #### Current file: /Users/au301842/FreesearchR/R//hosted_version.R ######## -hosted_version <- function()'v26.2.2-260223' +hosted_version <- function()'v26.1.2-260112' ######## @@ -4548,8 +4510,6 @@ html_dependency_FreesearchR <- function() { ######## - - #' @title Import data from an Environment #' #' @description Let the user select a dataset from its own environment or from a package's environment. @@ -4569,6 +4529,7 @@ import_globalenv_ui <- function(id, globalenv = TRUE, packages = datamods::get_data_packages(), title = TRUE) { + ns <- NS(id) choices <- list() @@ -4581,14 +4542,15 @@ import_globalenv_ui <- function(id, if (isTRUE(globalenv)) { selected <- "Global Environment" - select_label <- i18n$t("Select a dataset from your environment or sample dataset from a package.") } else { selected <- packages[1] - select_label <- i18n$t("Select a sample dataset from a package.") } if (isTRUE(title)) { - title <- tags$h4(i18n$t("Import a dataset from an environment"), class = "datamods-title") + title <- tags$h4( + i18n$t("Import a dataset from an environment"), + class = "datamods-title" + ) } tags$div( @@ -4615,13 +4577,14 @@ import_globalenv_ui <- function(id, # options = list(title = i18n$t("List of datasets...")), width = "100%" ), + tags$div( id = ns("import-placeholder"), shinyWidgets::alert( id = ns("import-result"), status = "info", tags$b(i18n$t("No data selected!")), - select_label, + i18n$t("Use a dataset from your environment or from the environment of a package."), dismissible = TRUE ) ), @@ -4635,14 +4598,12 @@ import_globalenv_ui <- function(id, #' @param btn_show_data Display or not a button to display data in a modal window if import is successful. -#' #' @param show_data_in Where to display data: in a `"popup"` or in a `"modal"` window. #' @param trigger_return When to update selected data: #' `"button"` (when user click on button) or #' `"change"` (each time user select a dataset in the list). #' @param return_class Class of returned data: `data.frame`, `data.table`, `tbl_df` (tibble) or `raw`. #' @param reset A `reactive` function that when triggered resets the data. -#' @param limit_data upper limit to imported data #' #' @export #' @@ -4656,17 +4617,16 @@ import_globalenv_server <- function(id, show_data_in = c("popup", "modal"), trigger_return = c("button", "change"), return_class = c("data.frame", "data.table", "tbl_df", "raw"), - reset = reactive(NULL), - limit_data = NULL) { + reset = reactive(NULL)) { + trigger_return <- match.arg(trigger_return) return_class <- match.arg(return_class) module <- function(input, output, session) { + ns <- session$ns imported_rv <- reactiveValues(data = NULL, name = NULL) - temporary_rv <- reactiveValues(data = NULL, - name = NULL, - status = NULL) + temporary_rv <- reactiveValues(data = NULL, name = NULL, status = NULL) observeEvent(reset(), { temporary_rv$data <- NULL @@ -4681,7 +4641,6 @@ import_globalenv_server <- function(id, }) observeEvent(input$env, { - # browser() if (identical(input$env, "Global Environment")) { choices <- datamods:::search_obj("data.frame") } else { @@ -4691,14 +4650,9 @@ import_globalenv_server <- function(id, choices <- i18n$t("No dataset here...") choicesOpt <- list(disabled = TRUE) } else { - choicesOpt <- list(subtext = get_dimensions(choices,filter_df=TRUE)) - # browser() - ## choices are corrected if GlobalEnv is not chosen - if (!identical(input$env, "Global Environment")) { - choices <- structure(names(choicesOpt$subtext), - package = attr(choices, "package")) - } - + choicesOpt <- list( + subtext = datamods:::get_dimensions(choices) + ) } temporary_rv$package <- attr(choices, "package") shinyWidgets::updatePickerInput( @@ -4709,8 +4663,7 @@ import_globalenv_server <- function(id, choicesOpt = choicesOpt, options = list( title = i18n$t("List of datasets..."), - "live-search" = TRUE - ) + "live-search" = TRUE) ) }) @@ -4719,9 +4672,7 @@ import_globalenv_server <- function(id, id = "import-result", status = "info", tags$b(i18n$t("No data selected!")), - i18n$t( - "Use a dataset from your environment or from the environment of a package." - ), + i18n$t("Use a dataset from your environment or from the environment of a package."), dismissible = TRUE ) ) @@ -4735,68 +4686,58 @@ import_globalenv_server <- function(id, - observeEvent(input$data, - { - if (!isTruthy(input$data)) { - datamods:::toggle_widget(inputId = "confirm", enable = FALSE) - datamods:::insert_alert( - selector = ns("import"), - status = "info", - tags$b(i18n$t("No data selected!")), - i18n$t( - "Use a dataset from your environment or from the environment of a package." - ) - ) - } else { - # browser() - name_df <- input$data + observeEvent(input$data, { + if (!isTruthy(input$data)) { + datamods:::toggle_widget(inputId = "confirm", enable = FALSE) + datamods:::insert_alert( + selector = ns("import"), + status = "info", + tags$b(i18n$t("No data selected!")), + i18n$t("Use a dataset from your environment or from the environment of a package.") + ) + } else { + name_df <- input$data - if (!is.null(temporary_rv$package)) { - attr(name_df, "package") <- temporary_rv$package - } + if (!is.null(temporary_rv$package)) { + attr(name_df, "package") <- temporary_rv$package + } - imported <- try(get_env_data(name_df), silent = TRUE) + imported <- try(get_env_data(name_df), silent = TRUE) - if (inherits(imported, "try-error") || - NROW(imported) < 1) { - datamods:::toggle_widget(inputId = "confirm", enable = FALSE) - datamods:::insert_error(mssg = i18n$t(attr(imported, "condition")$message)) - temporary_rv$status <- "error" - temporary_rv$data <- NULL - temporary_rv$name <- NULL - } else { - datamods:::toggle_widget(inputId = "confirm", enable = TRUE) - datamods:::insert_alert( - selector = ns("import"), - status = "success", - make_success_alert( - data = imported, - trigger_return = trigger_return, - btn_show_data = btn_show_data - ) - ) - pkg <- attr(name_df, "package") - if (!is.null(pkg)) { - name <- paste(pkg, input$data, sep = "::") - } else { - name <- input$data - } - name <- trimws(sub("\\(([^\\)]+)\\)", "", name)) - temporary_rv$status <- "success" - - temporary_rv$data <- limit_data_size(imported,limit = limit_data) - temporary_rv$name <- name - } - } - }, - ignoreInit = TRUE, - ignoreNULL = FALSE) + if (inherits(imported, "try-error") || NROW(imported) < 1) { + datamods:::toggle_widget(inputId = "confirm", enable = FALSE) + datamods:::insert_error(mssg = i18n$t(attr(imported, "condition")$message)) + temporary_rv$status <- "error" + temporary_rv$data <- NULL + temporary_rv$name <- NULL + } else { + datamods:::toggle_widget(inputId = "confirm", enable = TRUE) + datamods:::insert_alert( + selector = ns("import"), + status = "success", + datamods:::make_success_alert( + imported, + trigger_return = trigger_return, + btn_show_data = btn_show_data + ) + ) + pkg <- attr(name_df, "package") + if (!is.null(pkg)) { + name <- paste(pkg, input$data, sep = "::") + } else { + name <- input$data + } + name <- trimws(sub("\\(([^\\)]+)\\)", "", name)) + temporary_rv$status <- "success" + temporary_rv$data <- imported + temporary_rv$name <- name + } + } + }, ignoreInit = TRUE, ignoreNULL = FALSE) observeEvent(input$see_data, { - show_data(temporary_rv$data, - title = i18n$t("Imported data"), - type = show_data_in) + show_data(temporary_rv$data, title = i18n$t("Imported data"), type = show_data_in) }) observeEvent(input$confirm, { @@ -4820,7 +4761,10 @@ import_globalenv_server <- function(id, } } - moduleServer(id = id, module = module) + moduleServer( + id = id, + module = module + ) } @@ -4867,7 +4811,6 @@ get_data_packages <- function() { #' list_pkg_data("ggplot2") list_pkg_data <- function(pkg) { if (isTRUE(requireNamespace(pkg, quietly = TRUE))) { - # browser() list_data <- data(package = pkg, envir = environment())$results[, "Item"] list_data <- sort(list_data) attr(list_data, "package") <- pkg @@ -4885,27 +4828,17 @@ list_pkg_data <- function(pkg) { get_env_data <- function(obj, env = globalenv()) { pkg <- attr(obj, "package") re <- regexpr(pattern = "\\(([^\\)]+)\\)", text = obj) - obj_ <- substr( - x = obj, - start = re + 1, - stop = re + attr(re, "match.length") - 2 - ) - obj <- gsub(pattern = "\\s.*", - replacement = "", - x = obj) + obj_ <- substr(x = obj, start = re + 1, stop = re + attr(re, "match.length") - 2) + obj <- gsub(pattern = "\\s.*", replacement = "", x = obj) if (obj %in% ls(name = env)) { get(x = obj, envir = env) } else if (!is.null(pkg) && !identical(pkg, "")) { - res <- suppressWarnings(try(get(utils::data( - list = obj, - package = pkg, - envir = environment() - )), silent = TRUE)) + res <- suppressWarnings(try( + get(utils::data(list = obj, package = pkg, envir = environment())), silent = TRUE + )) if (!inherits(res, "try-error")) return(res) - data(list = obj_, - package = pkg, - envir = environment()) + data(list = obj_, package = pkg, envir = environment()) get(obj, envir = environment()) } else { NULL @@ -4913,23 +4846,16 @@ get_env_data <- function(obj, env = globalenv()) { } -#' Extension of the helper function from datamods -#' -#' @param objs objs -#' @param filter_df flag to only include data frames -#' -#' @returns vector of data frames with the package names as attr -get_dimensions <- function(objs,filter_df=TRUE) { - if (is.null(objs)){ +get_dimensions <- function(objs) { + if (is.null(objs)) return(NULL) - } dataframes_dims <- Map( f = function(name, pkg) { attr(name, "package") <- pkg tmp <- suppressWarnings(get_env_data(name)) if (is.data.frame(tmp)) { sprintf("%d obs. of %d variables", nrow(tmp), ncol(tmp)) - } else if (isFALSE(filter_df)) { + } else { i18n$t("Not a data.frame") } }, @@ -4964,18 +4890,8 @@ get_dimensions <- function(objs,filter_df=TRUE) { import_file_ui <- function(id, title = "", preview_data = TRUE, - file_extensions = c(".csv", - ".txt", - ".xls", - ".xlsx", - ".rds", - ".fst", - ".sas7bdat", - ".sav"), - layout_params = c("dropdown", "inline"), - limit_default = 10000, - limit_upper = 10000, - limit_lower = 0) { + file_extensions = c(".csv", ".txt", ".xls", ".xlsx", ".rds", ".fst", ".sas7bdat", ".sav"), + layout_params = c("dropdown", "inline")) { ns <- shiny::NS(id) if (!is.null(layout_params)) { @@ -4983,7 +4899,10 @@ import_file_ui <- function(id, } if (isTRUE(title)) { - title <- shiny::tags$h4("Import a file", class = "datamods-title") + title <- shiny::tags$h4( + "Import a file", + class = "datamods-title" + ) } @@ -5008,26 +4927,7 @@ import_file_ui <- function(id, size = "sm", width = "100%" ), - shiny::helpText( - phosphoricons::ph("info"), - i18n$t("if several use a comma (',') to separate them") - ) - ), - shiny::tagAppendChild( - shinyWidgets::numericInputIcon( - inputId = ns("size_limit"), - label = i18n$t("Maximum number of observations:"), - value = limit_default, - min = limit_lower, - max = limit_upper, - icon = list("n ="), - size = "sm", - width = "100%" - ), - shiny::helpText( - phosphoricons::ph("info"), - i18n$t("setting to 0 includes all") - ) + shiny::helpText(phosphoricons::ph("info"), i18n$t("if several use a comma (',') to separate them")) ) ), shiny::column( @@ -5043,7 +4943,10 @@ import_file_ui <- function(id, selectInputIcon( inputId = ns("encoding"), label = i18n$t("Encoding:"), - choices = c("UTF-8" = "UTF-8", "Latin1" = "latin1"), + choices = c( + "UTF-8" = "UTF-8", + "Latin1" = "latin1" + ), icon = phosphoricons::ph("text-aa"), size = "sm", width = "100%" @@ -5097,8 +5000,7 @@ import_file_ui <- function(id, datamods:::html_dependency_datamods(), title, file_ui, - if (identical(layout_params, "inline")) - params_ui, + if (identical(layout_params, "inline")) params_ui, shiny::tags$div( class = "hidden", id = ns("sheet-container"), @@ -5118,8 +5020,7 @@ import_file_ui <- function(id, shiny::tags$b(i18n$t("No file selected.")), # shiny::textOutput(ns("trans_format_text")), # This is the easiest solution, though not gramatically perfect - i18n$t("You can choose between these file types:"), - paste(file_extensions, collapse = ", "), + i18n$t("You can choose between these file types:"), paste(file_extensions, collapse = ", "), # sprintf("You can import %s files", paste(file_extensions, collapse = ", ")), dismissible = TRUE ) @@ -5152,7 +5053,8 @@ import_file_server <- function(id, show_data_in = c("popup", "modal"), trigger_return = c("button", "change"), return_class = c("data.frame", "data.table", "tbl_df", "raw"), - reset = reactive(NULL)) { + reset = reactive(NULL), + limit=100000) { read_fns <- list( ods = "import_ods", dta = "import_dta", @@ -5170,12 +5072,7 @@ import_file_server <- function(id, module <- function(input, output, session) { ns <- session$ns imported_rv <- shiny::reactiveValues(data = NULL, name = NULL) - temporary_rv <- shiny::reactiveValues( - data = NULL, - name = NULL, - status = NULL, - sheets = 1 - ) + temporary_rv <- shiny::reactiveValues(data = NULL, name = NULL, status = NULL, sheets = 1) shiny::observeEvent(reset(), { temporary_rv$data <- NULL @@ -5224,12 +5121,10 @@ import_file_server <- function(id, input$skip_rows, input$dec, input$encoding, - input$na_label, - input$size_limit + input$na_label ), { req(input$file) - req(input$size_limit) if (!all(input$sheet %in% temporary_rv$sheets)) { sheets <- 1 @@ -5271,17 +5166,16 @@ import_file_server <- function(id, datamods:::insert_alert( selector = ns("import"), status = "success", - make_success_alert( - data = imported, + datamods:::make_success_alert( + imported, trigger_return = trigger_return, btn_show_data = btn_show_data, - extra = if (isTRUE(input$preview_data)) - i18n$t("First five rows are shown below:") + extra = if (isTRUE(input$preview_data)) i18n$t("First five rows are shown below:") ) ) ## As a protective measure, the dataset size is capped at cell limit - imported <- limit_data_size(imported, limit = input$size_limit) + imported <- limit_data_size(imported,limit = limit) temporary_rv$status <- "success" temporary_rv$data <- imported @@ -5293,35 +5187,34 @@ import_file_server <- function(id, ) observeEvent(input$see_data, { - tryCatch({ - datamods:::show_data( - default_parsing(temporary_rv$data), - title = i18n$t("Imported data"), - type = show_data_in - ) - }, # warning = function(warn) { - # showNotification(warn, type = "warning") - # }, - error = function(err) { - showNotification(err, type = "err") - }) + tryCatch( + { + datamods:::show_data(default_parsing(temporary_rv$data), title = i18n$t("Imported data"), type = show_data_in) + }, + # warning = function(warn) { + # showNotification(warn, type = "warning") + # }, + error = function(err) { + showNotification(err, type = "err") + } + ) }) output$table <- toastui::renderDatagrid2({ req(temporary_rv$data) - tryCatch({ - toastui::datagrid( - data = setNames( - head(temporary_rv$data, 5), - make.names(names(temporary_rv$data), unique = TRUE) - ), - theme = "striped", - colwidths = "guess", - minBodyHeight = 250 - ) - }, error = function(err) { - showNotification(err, type = "err") - }) + tryCatch( + { + toastui::datagrid( + data = setNames(head(temporary_rv$data, 5), make.names(names(temporary_rv$data), unique = TRUE)), + theme = "striped", + colwidths = "guess", + minBodyHeight = 250 + ) + }, + error = function(err) { + showNotification(err, type = "err") + } + ) }) observeEvent(input$confirm, { @@ -5347,7 +5240,10 @@ import_file_server <- function(id, } } - moduleServer(id = id, module = module) + moduleServer( + id = id, + module = module + ) } # utils ------------------------------------------------------------------- @@ -5406,37 +5302,39 @@ import_delim <- function(file, skip, encoding, na.strings) { #' @export #' import_xls <- function(file, sheet, skip, na.strings) { - tryCatch({ - ## If sheet is null, this allows purrr::map to run - if (is.null(sheet)) - sheet <- 1 + tryCatch( + { + ## If sheet is null, this allows purrr::map to run + if (is.null(sheet)) sheet <- 1 - sheet |> - purrr::map(\(.x) { - readxl::read_excel( - path = file, - sheet = .x, - na = na.strings, - skip = skip, - .name_repair = "unique_quiet", - trim_ws = TRUE - ) + sheet |> + purrr::map(\(.x){ + readxl::read_excel( + path = file, + sheet = .x, + na = na.strings, + skip = skip, + .name_repair = "unique_quiet", + trim_ws = TRUE + ) - # openxlsx2::read_xlsx( - # file = file, - # sheet = .x, - # skip_empty_rows = TRUE, - # start_row = skip - 1, - # na.strings = na.strings - # ) - }) |> - purrr::reduce(dplyr::full_join) - }, # warning = function(warn) { - # showNotification(paste0(warn), type = "warning") - # }, - error = function(err) { - showNotification(paste0(err), type = "err") - }) + # openxlsx2::read_xlsx( + # file = file, + # sheet = .x, + # skip_empty_rows = TRUE, + # start_row = skip - 1, + # na.strings = na.strings + # ) + }) |> + purrr::reduce(dplyr::full_join) + }, + # warning = function(warn) { + # showNotification(paste0(warn), type = "warning") + # }, + error = function(err) { + showNotification(paste0(err), type = "err") + } + ) } @@ -5446,25 +5344,27 @@ import_xls <- function(file, sheet, skip, na.strings) { #' @export #' import_ods <- function(file, sheet, skip, na.strings) { - tryCatch({ - if (is.null(sheet)) - sheet <- 1 - sheet |> - purrr::map(\(.x) { - readODS::read_ods( - path = file, - sheet = .x, - skip = skip, - na = na.strings - ) - }) |> - purrr::reduce(dplyr::full_join) - }, # warning = function(warn) { - # showNotification(paste0(warn), type = "warning") - # }, - error = function(err) { - showNotification(paste0(err), type = "err") - }) + tryCatch( + { + if (is.null(sheet)) sheet <- 1 + sheet |> + purrr::map(\(.x){ + readODS::read_ods( + path = file, + sheet = .x, + skip = skip, + na = na.strings + ) + }) |> + purrr::reduce(dplyr::full_join) + }, + # warning = function(warn) { + # showNotification(paste0(warn), type = "warning") + # }, + error = function(err) { + showNotification(paste0(err), type = "err") + } + ) } #' @name import-file-type @@ -5473,7 +5373,10 @@ import_ods <- function(file, sheet, skip, na.strings) { #' @export #' import_dta <- function(file) { - haven::read_dta(file = file, .name_repair = "unique_quiet") + haven::read_dta( + file = file, + .name_repair = "unique_quiet" + ) } #' @name import-file-type @@ -5482,7 +5385,9 @@ import_dta <- function(file) { #' @export #' import_rds <- function(file) { - out <- readr::read_rds(file = file) + out <- readr::read_rds( + file = file + ) if (is.data.frame(out)) { out @@ -5557,17 +5462,7 @@ import_file_demo_app <- function() { width = 4, import_file_ui( id = "myid", - file_extensions = c( - ".csv", - ".tsv", - ".txt", - ".xls", - ".xlsx", - ".rds", - ".sas7bdat", - ".ods", - ".dta" - ), + file_extensions = c(".csv", ".tsv", ".txt", ".xls", ".xlsx", ".rds", ".sas7bdat", ".ods", ".dta"), layout_params = "dropdown" # "inline" # or "dropdown" ) ), @@ -5615,7 +5510,6 @@ import_file_demo_app <- function() { #' This function may act to guard a hosted app against very large data sets in #' addition to the file size limitations. #' The function will limit the data set by dropping rows. -#' If limit is set to 0 or NULL, the original data set is returned. #' #' #' @param data data.frame @@ -5626,24 +5520,19 @@ import_file_demo_app <- function() { #' #' @examples #' prod(dim(mtcars)) -#' limit_data_size(mtcars,2) +#' limit_data_size(mtcars) #' limit_data_size(mtcars,100) limit_data_size <- function(data, limit = NULL) { - ## Add security to reduce large datasets to n observations below limit. + ## Add security to only allow dataset of 100.000 cells ## Ideally this should only go for the hosted version - if (is.null(limit) || limit == 0) { + if (is.null(limit)){ return(data) } data_dim <- dim(data) - ## If the limit is below nrow, the first observations from the first row - ## is included for a very pessimistic selection. - ## A more optimistic selection would just use ceiling instead of floor. - if (limit < data_dim[2]) { - head(data, 1)[seq_len(limit)] - } else if (prod(data_dim) > limit) { + if (prod(data_dim) > limit) { head(data, floor(limit / data_dim[2])) } else { data @@ -5651,48 +5540,6 @@ limit_data_size <- function(data, limit = NULL) { } -#' @importFrom htmltools tagList tags -#' @importFrom shiny icon getDefaultReactiveDomain -make_success_alert <- function(data, - trigger_return, - btn_show_data, - extra = NULL, - session = shiny::getDefaultReactiveDomain()) { - if (identical(trigger_return, "button")) { - success_message <- tagList(tags$b( - phosphoricons::ph("check", weight = "bold"), - i18n$t("Data ready to be imported!") - ), - sprintf( - i18n$t("Data has %s obs. of %s variables."), - nrow(data), - ncol(data) - ), - extra) - } else { - success_message <- tagList(tags$b( - phosphoricons::ph("check", weight = "bold"), - i18n$t("Data successfully imported!") - ), - sprintf( - i18n$t("Data has %s obs. of %s variables."), - nrow(data), - ncol(data) - ), - extra) - } - if (isTRUE(btn_show_data)) { - success_message <- tagList(success_message, - tags$br(), - actionLink( - inputId = session$ns("see_data"), - label = tagList(phosphoricons::ph("table"), i18n$t("Click to see data")) - )) - } - return(success_message) -} - - ######## #### Current file: /Users/au301842/FreesearchR/R//landing_page_ui.R ######## @@ -5721,7 +5568,6 @@ landing_page_ui <- function(i18n) { i18n$t("Start with FreesearchR for basic data evaluation and analysis."), i18n$t("The app contains a selelct number of features and will guide you through key analyses."), i18n$t("When you need more advanced tools, you'll be prepared to use R directly."), - shiny::actionLink(inputId = "act_data",label = i18n$t("Start by loading data.")), style = "font-size: 1.2rem; color: #555;" ) ), @@ -5969,11 +5815,6 @@ landing_page_ui <- function(i18n) { #' @description #' All data.frames in the global environment will be accessible through the app. #' -#' @param include_globalenv flag to include global env (local data) as option -#' when loading data -#' @param data_limit_default default data set observations limit -#' @param data_limit_upper data set observations upper limit -#' @param data_limit_lower data set observations lower limit #' @param ... passed on to `shiny::runApp()` #' #' @returns shiny app @@ -5984,29 +5825,18 @@ landing_page_ui <- function(i18n) { #' data(mtcars) #' launch_FreesearchR(launch.browser = TRUE) #' } -launch_FreesearchR <- function(inlcude_globalenv = TRUE, - data_limit_default = 1000, - data_limit_upper = 100000, - data_limit_lower = 1, - ...) { - global_freesearchR <- list( - include_globalenv = include_globalenv, - data_limit_default = data_limit_default, - data_limit_upper = data_limit_upper, - data_limit_lower = data_limit_lower - ) - +launch_FreesearchR <- function(...){ appDir <- system.file("apps", "FreesearchR", package = "FreesearchR") if (appDir == "") { - stop("Could not find the app directory. Try re-installing `FreesearchR`.", - call. = FALSE) + stop("Could not find the app directory. Try re-installing `FreesearchR`.", call. = FALSE) } - a <- shiny::runApp(appDir = paste0(appDir, "/app.R"), ...) + a <- shiny::runApp(appDir = paste0(appDir,"/app.R"), ...) return(invisible(a)) } + ######## #### Current file: /Users/au301842/FreesearchR/R//missings-module.R ######## @@ -6022,49 +5852,45 @@ launch_FreesearchR <- function(inlcude_globalenv = TRUE, data_missings_ui <- function(id, ...) { ns <- shiny::NS(id) - list(bslib::layout_sidebar( - uiOutput(outputId = ns("feedback")), - sidebar = bslib::sidebar( - bslib::accordion( - id = ns("acc_mis"), - open = "acc_chars", - multiple = FALSE, - bslib::accordion_panel( - value = "acc_pan_mis", - title = "Settings", - icon = bsicons::bs_icon("gear"), - shiny::conditionalPanel( - condition = "output.missings == true", + list( + bslib::layout_sidebar( + sidebar = bslib::sidebar( + bslib::accordion( + id = ns("acc_mis"), + open = "acc_chars", + multiple = FALSE, + bslib::accordion_panel( + value = "acc_pan_mis", + title = "Settings", + icon = bsicons::bs_icon("gear"), shiny::uiOutput(ns("missings_method")), shiny::uiOutput(ns("missings_var")), - ns = ns - ), - shiny::helpText( - i18n$t( - "Evaluate missingness by either comparing missing values across variables (optionally grouped by af categorical or dichotomous variable) or compare variables grouped by the missing status (missing or not) of an outcome variable. If there is a significant difference i the missingness, this may cause a bias in you data and should be considered carefully interpreting the data and analyses as data may not be missing at random." + shiny::helpText(i18n$t("Evaluate missingness by either comparing missing values across variables (optionally grouped by af categorical or dichotomous variable) or compare variables grouped by the missing status (missing or not) of an outcome variable. If there is a significant difference i the missingness, this may cause a bias in you data and should be considered carefully interpreting the data and analyses as data may not be missing at random.")), + shiny::br(), + shiny::actionButton( + inputId = ns("act_miss"), + label = i18n$t("Evaluate"), + width = "100%", + icon = shiny::icon("calculator"), + disabled = FALSE ) ), - shiny::br(), - shiny::actionButton( - inputId = ns("act_miss"), - label = i18n$t("Evaluate"), - width = "100%", - icon = shiny::icon("calculator"), - disabled = TRUE + do.call( + bslib::accordion_panel, + c( + list( + title = "Download", + icon = bsicons::bs_icon("file-earmark-arrow-down") + ), + table_download_ui(id = ns("tbl_dwn"), title = NULL) + ) ) - ), - do.call(bslib::accordion_panel, c( - list( - title = "Download", - icon = bsicons::bs_icon("file-earmark-arrow-down") - ), - table_download_ui(id = ns("tbl_dwn"), title = NULL) - )) - ) - ), - ..., - gt::gt_output(outputId = ns("missings_table")) - )) + ) + ), + ..., + gt::gt_output(outputId = ns("missings_table")) + ) + ) } ## This should really just be rebuild to only contain a function @@ -6076,71 +5902,46 @@ data_missings_ui <- function(id, ...) { #' @name data-missings #' @returns shiny server module #' @export -data_missings_server <- function(id, data, max_level = 20, ...) { +data_missings_server <- function(id, + data, + max_level = 20, + ...) { shiny::moduleServer( id = id, module = function(input, output, session) { ns <- session$ns - datar <- if (is.reactive(data)) - data - else - reactive(data) + datar <- if (is.reactive(data)) data else reactive(data) - rv <- shiny::reactiveValues(data = NULL, - table = NULL, - feedback = NULL) - - ## Case with no missings - - info_alert <- shinyWidgets::alert( - status = "info", - phosphoricons::ph("question"), - i18n$t("You have provided a complete dataset with no missing values.") + rv <- shiny::reactiveValues( + data = NULL, + table = NULL ) - output$missings <- shiny::reactive({ - # shiny::req(data()) - any(is.na(datar())) - }) - shiny::outputOptions(output, "missings", suspendWhenHidden = FALSE) - - shiny::observeEvent(list(datar(), input$missings_method, input$missings_var), - { - # shiny::req(data()) - # browser() - if (!any(is.na(datar()))) { - rv$feedback <- info_alert - shiny::updateActionButton(inputId = "act_miss", disabled = TRUE) - rv$table <- NULL - output$missings_table <- gt::render_gt({ NULL }) - } else { - rv$feedback <- NULL - shiny::updateActionButton(inputId = "act_miss", disabled = FALSE) - } - },ignoreInit = TRUE) - - - output$feedback <- renderUI(rv$feedback) - ## Notes ## ## Code export is still missing ## Direct table export would be nice - shiny::observe(output$missings_method <- shiny::renderUI({ - shiny::req(datar()) - vectorSelectInput( - inputId = ns("missings_method"), - label = i18n$t("Analysis method for missingness overview"), - choices = setNames(c("predictors", "outcome"), c( - i18n$t("Overview of missings across variables"), - i18n$t( - "Overview of difference in variables by missing status in outcome" + shiny::observe( + output$missings_method <- shiny::renderUI({ + shiny::req(data()) + vectorSelectInput( + inputId = ns("missings_method"), + label = i18n$t("Analysis method for missingness overview"), + choices = setNames( + c( + "predictors", + "outcome" + ), + c( + i18n$t("Overview of missings across variables"), + i18n$t("Overview of difference in variables by missing status in outcome") + ) ) - )) - ) - })) + ) + }) + ) shiny::observe({ output$missings_var <- shiny::renderUI({ @@ -6149,7 +5950,7 @@ data_missings_server <- function(id, data, max_level = 20, ...) { # browser() if (input$missings_method == "predictors") { label <- i18n$t("Select a variable for grouped overview") - df <- data_type_filter(datar(), type = c("categorical", "dichotomous")) + df <- data_type_filter(data(), type = c("categorical", "dichotomous")) col_subset <- c("none", names(df)) } else { label <- i18n$t("Select outcome variable for overview") @@ -6167,91 +5968,94 @@ data_missings_server <- function(id, data, max_level = 20, ...) { }) - shiny::observeEvent(list(input$act_miss), { - shiny::req(datar()) - shiny::req(input$missings_var) - # browser() - df_tbl <- datar() - by_var <- input$missings_var + shiny::observeEvent( + list(input$act_miss), + { + shiny::req(datar()) + shiny::req(input$missings_var) + # browser() + df_tbl <- datar() + by_var <- input$missings_var - parameters <- list( - by_var = by_var, - max_level = max_level, - type = input$missings_method - ) + parameters <- list( + by_var = by_var, + max_level = max_level, + type = input$missings_method + ) - tryCatch({ - shiny::withProgress(message = i18n$t("Calculating. Hold tight for a moment.."), { - out <- do.call(compare_missings, modifyList(parameters, list(data = df_tbl))) - }) - }, error = function(err) { - showNotification(paste0("Error: ", err), type = "err") - }) + tryCatch( + { + shiny::withProgress(message = i18n$t("Calculating. Hold tight for a moment.."), { + out <- do.call( + compare_missings, + modifyList(parameters, list(data = df_tbl)) + ) + }) + }, + error = function(err) { + showNotification(paste0("Error: ", err), type = "err") + } + ) - if (is.null(input$missings_var) || - input$missings_var == "" || - !input$missings_var %in% names(datar()) || - input$missings_var == "none") { - # if (is.null(variabler()) || variabler() == "" || !variabler() %in% names(data()) || variabler() == "none") { - # tbl <- rv$data() - if (anyNA(datar())) { - if (input$missings_method == "predictors") { - title <- i18n$t("Overview of missing observations") + if (is.null(input$missings_var) || input$missings_var == "" || !input$missings_var %in% names(datar()) || input$missings_var == "none") { + # if (is.null(variabler()) || variabler() == "" || !variabler() %in% names(data()) || variabler() == "none") { + # tbl <- rv$data() + if (anyNA(datar())) { + if (input$missings_method == "predictors") { + title <- i18n$t("Overview of missing observations") + } else { + title <- i18n$t("No outcome measure chosen") + } } else { - title <- i18n$t("No outcome measure chosen") + title <- i18n$t("No missing observations") } } else { - title <- i18n$t("No missing observations") - } - } else { - ## Due to reactivity, the table updates too quickly. this mitigates that issue.. - if (input$missings_method == "predictors") { - title <- glue::glue( - i18n$t( - "Missing observations across variables grouped by **'{input$missings_var}'**" - ) - ) - } else { - title <- glue::glue( - i18n$t( - "Differences by missing vs non-missing observations in **'{input$missings_var}'**" - ) - ) + ## Due to reactivity, the table updates too quickly. this mitigates that issue.. + + + if (input$missings_var == "predictors") { + title <- glue::glue(i18n$t("Missings across variables by the variable **'{input$missings_var}'**")) + } else { + title <- glue::glue(i18n$t("Missing vs non-missing observations in the variable **'{input$missings_var}'**")) + } } + + attr(out, "tbl_title") <- title + + rv$data <- shiny::reactive(out) } + ) - attr(out, "tbl_title") <- title - - rv$data <- shiny::reactive(out) - }) - - shiny::observeEvent(list( - # input$act_miss - rv$data - ), { - output$missings_table <- gt::render_gt({ - shiny::req(rv$data) - # shiny::req(input$missings_var) - # browser() - if ("p.value" %in% names(rv$data()[["table_body"]])) { - tbl <- rv$data() |> - gtsummary::bold_p() - } else { - tbl <- rv$data() - } + shiny::observeEvent( + list( + # input$act_miss + rv$data + ), + { + output$missings_table <- gt::render_gt({ + shiny::req(rv$data) + # shiny::req(input$missings_var) + # browser() + if ("p.value" %in% names(rv$data()[["table_body"]])) { + tbl <- rv$data() |> + gtsummary::bold_p() + } else { + tbl <- rv$data() + } - out <- tbl |> - gtsummary::as_gt() |> - gt::tab_header(title = gt::md(attr(tbl, "tbl_title"))) + out <- tbl |> + gtsummary::as_gt() |> + gt::tab_header(title = gt::md(attr(tbl, "tbl_title"))) - attr(out, "strat_var") <- input$missings_var + attr(out, "strat_var") <- input$missings_var - rv$table <- out + rv$table <- out - out - }) - }) + out + }) + } + ) table_download_server( @@ -6267,20 +6071,25 @@ data_missings_server <- function(id, data, max_level = 20, ...) { missing_demo_app <- function() { - ui <- do.call(bslib::page, c( - list( - title = i18n$t("Missings"), - icon = bsicons::bs_icon("x-circle") - ), - data_missings_ui(id = "data"), - gt::gt_output("table_p") - )) + ui <- do.call( + bslib::page, + c( + list( + title = i18n$t("Missings"), + icon = bsicons::bs_icon("x-circle") + ), + data_missings_ui(id = "data"), + gt::gt_output("table_p") + ) + ) server <- function(input, output, session) { data_demo <- mtcars data_demo[sample(1:32, 10), "cyl"] <- NA data_demo[sample(1:32, 8), "vs"] <- NA - rv <- shiny::reactiveValues(table = NULL) + rv <- shiny::reactiveValues( + table = NULL + ) rv$table <- data_missings_server(id = "data", data = data_demo) @@ -6314,15 +6123,17 @@ missing_demo_app <- function() { #' @returns gtsummary list object #' @export #' -compare_missings <- function(data, - by_var, - max_level = 20, - type = c("predictors", "outcome")) { +compare_missings <- function( + data, + by_var, + max_level = 20, + type = c("predictors", "outcome") +) { type <- match.arg(type) if (!is.null(by_var) && by_var != "" && by_var %in% names(data)) { data <- data |> - lapply(\(.x) { + lapply(\(.x){ if (is.factor(.x)) { cut_var(.x, breaks = 20, type = "top") } else { @@ -6366,7 +6177,7 @@ compare_missings <- function(data, missings_logic_across <- function(data, exclude = NULL) { # This function includes a approach way to preserve variable labels names(data) |> - lapply(\(.x) { + lapply(\(.x){ # browser() # Saving original labels lab <- REDCapCAST::get_attr(data[[.x]], attr = "label") @@ -6377,12 +6188,7 @@ missings_logic_across <- function(data, exclude = NULL) { } if (!is.na(lab)) { # Restoring original labels, if not NA - REDCapCAST::set_attr( - data = out, - label = lab, - attr = "label", - overwrite = TRUE - ) + REDCapCAST::set_attr(data = out, label = lab, attr = "label", overwrite = TRUE) } else { out } @@ -10590,6 +10396,7 @@ language_choices <- function() { } + ######## #### Current file: /Users/au301842/FreesearchR/R//ui_elements.R ######## @@ -10621,7 +10428,7 @@ ui_elements <- function(selection) { ## Default just output "NULL" ## This could probably be achieved more legantly, but this works. dev_banner(), - landing_page_ui(i18n = i18n), + landing_page_ui(i18n=i18n), # shiny::column(width = 2), # shiny::column( # width = 8, @@ -10664,11 +10471,7 @@ ui_elements <- function(selection) { ), # shiny::tags$script('document.querySelector("#source div").style.width = "100%"'), ## Update this to change depending on run locally or hosted - shiny::helpText( - i18n$t( - "Upload a file, get data directly from REDCap or use local or sample data." - ) - ), + shiny::helpText(i18n$t("Upload a file, get data directly from REDCap or use local or sample data.")), shiny::br(), shiny::br(), shiny::conditionalPanel( @@ -10677,11 +10480,7 @@ ui_elements <- function(selection) { id = "file_import", layout_params = "dropdown", # title = "Choose a datafile to upload", - file_extensions = c(".csv", ".tsv", ".txt", ".xls", ".xlsx", ".rds", ".ods", ".dta"), - limit_default = global_freesearchR$data_limit_default, - limit_lower = global_freesearchR$data_limit_lower, - limit_upper = global_freesearchR$data_limit_upper - + file_extensions = c(".csv", ".tsv", ".txt", ".xls", ".xlsx", ".rds", ".ods", ".dta") ) ), shiny::conditionalPanel( @@ -10694,15 +10493,17 @@ ui_elements <- function(selection) { # shiny::HTML(i18n$t("

The FreesearchR app only stores data for analyses, but please only use with sensitive data when running locally. Read more here

")), # dismissible = TRUE # ), - m_redcap_readUI(id = "redcap_import", title = "") + m_redcap_readUI( + id = "redcap_import", + title = "" + ) ), shiny::conditionalPanel( condition = "input.source=='env'", import_globalenv_ui( id = "env", title = NULL, - packages = c("NHANES", "stRoke", "datasets", "MASS"), - globalenv = global_freesearchR$include_globalenv + packages = c("NHANES", "stRoke", "datasets", "MASS") ) ), # shiny::conditionalPanel( @@ -10738,11 +10539,7 @@ ui_elements <- function(selection) { format = shinyWidgets::wNumbFormat(decimals = 0), color = datamods:::get_primary_color() ), - shiny::helpText( - i18n$t( - "At 0, only complete variables are included; at 100, all variables are included." - ) - ), + shiny::helpText(i18n$t("At 0, only complete variables are included; at 100, all variables are included.")), shiny::br() ), shiny::column( @@ -10791,9 +10588,7 @@ ui_elements <- function(selection) { width = 9, shiny::uiOutput(outputId = "data_info", inline = TRUE), shiny::tags$p( - i18n$t( - "Below you find a summary table for quick insigths, and on the right you can visualise data classes, browse observations and apply different data filters." - ) + i18n$t("Below you find a summary table for quick insigths, and on the right you can visualise data classes, browse observations and apply different data filters.") ) ), shiny::column( @@ -10829,18 +10624,16 @@ ui_elements <- function(selection) { shiny::column( width = 3, shiny::tags$h6(i18n$t("Filter data types")), - shiny::uiOutput(outputId = "column_filter"), - ## This needs to run in server for translation - shiny::helpText( - "Read more on how ", - tags$a( - "data types", - href = "https://agdamsbo.github.io/FreesearchR/articles/data-types.html", - target = "_blank", - rel = "noopener noreferrer" - ), - " are defined." + shiny::uiOutput( + outputId = "column_filter" ), + ## This needs to run in server for translation + shiny::helpText("Read more on how ", tags$a( + "data types", + href = "https://agdamsbo.github.io/FreesearchR/articles/data-types.html", + target = "_blank", + rel = "noopener noreferrer" + ), " are defined."), validation_ui("validation_var"), shiny::br(), shiny::br(), @@ -10860,26 +10653,21 @@ ui_elements <- function(selection) { title = i18n$t("Edit and create data"), icon = shiny::icon("file-pen"), tags$h3(i18n$t("Subset, rename and convert variables")), - fluidRow(shiny::column( - width = 9, shiny::tags$p( - i18n$t( - "Below, are several options for simple data manipulation like update variables by renaming, creating new labels (for nicer tables in the report) and changing variable classes (numeric, factor/categorical etc.)." - ), - i18n$t( - "There are more advanced options to modify factor/categorical variables as well as create new factor from an existing variable or new variables with R code. At the bottom you can restore the original data." - ), - i18n$t( - "Please note that data modifications are applied before any filtering." + fluidRow( + shiny::column( + width = 9, + shiny::tags$p( + i18n$t("Below, are several options for simple data manipulation like update variables by renaming, creating new labels (for nicer tables in the report) and changing variable classes (numeric, factor/categorical etc.)."), + i18n$t("There are more advanced options to modify factor/categorical variables as well as create new factor from an existing variable or new variables with R code. At the bottom you can restore the original data."), + i18n$t("Please note that data modifications are applied before any filtering.") ) ) - )), + ), update_variables_ui("modal_variables"), shiny::tags$br(), shiny::tags$br(), shiny::tags$h4(i18n$t("Advanced data manipulation")), - shiny::tags$p( - i18n$t("Below options allow more advanced varaible manipulations.") - ), + shiny::tags$p(i18n$t("Below options allow more advanced varaible manipulations.")), shiny::tags$br(), shiny::tags$br(), shiny::fluidRow( @@ -10891,9 +10679,7 @@ ui_elements <- function(selection) { width = "100%" ), shiny::tags$br(), - shiny::helpText( - i18n$t("Reorder or rename the levels of factor/categorical variables.") - ), + shiny::helpText(i18n$t("Reorder or rename the levels of factor/categorical variables.")), shiny::tags$br(), shiny::tags$br() ), @@ -10905,11 +10691,7 @@ ui_elements <- function(selection) { width = "100%" ), shiny::tags$br(), - shiny::helpText( - i18n$t( - "Create factor/categorical variable from a continous variable (number/date/time)." - ) - ), + shiny::helpText(i18n$t("Create factor/categorical variable from a continous variable (number/date/time).")), shiny::tags$br(), shiny::tags$br() ), @@ -10921,9 +10703,7 @@ ui_elements <- function(selection) { width = "100%" ), shiny::tags$br(), - shiny::helpText(i18n$t( - "Split a text column by a recognised delimiter." - )), + shiny::helpText(i18n$t("Split a text column by a recognised delimiter.")), shiny::tags$br(), shiny::tags$br() ), @@ -10935,18 +10715,16 @@ ui_elements <- function(selection) { width = "100%" ), shiny::tags$br(), - shiny::helpText(i18n$t( - "Create a new variable based on an R-expression." - )), + shiny::helpText(i18n$t("Create a new variable based on an R-expression.")), shiny::tags$br(), shiny::tags$br() ) ), tags$h4(i18n$t("Compare modified data to original")), shiny::tags$br(), - shiny::tags$p(i18n$t( - "Raw print of the original vs the modified data." - )), + shiny::tags$p( + i18n$t("Raw print of the original vs the modified data.") + ), shiny::tags$br(), shiny::fluidRow( shiny::column( @@ -10967,11 +10745,7 @@ ui_elements <- function(selection) { width = "100%" ), shiny::tags$br(), - shiny::helpText( - i18n$t( - "Reset to original imported dataset. Careful! There is no un-doing." - ) - ), + shiny::helpText(i18n$t("Reset to original imported dataset. Careful! There is no un-doing.")), shiny::tags$br(), shiny::tags$br() ) @@ -11017,11 +10791,7 @@ ui_elements <- function(selection) { # ), shiny::uiOutput("detail_level"), shiny::uiOutput("strat_var"), - shiny::helpText( - i18n$t( - "Only factor/categorical variables are available for stratification. Go back to the 'Prepare' tab to reclass a variable if it's not on the list." - ) - ), + shiny::helpText(i18n$t("Only factor/categorical variables are available for stratification. Go back to the 'Prepare' tab to reclass a variable if it's not on the list.")), shiny::conditionalPanel( condition = "input.strat_var!='none'", shiny::radioButtons( @@ -11029,7 +10799,10 @@ ui_elements <- function(selection) { label = i18n$t("Compare strata?"), selected = "no", inline = TRUE, - choices = list("No" = "no", "Yes" = "yes") + choices = list( + "No" = "no", + "Yes" = "yes" + ) ), # shiny::helpText(i18n$t("Option to perform statistical comparisons between strata in baseline table.")), shiny::br(), @@ -11038,7 +10811,10 @@ ui_elements <- function(selection) { label = i18n$t("Include group differences"), selected = "no", inline = TRUE, - choices = list("No" = "no", "Yes" = "yes") + choices = list( + "No" = "no", + "Yes" = "yes" + ) ) ), shiny::br(), @@ -11049,9 +10825,7 @@ ui_elements <- function(selection) { icon = shiny::icon("calculator"), disabled = TRUE ), - shiny::helpText(i18n$t( - "Press 'Evaluate' to create the comparison table." - )) + shiny::helpText(i18n$t("Press 'Evaluate' to create the comparison table.")) ) ) ), @@ -11073,11 +10847,7 @@ ui_elements <- function(selection) { title = "Settings", icon = bsicons::bs_icon("bounding-box"), shiny::uiOutput("outcome_var_cor"), - shiny::helpText( - i18n$t( - "To avoid evaluating the correlation of the outcome variable, this can be excluded from the plot or select 'none'." - ) - ), + shiny::helpText(i18n$t("To avoid evaluating the correlation of the outcome variable, this can be excluded from the plot or select 'none'.")), shiny::br(), shinyWidgets::noUiSliderInput( inputId = "cor_cutoff", @@ -11089,22 +10859,24 @@ ui_elements <- function(selection) { format = shinyWidgets::wNumbFormat(decimals = 2), color = datamods:::get_primary_color() ), - shiny::helpText(i18n$t( - "Set the cut-off for considered 'highly correlated'." - )) + shiny::helpText(i18n$t("Set the cut-off for considered 'highly correlated'.")) ) ) ), data_correlations_ui(id = "correlations", height = 600) ) ), - do.call(bslib::nav_panel, c( - list( - title = i18n$t("Missings"), - icon = bsicons::bs_icon("x-circle") - ), - data_missings_ui(id = "missingness", validation_ui("validation_mcar")) - )) + do.call( + bslib::nav_panel, + c( + list( + title = i18n$t("Missings"), + icon = bsicons::bs_icon("x-circle") + ), + data_missings_ui(id = "missingness", + validation_ui("validation_mcar")) + ) + ) ), ############################################################################## ######### @@ -11139,7 +10911,10 @@ ui_elements <- function(selection) { title = i18n$t("Regression"), icon = shiny::icon("calculator"), value = "nav_analyses", - do.call(bslib::navset_card_tab, regression_ui("regression")) + do.call( + bslib::navset_card_tab, + regression_ui("regression") + ) ), ############################################################################## ######### @@ -11161,11 +10936,7 @@ ui_elements <- function(selection) { shiny::column( width = 6, shiny::h4(i18n$t("Report")), - shiny::helpText( - i18n$t( - "Choose your favourite output file format for further work, and download, when the analyses are done." - ) - ), + shiny::helpText(i18n$t("Choose your favourite output file format for further work, and download, when the analyses are done.")), shiny::br(), shiny::br(), shiny::selectInput( @@ -11193,9 +10964,7 @@ ui_elements <- function(selection) { shiny::column( width = 6, shiny::h4("Data"), - shiny::helpText( - "Choose your favourite output data format to download the modified data." - ), + shiny::helpText("Choose your favourite output data format to download the modified data."), shiny::br(), shiny::br(), shiny::selectInput( @@ -11222,27 +10991,16 @@ ui_elements <- function(selection) { shiny::br(), shiny::br(), shiny::h4("Code snippets"), - shiny::tags$p( - "Below are the code bits used to create the final data set and the main analyses." + shiny::tags$p("Below are the code bits used to create the final data set and the main analyses."), + shiny::tags$p("This can be used as a starting point for learning to code and for reproducibility."), + shiny::tagList( + lapply( + paste0("code_", c( + "import", "format", "data", "variables", "filter", "table1", "univariable", "multivariable" + )), + \(.x)shiny::htmlOutput(outputId = .x) + ) ), - shiny::tags$p( - "This can be used as a starting point for learning to code and for reproducibility." - ), - shiny::tagList(lapply( - paste0( - "code_", - c( - "import", - "format", - "data", - "variables", - "filter", - "table1", - "univariable", - "multivariable" - ) - ), \(.x)shiny::htmlOutput(outputId = .x) - )), shiny::tags$br(), shiny::br() ), @@ -11258,8 +11016,7 @@ ui_elements <- function(selection) { # shiny::img(shiny::icon("book")), shiny::tags$a( href = "https://redcap.au.dk/surveys/?s=JPCLPTXYDKFA8DA8", - "Feedback", - shiny::icon("arrow-up-right-from-square"), + "Feedback", shiny::icon("arrow-up-right-from-square"), target = "_blank", rel = "noopener noreferrer" ) @@ -11273,8 +11030,7 @@ ui_elements <- function(selection) { # shiny::img(shiny::icon("book")), shiny::tags$a( href = "https://agdamsbo.github.io/FreesearchR/", - "Docs", - shiny::icon("arrow-up-right-from-square"), + "Docs", shiny::icon("arrow-up-right-from-square"), target = "_blank", rel = "noopener noreferrer" ) @@ -11383,10 +11139,7 @@ update_factor_ui <- function(id) { ), actionButton( inputId = ns("create"), - label = tagList( - phosphoricons::ph("arrow-clockwise"), - i18n$t("Update factor variable") - ), + label = tagList(phosphoricons::ph("arrow-clockwise"), i18n$t("Update factor variable")), class = "btn-outline-primary" ) ), @@ -11405,136 +11158,154 @@ update_factor_ui <- function(id) { #' #' @rdname update-factor update_factor_server <- function(id, data_r = reactive(NULL)) { - moduleServer(id, function(input, output, session) { - rv <- reactiveValues(data = NULL, data_grid = NULL) + moduleServer( + id, + function(input, output, session) { + rv <- reactiveValues(data = NULL, data_grid = NULL) - bindEvent(observe({ - data <- data_r() - rv$data <- data - vars_factor <- vapply(data, is.factor, logical(1)) - vars_factor <- names(vars_factor)[vars_factor] - updateVirtualSelect( - inputId = "variable", - choices = vars_factor, - selected = if (isTruthy(input$variable)) - input$variable - else - vars_factor[1] - ) - }), data_r(), input$hidden) + bindEvent(observe({ + data <- data_r() + rv$data <- data + vars_factor <- vapply(data, is.factor, logical(1)) + vars_factor <- names(vars_factor)[vars_factor] + updateVirtualSelect( + inputId = "variable", + choices = vars_factor, + selected = if (isTruthy(input$variable)) input$variable else vars_factor[1] + ) + }), data_r(), input$hidden) - observeEvent(input$variable, { - data <- req(data_r()) - variable <- req(input$variable) - grid <- as.data.frame(table(data[[variable]])) - rv$data_grid <- grid - }) - - observeEvent(input$sort_levels, { - if (input$sort_levels %% 2 == 1) { - decreasing <- FALSE - label <- tagList(phosphoricons::ph("sort-descending"), - i18n$t("Sort by Levels")) - } else { - decreasing <- TRUE - label <- tagList(phosphoricons::ph("sort-ascending"), - i18n$t("Sort by Levels")) - } - updateActionButton(inputId = "sort_levels", label = label) - rv$data_grid <- rv$data_grid[order(rv$data_grid[[1]], decreasing = decreasing), ] - }) - - observeEvent(input$sort_occurrences, { - if (input$sort_occurrences %% 2 == 1) { - decreasing <- FALSE - label <- tagList(phosphoricons::ph("sort-descending"), - i18n$t("Sort by count")) - } else { - decreasing <- TRUE - label <- tagList(phosphoricons::ph("sort-ascending"), - i18n$t("Sort by count")) - } - updateActionButton(inputId = "sort_occurrences", label = label) - rv$data_grid <- rv$data_grid[order(rv$data_grid[[2]], decreasing = decreasing), ] - }) - - - output$grid <- renderDatagrid({ - req(rv$data_grid) - gridTheme <- getOption("datagrid.theme") - if (length(gridTheme) < 1) { - datamods:::apply_grid_theme() - } - on.exit(toastui::reset_grid_theme()) - data <- rv$data_grid - data <- add_var_toset(data, "Var1", "New label") - - grid <- datagrid( - data = data, - draggable = TRUE, - sortable = FALSE, - data_as_input = TRUE - ) - grid <- grid_columns( - grid, - columns = c("Var1", "Var1_toset", "Freq"), - header = c(i18n$t("Levels"), "New label", i18n$t("Count")) - ) - grid <- grid_colorbar( - grid, - column = "Freq", - label_outside = TRUE, - label_width = "30px", - background = "#D8DEE9", - bar_bg = datamods:::get_primary_color(), - from = c(0, max(rv$data_grid$Freq) + 1) - ) - grid <- toastui::grid_style_column(grid = grid, - column = "Var1_toset", - fontStyle = "italic") - grid <- toastui::grid_editor(grid = grid, - column = "Var1_toset", - type = "text") - grid - }) - - data_updated_r <- reactive({ - data <- req(data_r()) - variable <- req(input$variable) - grid <- req(input$grid_data) - - parameters <- list( - variable = variable, - new_variable = isTRUE(input$new_var) | - any(grid[["Var1_toset"]] == "New label"), - new_levels = as.character(grid[["Var1"]]), - new_labels = as.character(grid[["Var1_toset"]]), - ignore = "New label" - ) - - data <- tryCatch({ - rlang::exec(factor_new_levels_labels, - !!!modifyList(parameters, val = list(data = data))) - }, error = function(err) { - showNotification(paste( - "We encountered the following error creating the new factor:", - err - ), - type = "err") + observeEvent(input$variable, { + data <- req(data_r()) + variable <- req(input$variable) + grid <- as.data.frame(table(data[[variable]])) + rv$data_grid <- grid }) - # browser() - code <- rlang::call2("factor_new_levels_labels", !!!parameters, .ns = "FreesearchR") - attr(data, "code") <- code + observeEvent(input$sort_levels, { + if (input$sort_levels %% 2 == 1) { + decreasing <- FALSE + label <- tagList( + phosphoricons::ph("sort-descending"), + i18n$t("Sort by Levels") + ) + } else { + decreasing <- TRUE + label <- tagList( + phosphoricons::ph("sort-ascending"), + i18n$t("Sort by Levels") + ) + } + updateActionButton(inputId = "sort_levels", label = label) + rv$data_grid <- rv$data_grid[order(rv$data_grid[[1]], decreasing = decreasing), ] + }) - data - }) + observeEvent(input$sort_occurrences, { + if (input$sort_occurrences %% 2 == 1) { + decreasing <- FALSE + label <- tagList( + phosphoricons::ph("sort-descending"), + i18n$t("Sort by count") + ) + } else { + decreasing <- TRUE + label <- tagList( + phosphoricons::ph("sort-ascending"), + i18n$t("Sort by count") + ) + } + updateActionButton(inputId = "sort_occurrences", label = label) + rv$data_grid <- rv$data_grid[order(rv$data_grid[[2]], decreasing = decreasing), ] + }) - data_returned_r <- observeEvent(input$create, { - rv$data <- data_updated_r() - }) - return(reactive(rv$data)) - }) + + output$grid <- renderDatagrid({ + req(rv$data_grid) + gridTheme <- getOption("datagrid.theme") + if (length(gridTheme) < 1) { + datamods:::apply_grid_theme() + } + on.exit(toastui::reset_grid_theme()) + data <- rv$data_grid + data <- add_var_toset(data, "Var1", "New label") + + grid <- datagrid( + data = data, + draggable = TRUE, + sortable = FALSE, + data_as_input = TRUE + ) + grid <- grid_columns( + grid, + columns = c("Var1", "Var1_toset", "Freq"), + header = c(i18n$t("Levels"), "New label", i18n$t("Count")) + ) + grid <- grid_colorbar( + grid, + column = "Freq", + label_outside = TRUE, + label_width = "30px", + background = "#D8DEE9", + bar_bg = datamods:::get_primary_color(), + from = c(0, max(rv$data_grid$Freq) + 1) + ) + grid <- toastui::grid_style_column( + grid = grid, + column = "Var1_toset", + fontStyle = "italic" + ) + grid <- toastui::grid_editor( + grid = grid, + column = "Var1_toset", + type = "text" + ) + grid + }) + + data_updated_r <- reactive({ + data <- req(data_r()) + variable <- req(input$variable) + grid <- req(input$grid_data) + + parameters <- list( + variable = variable, + new_variable = isTRUE(input$new_var) | any(grid[["Var1_toset"]] == "New label"), + new_levels = as.character(grid[["Var1"]]), + new_labels = as.character(grid[["Var1_toset"]]), + ignore = "New label" + ) + + data <- tryCatch( + { + rlang::exec( + factor_new_levels_labels, + !!!modifyList(parameters, + val = list(data = data) + ) + ) + }, + error = function(err) { + showNotification(paste("We encountered the following error creating the new factor:", err), type = "err") + } + ) + + # browser() + code <- rlang::call2( + "factor_new_levels_labels", + !!!parameters, + .ns = "FreesearchR" + ) + attr(data, "code") <- code + + data + }) + + data_returned_r <- observeEvent(input$create, { + rv$data <- data_updated_r() + }) + return(reactive(rv$data)) + } + ) } #' Simple function to apply new levels and/or labels to factor @@ -11551,12 +11322,13 @@ update_factor_server <- function(id, data_r = reactive(NULL)) { #' data_n <- mtcars #' data_n$cyl <- factor(data_n$cyl) #' factor_new_levels_labels(data_n, "cyl", new_labels = c("four", "New label", "New label")) -factor_new_levels_labels <- function(data, - variable, - new_variable = TRUE, - new_levels = NULL, - new_labels = NULL, - ignore = "New label") { +factor_new_levels_labels <- function( + data, + variable, + new_variable = TRUE, + new_levels = NULL, + new_labels = NULL, + ignore = "New label") { if (!is.factor(data[[variable]])) { return(data) } @@ -11569,19 +11341,21 @@ factor_new_levels_labels <- function(data, new_labels <- labels(data[[variable]]) } - with_level <- factor(as.character(data[[variable]]), levels = new_levels) - with_label <- factor(with_level, - labels = ifelse(new_labels == "New label", new_levels, new_labels)) + with_level <- factor( + as.character(data[[variable]]), + levels = new_levels + ) + with_label <- factor( + with_level, + labels = ifelse(new_labels == "New label", new_levels, new_labels) + ) if (isTRUE(new_variable)) { append_column( data = data, column = with_label, - name = unique_names( - new = paste0(variable, "_updated"), - existing = names(data) - ) + name = unique_names(new = paste0(variable, "_updated"), existing = names(data)) ) } else { data[[variable]] <- with_label @@ -11590,6 +11364,7 @@ factor_new_levels_labels <- function(data, } + #' @inheritParams shiny::modalDialog #' @export #' @@ -11603,23 +11378,17 @@ modal_update_factor <- function(id, size = "l", footer = NULL) { ns <- NS(id) - showModal( - modalDialog( - title = tagList(title, datamods:::button_close_modal()), - update_factor_ui(id), - tags$div( - style = "display: none;", - textInput( - inputId = ns("hidden"), - label = NULL, - value = datamods:::genId() - ) - ), - easyClose = easyClose, - size = size, - footer = footer - ) - ) + showModal(modalDialog( + title = tagList(title, datamods:::button_close_modal()), + update_factor_ui(id), + tags$div( + style = "display: none;", + textInput(inputId = ns("hidden"), label = NULL, value = datamods:::genId()) + ), + easyClose = easyClose, + size = size, + footer = footer + )) } @@ -11638,11 +11407,10 @@ winbox_update_factor <- function(id, title = title, ui = tagList( update_factor_ui(id), - tags$div(style = "display: none;", textInput( - inputId = ns("hidden"), - label = NULL, - value = genId() - )) + tags$div( + style = "display: none;", + textInput(inputId = ns("hidden"), label = NULL, value = genId()) + ) ), options = modifyList( shinyWidgets::wbOptions(height = "615px", modal = TRUE), @@ -13139,7 +12907,7 @@ visual_summary <- function(data, legend.title = NULL, ylab = "Observations", ... ggplot2::theme_minimal() + ggplot2::theme(axis.text.x = ggplot2::element_text( angle = 45, - vjust = 0, hjust = 1 + vjust = 1, hjust = 1 )) + ggplot2::scale_fill_manual(values = l$colors) + ggplot2::labs(x = "", y = ylab) + @@ -13590,7 +13358,9 @@ server <- function(input, output, session) { ######### ############################################################################## - rv_alerts <- shiny::reactiveValues(redcap_alert = NULL) + rv_alerts <- shiny::reactiveValues( + redcap_alert = NULL + ) # output$your_lang <- renderPrint(input$browser_lang) @@ -13637,26 +13407,28 @@ server <- function(input, output, session) { # ), # selected = "file" # ) - shiny::updateSelectInput(inputId = "source", choices = setNames(c("file", "redcap", "env"), c( - i18n$t("File upload"), - i18n$t("REDCap server export"), - i18n$t("Local or sample data") - ))) + shiny::updateSelectInput( + inputId = "source", + choices = setNames( + c( + "file", "redcap", "env" + ), + c( + i18n$t("File upload"), + i18n$t("REDCap server export"), + i18n$t("Local or sample data") + ) + ) + ) # output$intro_text <- renderUI(includeHTML(i18n$t("www/intro.html"))) }) shiny::observeEvent(input$language_select, { - bslib::accordion_panel_update(id = "acc_chars", - title = i18n$t("Settings"), - target = "acc_pan_chars") - bslib::accordion_panel_update(id = "acc_cor", - title = i18n$t("Settings"), - target = "acc_pan_cor") - bslib::accordion_panel_update(id = "acc_mis", - title = i18n$t("Settings"), - target = "acc_pan_mis") + bslib::accordion_panel_update(id = "acc_chars", title = i18n$t("Settings"), target = "acc_pan_chars") + bslib::accordion_panel_update(id = "acc_cor", title = i18n$t("Settings"), target = "acc_pan_cor") + bslib::accordion_panel_update(id = "acc_mis", title = i18n$t("Settings"), target = "acc_pan_mis") }) @@ -13671,32 +13443,30 @@ server <- function(input, output, session) { ######### ############################################################################## - shiny::observeEvent(input$source, { - ## Alert rendered on server as links do not render if only on client - if (input$source == "redcap") { - rv_alerts$redcap_alert <- shinyWidgets::alert( - id = "redcap_warning", - status = "info", - shiny::tags$h2(i18n$t( - "Please be mindfull handling sensitive data" - )), - shiny::markdown( - i18n$t( - "The ***FreesearchR*** app only stores data for analyses, but please only use with sensitive data when running locally. [Read more here](https://agdamsbo.github.io/FreesearchR/#run-locally-on-your-own-machine)." - ) - ), - # shiny::HTML(i18n$t("

The FreesearchR app only stores data for analyses, but please only use with sensitive data when running locally. Read more here

")), - dismissible = FALSE - ) + shiny::observeEvent( + input$source, + { + ## Alert rendered on server as links do not render if only on client + if (input$source == "redcap") { + rv_alerts$redcap_alert <- shinyWidgets::alert( + id = "redcap_warning", + status = "info", + shiny::tags$h2(i18n$t("Please be mindfull handling sensitive data")), + shiny::markdown(i18n$t("The ***FreesearchR*** app only stores data for analyses, but please only use with sensitive data when running locally. [Read more here](https://agdamsbo.github.io/FreesearchR/#run-locally-on-your-own-machine).")), + # shiny::HTML(i18n$t("

The FreesearchR app only stores data for analyses, but please only use with sensitive data when running locally. Read more here

")), + dismissible = FALSE + ) + } } - }) + ) data_file <- import_file_server( id = "file_import", show_data_in = "popup", trigger_return = "change", - return_class = "data.frame" + return_class = "data.frame", ## Added data.frame size limit (number of cells), rows are dropped to fit + limit = 100000 ) shiny::observeEvent(data_file$data(), { @@ -13705,7 +13475,9 @@ server <- function(input, output, session) { rv$code <- modifyList(x = rv$code, list(import = data_file$code())) }) - from_redcap <- m_redcap_readServer(id = "redcap_import") + from_redcap <- m_redcap_readServer( + id = "redcap_import" + ) shiny::observeEvent(from_redcap$data(), { rv$data_temp <- from_redcap$data() @@ -13717,8 +13489,7 @@ server <- function(input, output, session) { id = "env", trigger_return = "change", btn_show_data = FALSE, - reset = reactive(input$hidden), - limit_data = global_freesearchR$data_limit_upper + reset = reactive(input$hidden) ) shiny::observeEvent(from_env$data(), { @@ -13738,19 +13509,18 @@ server <- function(input, output, session) { ) observeEvent(input$modal_initial_view, { - tryCatch({ - modal_visual_summary( - id = "initial_summary", - footer = NULL, - size = "xl", - title = i18n$t("Data classes and missing observations") - ) - }, error = function(err) { - showNotification(paste( - i18n$t("We encountered the following error showing missingness:"), - err - ), type = "err") - }) + tryCatch( + { + modal_visual_summary( + id = "initial_summary", + footer = NULL, + size = "xl", title = i18n$t("Data classes and missing observations") + ) + }, + error = function(err) { + showNotification(paste(i18n$t("We encountered the following error showing missingness:"), err), type = "err") + } + ) }) output$import_var <- shiny::renderUI({ @@ -13776,13 +13546,16 @@ server <- function(input, output, session) { shiny::observeEvent(input$source, { rv$data_temp <- NULL - rv$code <- modifyList(x = rv$code, list(import = NULL)) }) shiny::outputOptions(output, "data_loaded", suspendWhenHidden = FALSE) shiny::observeEvent( - eventExpr = list(input$import_var, input$complete_cutoff, rv$data_temp), + eventExpr = list( + input$import_var, + input$complete_cutoff, + rv$data_temp + ), handlerExpr = { shiny::req(rv$data_temp) shiny::req(input$import_var) @@ -13790,34 +13563,17 @@ server <- function(input, output, session) { temp_data <- rv$data_temp if (all(input$import_var %in% names(temp_data))) { temp_data <- temp_data |> dplyr::select(input$import_var) - } else { - rv$data_original <- temp_data <- NULL } - if (!is.null(temp_data)) { - rv$data_original <- temp_data |> - default_parsing() - } - - }, - ignoreNULL = FALSE - ) - - shiny::observeEvent( - eventExpr = list(input$import_var, input$complete_cutoff, rv$data_temp), - handlerExpr = { - shiny::req(rv$data_temp) - shiny::req(input$import_var) - # browser() + rv$data_original <- temp_data |> + default_parsing() rv$code$import <- rv$code$import |> expression_string(assign.str = "df <-") rv$code$format <- list( "df", - rlang::expr(dplyr::select(dplyr::all_of( - !!input$import_var - ))), + rlang::expr(dplyr::select(dplyr::all_of(!!input$import_var))), rlang::call2(.fn = "default_parsing", .ns = "FreesearchR") ) |> lapply(expression_string) |> @@ -13826,8 +13582,7 @@ server <- function(input, output, session) { rv$code$filter <- NULL rv$code$modify <- NULL - }, - ignoreNULL = FALSE + }, ignoreNULL = FALSE ) output$data_info_import <- shiny::renderUI({ @@ -13859,9 +13614,7 @@ server <- function(input, output, session) { }) shiny::observeEvent(list(rv$data_original, rv$data), { - if (is.null(rv$data_original) | - NROW(rv$data_original) == 0 | - is.null(rv$data) | !any(is_splittable(rv$data))) { + if (is.null(rv$data_original) | NROW(rv$data_original) == 0 | is.null(rv$data) | !any(is_splittable(rv$data))) { shiny::updateActionButton(inputId = "modal_string", disabled = TRUE) } else if (!is.null(rv$data) && any(is_splittable(rv$data))) { shiny::updateActionButton(inputId = "modal_string", disabled = FALSE) @@ -13875,23 +13628,30 @@ server <- function(input, output, session) { ######### ############################################################################## - shiny::observeEvent(eventExpr = list(rv$data_original), - handlerExpr = { - shiny::req(rv$data_original) + shiny::observeEvent( + eventExpr = list( + rv$data_original + ), + handlerExpr = { + shiny::req(rv$data_original) - rv$data <- rv$data_original - }) + rv$data <- rv$data_original + } + ) ## For now this solution work, but I would prefer to solve this with the above - shiny::observeEvent(input$reset_confirm, { - if (isTRUE(input$reset_confirm)) { - shiny::req(rv$data_original) - rv$data <- rv$data_original - rv$code$filter <- NULL - rv$code$variables <- NULL - rv$code$modify <- NULL - } - }, ignoreNULL = TRUE) + shiny::observeEvent(input$reset_confirm, + { + if (isTRUE(input$reset_confirm)) { + shiny::req(rv$data_original) + rv$data <- rv$data_original + rv$code$filter <- NULL + rv$code$variables <- NULL + rv$code$modify <- NULL + } + }, + ignoreNULL = TRUE + ) shiny::observeEvent(input$data_reset, { @@ -13920,10 +13680,15 @@ server <- function(input, output, session) { ######### Create factor - shiny::observeEvent(input$modal_cut, - modal_cut_variable("modal_cut", title = i18n$t("Create new factor"))) + shiny::observeEvent( + input$modal_cut, + modal_cut_variable("modal_cut", title = i18n$t("Create new factor")) + ) - data_modal_cut <- cut_variable_server(id = "modal_cut", data_r = shiny::reactive(rv$data)) + data_modal_cut <- cut_variable_server( + id = "modal_cut", + data_r = shiny::reactive(rv$data) + ) shiny::observeEvent(data_modal_cut(), { rv$data <- data_modal_cut() @@ -13939,29 +13704,43 @@ server <- function(input, output, session) { ) # data_modal_update <- datamods::update_factor_server( - data_modal_update <- update_factor_server(id = "modal_update", data_r = reactive(rv$data)) + data_modal_update <- update_factor_server( + id = "modal_update", + data_r = reactive(rv$data) + ) - shiny::observeEvent(data_modal_update(), { - shiny::removeModal() - rv$data <- data_modal_update() - rv$code$modify[[length(rv$code$modify) + 1]] <- attr(rv$data, "code") - }) + shiny::observeEvent( + data_modal_update(), + { + shiny::removeModal() + rv$data <- data_modal_update() + rv$code$modify[[length(rv$code$modify) + 1]] <- attr(rv$data, "code") + } + ) ######### Split string - shiny::observeEvent(input$modal_string, - modal_string_split( - id = "modal_string", - title = i18n$t("Split a character string by a common delimiter") - )) + shiny::observeEvent( + input$modal_string, + modal_string_split( + id = "modal_string", + title = i18n$t("Split a character string by a common delimiter") + ) + ) - data_modal_string <- string_split_server(id = "modal_string", data_r = reactive(rv$data)) + data_modal_string <- string_split_server( + id = "modal_string", + data_r = reactive(rv$data) + ) - shiny::observeEvent(data_modal_string(), { - shiny::removeModal() - rv$data <- data_modal_string() - rv$code$modify[[length(rv$code$modify) + 1]] <- attr(rv$data, "code") - }) + shiny::observeEvent( + data_modal_string(), + { + shiny::removeModal() + rv$data <- data_modal_string() + rv$code$modify[[length(rv$code$modify) + 1]] <- attr(rv$data, "code") + } + ) ######### Create column @@ -13969,19 +13748,21 @@ server <- function(input, output, session) { input$modal_column, modal_create_column( id = "modal_column", - footer = shiny::markdown( - i18n$t( - "This window is aimed at advanced users and require some *R*-experience!" - ) - ), + footer = shiny::markdown(i18n$t("This window is aimed at advanced users and require some *R*-experience!")), title = i18n$t("Create new variables") ) ) - data_modal_r <- create_column_server(id = "modal_column", data_r = reactive(rv$data)) - shiny::observeEvent(data_modal_r(), { - rv$data <- data_modal_r() - rv$code$modify[[length(rv$code$modify) + 1]] <- attr(rv$data, "code") - }) + data_modal_r <- create_column_server( + id = "modal_column", + data_r = reactive(rv$data) + ) + shiny::observeEvent( + data_modal_r(), + { + rv$data <- data_modal_r() + rv$code$modify[[length(rv$code$modify) + 1]] <- attr(rv$data, "code") + } + ) ######### Subset, rename, reclass @@ -14038,21 +13819,42 @@ server <- function(input, output, session) { # ), { if (!is.null(rv$data_filtered)) { - rv_validations$obs_filter <- make_validation(ls = validation_lib("obs_filter"), list(x = rv$data, y = rv$data_filtered)) + rv_validations$obs_filter <- make_validation( + ls = validation_lib("obs_filter"), + list( + x = rv$data, + y = rv$data_filtered + ) + ) } if (!is.null(rv$data_variables)) { - rv_validations$var_filter <- make_validation(ls = validation_lib("var_filter"), - list(x = rv$data, y = rv$data_variables)) + rv_validations$var_filter <- make_validation( + ls = validation_lib("var_filter"), + list( + x = rv$data, + y = rv$data_variables + ) + ) } if (!is.null(rv$data)) { - rv_validations$missings <- make_validation(ls = validation_lib("missings"), list(x = rv$data)) + rv_validations$missings <- make_validation( + ls = validation_lib("missings"), + list( + x = rv$data + ) + ) } if (!is.null(rv$corr_pairs())) { req(rv$corr_pairs()) - rv_validations$corr_pairs <- make_validation(ls = validation_lib("corr_pairs"), list(x = rv$corr_pairs)) + rv_validations$corr_pairs <- make_validation( + ls = validation_lib("corr_pairs"), + list( + x = rv$corr_pairs + ) + ) } # mcar_validate(data=rv$missings()[["_data"]],outcome = input$missings_var) @@ -14060,10 +13862,13 @@ server <- function(input, output, session) { req(rv$missings()) # req(input$missings_var) # browser() - rv_validations$mcar <- make_validation(ls = validation_lib("mcar"), list( - x = rv$missings()[["_data"]], - y = attr(rv$missings(), "strat_var") - )) + rv_validations$mcar <- make_validation( + ls = validation_lib("mcar"), + list( + x = rv$missings()[["_data"]], + y = attr(rv$missings(), "strat_var") + ) + ) } } ) @@ -14072,17 +13877,35 @@ server <- function(input, output, session) { ## Individually to display at point of interest ## and as a whole to display on the final download panel - shiny::observeEvent(rv_validations$obs_filter, { - validation_server(id = "validation_obs", data = rv_validations$obs_filter) - }) + shiny::observeEvent( + rv_validations$obs_filter, + { + validation_server( + id = "validation_obs", + data = rv_validations$obs_filter + ) + } + ) - shiny::observeEvent(rv_validations$var_filter, { - validation_server(id = "validation_var", data = rv_validations$var_filter) - }) + shiny::observeEvent( + rv_validations$var_filter, + { + validation_server( + id = "validation_var", + data = rv_validations$var_filter + ) + } + ) - shiny::observeEvent(rv_validations$mcar, { - validation_server(id = "validation_mcar", data = rv_validations$mcar) - }) + shiny::observeEvent( + rv_validations$mcar, + { + validation_server( + id = "validation_mcar", + data = rv_validations$mcar + ) + } + ) shiny::observeEvent( list( @@ -14093,54 +13916,65 @@ server <- function(input, output, session) { rv_validations$corr_pairs ), { - validation_server(id = "validation_all", data = rv_validations) + validation_server( + id = "validation_all", + data = rv_validations + ) } ) ######### Data filter # IDEAFilter has the least cluttered UI, but might have a License issue # Consider using shinyDataFilter, though not on CRAN - data_filter <- IDEAFilter::IDEAFilter( - "data_filter", + data_filter <- IDEAFilter::IDEAFilter("data_filter", data = shiny::reactive(rv$data_variables), verbose = TRUE ) - shiny::observeEvent(list( - shiny::reactive(rv$data_variables), - shiny::reactive(rv$data_original), - data_filter(), - # regression_vars(), - input$complete_cutoff - ), - { - ### Save filtered data - rv$data_filtered <- data_filter() + shiny::observeEvent( + list( + shiny::reactive(rv$data_variables), + shiny::reactive(rv$data_original), + data_filter(), + # regression_vars(), + input$complete_cutoff + ), + { + ### Save filtered data + rv$data_filtered <- data_filter() - ### Save filtered data - ### without empty factor levels - rv$list$data <- data_filter() |> - REDCapCAST::fct_drop() |> - (\(.x) { - .x[!sapply(.x, is.character)] - })() + ### Save filtered data + ### without empty factor levels + rv$list$data <- data_filter() |> + REDCapCAST::fct_drop() |> + (\(.x){ + .x[!sapply(.x, is.character)] + })() - ## This looks messy!! But it works as intended for now + ## This looks messy!! But it works as intended for now - out <- gsub("filter", "dplyr::filter", gsub("\\s{2,}", " ", paste0(capture.output( - attr(rv$data_filtered, "code") - ), collapse = " "))) + out <- gsub( + "filter", "dplyr::filter", + gsub( + "\\s{2,}", " ", + paste0( + capture.output(attr(rv$data_filtered, "code")), + collapse = " " + ) + ) + ) - out <- strsplit(out, "%>%") |> - unlist() |> - (\(.x) { - paste(c("df <- df", .x[-1], "REDCapCAST::fct_drop()"), collapse = "|> \n ") - })() + out <- strsplit(out, "%>%") |> + unlist() |> + (\(.x){ + paste(c("df <- df", .x[-1], "REDCapCAST::fct_drop()"), + collapse = "|> \n " + ) + })() - rv$code <- append_list(data = out, - list = rv$code, - index = "filter") - }) + rv$code <- append_list(data = out, list = rv$code, index = "filter") + } + ) ######### Data preview @@ -14157,18 +13991,14 @@ server <- function(input, output, session) { ) observeEvent(input$modal_browse, { - tryCatch({ - show_data( - REDCapCAST::fct_drop(rv$data_filtered), - title = i18n$t("Uploaded data overview"), - type = "modal" - ) - }, error = function(err) { - showNotification(paste( - i18n$t("We encountered the following error browsing your data:"), - err - ), type = "err") - }) + tryCatch( + { + show_data(REDCapCAST::fct_drop(rv$data_filtered), title = i18n$t("Uploaded data overview"), type = "modal") + }, + error = function(err) { + showNotification(paste(i18n$t("We encountered the following error browsing your data:"), err), type = "err") + } + ) }) visual_summary_server( @@ -14181,20 +14011,18 @@ server <- function(input, output, session) { ) observeEvent(input$modal_visual_overview, { - tryCatch({ - modal_visual_summary( - id = "visual_overview", - footer = i18n$t( - "Here is an overview of how your data is interpreted, and where data is missing. Use this information to consider if data is missing at random or if some observations are missing systematically wich may be caused by an observation bias." - ), - size = "xl" - ) - }, error = function(err) { - showNotification(paste( - i18n$t("We encountered the following error showing missingness:"), - err - ), type = "err") - }) + tryCatch( + { + modal_visual_summary( + id = "visual_overview", + footer = i18n$t("Here is an overview of how your data is interpreted, and where data is missing. Use this information to consider if data is missing at random or if some observations are missing systematically wich may be caused by an observation bias."), + size = "xl" + ) + }, + error = function(err) { + showNotification(paste(i18n$t("We encountered the following error showing missingness:"), err), type = "err") + } + ) }) output$original_str <- renderPrint({ @@ -14202,19 +14030,25 @@ server <- function(input, output, session) { }) output$modified_str <- renderPrint({ - str( - as.data.frame(rv$data_filtered) |> - REDCapCAST::set_attr(label = NULL, attr = "code") - ) + str(as.data.frame(rv$data_filtered) |> + REDCapCAST::set_attr( + label = NULL, + attr = "code" + )) }) ## Evaluation table/plots reset on data change ## This does not work (!?) - shiny::observeEvent(list(rv$data_filtered), { - shiny::req(rv$data_filtered) + shiny::observeEvent( + list( + rv$data_filtered + ), + { + shiny::req(rv$data_filtered) - rv$list$table1 <- NULL - }) + rv$list$table1 <- NULL + } + ) ############################################################################## @@ -14272,12 +14106,7 @@ server <- function(input, output, session) { output$code_table1 <- shiny::renderUI({ shiny::req(rv$code$table1) - prismCodeBlock(paste0( - "#", - i18n$t("Data characteristics table"), - "\n", - rv$code$table1 - )) + prismCodeBlock(paste0("#", i18n$t("Data characteristics table"), "\n", rv$code$table1)) }) @@ -14285,7 +14114,7 @@ server <- function(input, output, session) { ## This is a very rewarding couple of lines marking new insights to dynamically rendering code shiny::observe({ shiny::req(rv$regression) - rv$regression()$regression$models |> purrr::imap(\(.x, .i) { + rv$regression()$regression$models |> purrr::imap(\(.x, .i){ output[[paste0("code_", tolower(.i))]] <- shiny::renderUI({ prismCodeBlock(paste0(paste("#", .i, "regression model\n"), .x$code_table)) }) @@ -14305,7 +14134,10 @@ server <- function(input, output, session) { selected = "none", label = i18n$t("Select variable to stratify baseline"), data = shiny::reactive(rv$data_filtered)(), - col_subset = c("none", names(rv$data_filtered)[unlist(lapply(rv$data_filtered, data_type)) %in% c("dichotomous", "categorical", "ordinal")]) + col_subset = c( + "none", + names(rv$data_filtered)[unlist(lapply(rv$data_filtered, data_type)) %in% c("dichotomous", "categorical", "ordinal")] + ) ) }) @@ -14330,9 +14162,14 @@ server <- function(input, output, session) { inputId = "detail_level", label = i18n$t("Level of detail"), selected = "minimal", - inline = TRUE, - choiceValues = c("minimal", "extended"), - choiceNames = c(i18n$t("Minimal"), i18n$t("Extensive")) + inline = TRUE, choiceValues = c( + "minimal", + "extended" + ), + choiceNames = c( + i18n$t("Minimal"), + i18n$t("Extensive") + ) ) }) @@ -14346,8 +14183,7 @@ server <- function(input, output, session) { output$data_info_nochar <- shiny::renderUI({ shiny::req(rv$list$data) - data_description(rv$list$data, - data_text = i18n$t("The dataset without text variables")) + data_description(rv$list$data, data_text = i18n$t("The dataset without text variables")) }) ## Only allow evaluation if the dataset has fewer then 50 variables @@ -14363,56 +14199,60 @@ server <- function(input, output, session) { # }) - shiny::observeEvent(list(input$act_eval), { - shiny::req(input$strat_var) - # shiny::req(input$baseline_theme) - shiny::req(input$detail_level) - shiny::req(rv$list$data) + shiny::observeEvent( + list( + input$act_eval + ), + { + shiny::req(input$strat_var) + # shiny::req(input$baseline_theme) + shiny::req(input$detail_level) + shiny::req(rv$list$data) - parameters <- list( - by.var = input$strat_var, - add.p = input$add_p == "yes", - add.overall = TRUE, - add.diff = input$add_diff == "yes", - # theme = input$baseline_theme, - detail_level = input$detail_level - ) + parameters <- list( + by.var = input$strat_var, + add.p = input$add_p == "yes", + add.overall = TRUE, + add.diff = input$add_diff == "yes", + # theme = input$baseline_theme, + detail_level = input$detail_level + ) - ## Limits maximum number of levels included in baseline table to 20. - data <- rv$list$data |> - lapply(\(.x) { - # browser() - if (is.factor(.x)) { - cut_var(.x, breaks = 20, type = "top") - } else { - .x - } - }) |> - dplyr::bind_cols() + ## Limits maximum number of levels included in baseline table to 20. + data <- rv$list$data |> + lapply(\(.x){ + # browser() + if (is.factor(.x)) { + cut_var(.x, breaks = 20, type = "top") + } else { + .x + } + }) |> + dplyr::bind_cols() - # Attempt to introduce error on analysing too large dataset - # tryCatch( - # { - # if (ncol(rv$list$data) > 10) { - # n_col <- ncol(rv$list$data) - # # stop(glue::glue(i18n$t("The data includes {n_col} variables. Please limit to 100."))) - # print("Please limit to 100.") - # } else { - shiny::withProgress(message = i18n$t("Creating the table. Hold on for a moment.."), { - rv$list$table1 <- rlang::exec(create_baseline, - !!!append_list(data, parameters, "data")) - }) - # } - # }, - # error = function(err) { - # showNotification(err, type = "err") - # } - # ) + # Attempt to introduce error on analysing too large dataset + # tryCatch( + # { + # if (ncol(rv$list$data) > 10) { + # n_col <- ncol(rv$list$data) + # # stop(glue::glue(i18n$t("The data includes {n_col} variables. Please limit to 100."))) + # print("Please limit to 100.") + # } else { + shiny::withProgress(message = i18n$t("Creating the table. Hold on for a moment.."), { + rv$list$table1 <- rlang::exec(create_baseline, !!!append_list(data, parameters, "data")) + }) + # } + # }, + # error = function(err) { + # showNotification(err, type = "err") + # } + # ) - rv$code$table1 <- glue::glue("FreesearchR::create_baseline(df,{list2str(parameters)})") - }) + rv$code$table1 <- glue::glue("FreesearchR::create_baseline(df,{list2str(parameters)})") + } + ) output$table1 <- gt::render_gt({ if (!is.null(rv$list$table1)) { @@ -14430,7 +14270,10 @@ server <- function(input, output, session) { selected = "none", data = rv$list$data, label = i18n$t("Select outcome variable"), - col_subset = c("none", colnames(rv$list$data)), + col_subset = c( + "none", + colnames(rv$list$data) + ), multiple = FALSE ) }) @@ -14440,8 +14283,7 @@ server <- function(input, output, session) { data = shiny::reactive({ shiny::req(rv$list$data) out <- rv$list$data - if (!is.null(input$outcome_var_cor) && - input$outcome_var_cor != "none") { + if (!is.null(input$outcome_var_cor) && input$outcome_var_cor != "none") { out <- out[!names(out) %in% input$outcome_var_cor] } out @@ -14452,8 +14294,10 @@ server <- function(input, output, session) { ## Missingness evaluation - rv$missings <- data_missings_server(id = "missingness", - data = shiny::reactive(rv$data_filtered)) + rv$missings <- data_missings_server( + id = "missingness", + data = shiny::reactive(rv$data_filtered) + ) @@ -14488,10 +14332,6 @@ server <- function(input, output, session) { ######### ############################################################################## - shiny::observeEvent(input$act_data, { - bslib::nav_select(id = "main_panel", selected = "nav_import") - }) - shiny::observeEvent(input$act_start, { bslib::nav_select(id = "main_panel", selected = "nav_prepare_overview") }) @@ -14545,33 +14385,31 @@ server <- function(input, output, session) { rv$list$missings <- rv$missings() shiny::withProgress(message = i18n$t("Generating the report. Hold on for a moment.."), { - tryCatch({ - out <- rv$list |> - write_rmd( - params.args = list( - regression.p = rv$list$regression$input$add_regression_p - ), - output_format = format, - input = file.path(getwd(), "www/report.rmd") - ) - # This only works locally and was disabled - # if (type == "docx") { - # ## This handles the the following MS Word warning: - # ## >> "This document contains fields that may refer to other files." - # out |> doconv::docx_update() - # } else { - # out - # } + tryCatch( + { + out <- rv$list |> + write_rmd( + params.args = list( + regression.p = rv$list$regression$input$add_regression_p + ), + output_format = format, + input = file.path(getwd(), "www/report.rmd") + ) + # This only works locally and was disabled + # if (type == "docx") { + # ## This handles the the following MS Word warning: + # ## >> "This document contains fields that may refer to other files." + # out |> doconv::docx_update() + # } else { + # out + # } - out - }, error = function(err) { - showNotification(paste0( - i18n$t( - "We encountered the following error creating your report: " - ), - err - ), type = "err") - }) + out + }, + error = function(err) { + showNotification(paste0(i18n$t("We encountered the following error creating your report: "), err), type = "err") + } + ) }) file.rename(paste0("www/report.", type), file) } @@ -14601,7 +14439,7 @@ server <- function(input, output, session) { session$onSessionEnded(function() { cat("Session Ended\n") files <- list.files("www/") - lapply(files[!files %in% files.to.keep], \(.x) { + lapply(files[!files %in% files.to.keep], \(.x){ unlink(paste0("www/", .x), recursive = FALSE) print(paste(.x, "deleted")) }) diff --git a/inst/translations/translation_da.csv b/inst/translations/translation_da.csv index cf5fc05c..83406f05 100644 --- a/inst/translations/translation_da.csv +++ b/inst/translations/translation_da.csv @@ -5,6 +5,7 @@ "REDCap server export","Eksport fra REDCap server" "Local or sample data","Lokal eller testdata" "Please be mindfull handling sensitive data","Pas godt på og overvej nøje hvordan du håndterer personfølsomme data" +"The ***FreesearchR*** app only stores data for analyses, but please only use with sensitive data when running locally. [Read more here](https://agdamsbo.github.io/FreesearchR/#run-locally-on-your-own-machine).","***FreesearchR*** opbevarer alene data i forbindelse med din analyse, men du bør kun behandle personfølsomme data når du kører ***FreesearchR*** direkte på din egen maskine. [Læs mere her](https://agdamsbo.github.io/FreesearchR/#run-locally-on-your-own-machine)." "Quick overview","Hurtigt overblik" "Select variables for final import","Vælg variabler til den endelige import" "Exclude incomplete variables:","Ekskluder inkomplette variabler:" @@ -23,11 +24,16 @@ "Apply filter on observation","Anvend filtre af observationer" "Edit and create data","Ændr og opret variabler" "Subset, rename and convert variables","Udvælg, omdøb og konverter variabler" +"Below, are several options for simple data manipulation like update variables by renaming, creating new labels (for nicer tables in the report) and changing variable classes (numeric, factor/categorical etc.).","Nedenfor er der mulighed for at lave simple ændringer i dit datasæt, såsom at redigere variabelnavne eller beskrivelser (bedre tabeller), eller omklassificering af variabler (numerisk, factoriel/kategorisk)." +"Please note that data modifications are applied before any filtering.","Bemærk at alle ændringer i data anvendes inden filtreringen." "Advanced data manipulation","Avanceret datamanipulation" "Below options allow more advanced varaible manipulations.","Nedenfor er mulighed for avancerede ændringer i data." "New factor","Ny faktor" +"Create factor/categorical variable from a continous variable (number/date/time).","Opret kategorisk variabel på baggrund af kontinuert variabel (numerisk/dato/tid)." "New variable","Ny variabel" +"Create a new variable based on an R-expression.","Opret ny variabel baseret på R-kode." "Compare modified data to original","Sammenlign ændret data med det originale datasæt" +"Raw print of the original vs the modified data.","Simpel sammenligning af det originale og det ændrede datasæt." "Original data:","Original data:" "Modified data:","Ændret data:" "New column name:","Navn til ny variabel:" @@ -58,6 +64,7 @@ "Imported data","Importeret data" "www/intro.md","www/intro.md" "Choose your data","Vælg dine data" +"Upload a file, get data directly from REDCap or use local or sample data.","Upload en fil, hent data direkte fra en REDCap-server eller brug test-data eller lokal data." "Factor variable to reorder:","Kategoriske variabel der skal ændres:" "Sort by levels","Sorter efter niveauer" "Sort by count","Sorter efter antal" @@ -88,7 +95,9 @@ "Visuals","Grafik" "Regression","Regression" "Download","Download" +"{data_text} has {n} observations and {n_var} variables, with {n_complete} ({p_complete} %) complete cases.","{data_text} har {n} observationer og {n_var} variabler, med {n_complete} ({p_complete} %) komplette cases." "Prepare","Forbered" +"At 0, only complete variables are included; at 100, all variables are included.","Ved 0 inkluderes alene komplette variabler; ved 100 inkluderes alle variabler." "The following variable pairs are highly correlated: {sentence_paste(.x,and_str)}.\nConsider excluding one {more}from the dataset to ensure variables are independent.","De følgende variabel-par er stærkt korrelerede: {sentence_paste(.x,and_str)}.\nOvervej at fjerne en {more}fra datasættet for at sikre at prædiktorer er internt uafhængige." "No variables have a correlation measure above the threshold.","Ingen variabler er korrelerede over den angivne tærskelværdi." "and","og" @@ -132,17 +141,23 @@ "Create plot","Dan grafik" "Coefficients plot","Koefficientgraf" "Checks","Test af model" +"Below you find a summary table for quick insigths, and on the right you can visualise data classes, browse observations and apply different data filters.","Nedenfor er en opsummerende tabel, der giver hurtigt overblik. Til højre kan du få et visuelt overblik, gennemgå observationer og oprette datafiltre." "Browse observations","Gennemse observationer" "Settings","Indstillinger" "The following error occured on determining correlations:","Følgende fejl opstod i forbindelse med korrelationsanalysen:" +"We encountered the following error creating your report:","Følgende fejl opstod, da rapporten blev dannet:" "No missing observations","Ingen manglende observationer" "There is a total of {p_miss} % missing observations.","Der er i alt {p_miss} % manglende observationer." "Median:","Median:" "Restore original data","Gendan originale data" +"Reset to original imported dataset. Careful! There is no un-doing.","Gendan det oprindeligt importerede datasæt. Forsigtig! Alle dine ændringer vil forsvinde." "Characteristics","Karakteristika" +"Only factor/categorical variables are available for stratification. Go back to the 'Prepare' tab to reclass a variable if it's not on the list.","Alene kategoriske variabler kan danne grundlag for stratificering. Mangler du en variabel, så gå til ""Forbered"" og omklassificer til kategorisk." "Compare strata?","Sammenlign strata?" "Correlations","Korrelationer" +"To avoid evaluating the correlation of the outcome variable, this can be excluded from the plot or select 'none'.","For at udelukke svarvariablen fra korrelationsanalysen, så kan du vælge din svarvariabel eller vælge 'non', hvis du ikke vil angive en." "Correlation cut-off","Korrelationsgrænse" +"Set the cut-off for considered 'highly correlated'.","Angiv grænsen for. hvad, der tolkes som 'betydelig korrelation'." "Missings","Manglende observationer" "Class","Klasse" "Observations","Observationer" @@ -152,9 +167,11 @@ "Confirm","Bekræft" "The filtered data","Filtreret data" "Create new factor","Ny kategorisk variabel" +"This window is aimed at advanced users and require some *R*-experience!","Dette vindue er primært for avancerede brugere med nogen *R*-erfaring!" "Create new variables","Opret nye variabler" "Select data types to include","Vælg datatyper, der skal inkluderes" "Uploaded data overview","Overblik over uploaded data" +"Here is an overview of how your data is interpreted, and where data is missing. Use this information to consider if data is missing at random or if some observations are missing systematically wich may be caused by an observation bias.","Her har du en oversigt over hvordan data er blevet formateret, og hvor der er manglende observationer. Brug informationen til at overveje om manglende data mangler tilfældigt eller og der er et mønster, som kan være et udtryk for systematisk manglende data (observationsbias)." "Specify covariables","Angiv kovariabler" "If none are selected, all are included.","Hvis ingen er valgt inkluderes alle." "Analyse","Analysér" @@ -192,6 +209,7 @@ "List of datasets...","Liste af datasæt..." "No data selected!","Ingen data valgt!" "No dataset here...","Ingen datasæt her..." +"Use a dataset from your environment or from the environment of a package.","Brug et datasæt fra dit lokale kodemiljø eller fra en tilgængelig pakke." "Not a data.frame","Ikke en data.frame" "Select source","Vælg datakilde" "Select a data source:","Vælg datakilde:" @@ -211,6 +229,7 @@ "Multivariable regression model checks","Tests af multivariabel regressionsmodel" "Grouped by {get_label(data,ter)}","Grupperet efter {get_label(data,ter)}" "Option to perform statistical comparisons between strata in baseline table.","Mulighed for at udføre statistiske tests mellem strata i oversigtstabellen." +"Press 'Evaluate' to create the comparison table.","Tryk 'Evaluér' for at oprette en oversigtstabel." "The data includes {n_col} variables. Please limit to 100.","Data indeholder {n_col} variabler. Begræns venligst til 100." "Data import","Data import" "Data import formatting","Formatering af data ved import" @@ -242,6 +261,7 @@ "By specified numbers","Efter specifikke værdier" "By quantiles (groups of equal size)","I grupper af samme størrelse" "By week number","Efter ugenummer alene" +"There are more advanced options to modify factor/categorical variables as well as create new factor from an existing variable or new variables with R code. At the bottom you can restore the original data.","Der er mere avancerede muligheder for at ændre kategoriske variable, oprette nye kategoriske variabler fra eksisterende data eller nye variable baseret på R-kode. Nederst kan du gendanne originale data." "Split the variable","Opdel variablen" "Original data","Oprindelige data" "Preview of result","Forhåndsvisning af resultat" @@ -255,6 +275,7 @@ "Browse data preview","Forhåndsvisning af resultat" "Split character string","Opdel tegnstreng" "Split text","Opdel tekst" +"Split a text column by a recognised delimiter.","Ingen tegnvariabler med accepterede afgrænsere fundet." "Split a character string by a common delimiter","Opdel en tekstkolonne med en fælles afgrænser" "Apply split","Anvend opdeling" "Stacked relative barplot","Stablet relativt søjlediagram" @@ -269,10 +290,14 @@ "Words","Ord" "Shorten to first letters","Afkort til første bogstaver" "Shorten to first words","Afkort til de første ord" +"Missings across variables by the variable **'{input$missings_var}'**","Manglende værdier på tværs af variablerne **'{input$missings_var}'**" +"Missing vs non-missing observations in the variable **'{input$missings_var}'**","Manglende vs. ikke-manglende observationer i variablen **'{input$missings_var}'**" +"Evaluate missingness by either comparing missing values across variables (optionally grouped by af categorical or dichotomous variable) or compare variables grouped by the missing status (missing or not) of an outcome variable. If there is a significant difference i the missingness, this may cause a bias in you data and should be considered carefully interpreting the data and analyses as data may not be missing at random.","Evaluer manglende værdier ved enten at sammenligne manglende værdier på tværs af variabler (valgfrit grupperet efter en kategorisk eller dikotom variabel) eller sammenligne variabler grupperet efter manglende status (mangler eller ej) for en udfaldsvariabel. Hvis der er en signifikant forskel i manglende værdier, kan dette forårsage en bias i dine data, og det bør overvejes omhyggeligt at fortolke dataene og analyserne, da data muligvis ikke mangler tilfældigt." "Calculating. Hold tight for a moment..","Beregner. Hold lige fast et øjeblik.." "Overview of missing observations","Oversigt over manglende observationer" "Analysis method for missingness overview","Analysemetode for oversigt over manglende indhold" "Overview of missings across variables","Oversigt over mangler på tværs af variabler" +"Overview of difference in variables by missing status in outcome","Oversigt over forskel i variabler ved manglende status i resultat" "Select a variable for grouped overview","Vælg en variabel til grupperet oversigt" "Select outcome variable for overview","Vælg resultatvariabel for oversigt" "No outcome measure chosen","Ingen resultatmål valgt" @@ -316,14 +341,3 @@ "Reorder factor levels","Omarranger niveauer" "Modify factor levels","Modify factor levels" "Reorder or rename the levels of factor/categorical variables.","Reorder or rename the levels of factor/categorical variables." -"Maximum number of observations:","Maximum number of observations:" -"setting to 0 includes all","setting to 0 includes all" -"Select a dataset from your environment or sample dataset from a package.","Select a dataset from your environment or sample dataset from a package." -"Select a sample dataset from a package.","Select a sample dataset from a package." -"Data ready to be imported!","Data ready to be imported!" -"Data has %s obs. of %s variables.","Data has %s obs. of %s variables." -"Data successfully imported!","Data successfully imported!" -"Click to see data","Click to see data" -"No data present.","No data present." -"You have provided a complete dataset with no missing values.","You have provided a complete dataset with no missing values." -"Start by loading data.","Start by loading data." diff --git a/inst/translations/translation_sw.csv b/inst/translations/translation_sw.csv index f17394c2..84b00b3e 100644 --- a/inst/translations/translation_sw.csv +++ b/inst/translations/translation_sw.csv @@ -5,6 +5,7 @@ "REDCap server export","Usafirishaji wa seva ya REDCap" "Local or sample data","Data ya ndani au ya sampuli" "Please be mindfull handling sensitive data","Tafadhali kuwa mwangalifu kushughulikia data nyeti" +"The ***FreesearchR*** app only stores data for analyses, but please only use with sensitive data when running locally. [Read more here](https://agdamsbo.github.io/FreesearchR/#run-locally-on-your-own-machine).","Programu ya ***FreesearchR*** huhifadhi data kwa ajili ya uchambuzi pekee, lakini tafadhali tumia tu na data nyeti unapoendesha ndani. [Soma zaidi hapa](https://agdamsbo.github.io/FreesearchR/#run-locally-on-your-own-machine)." "Quick overview","Muhtasari wa haraka" "Select variables for final import","Chagua vigezo vya kuingiza mwisho" "Exclude incomplete variables:","Ondoa vigezo visivyokamilika:" @@ -23,11 +24,16 @@ "Apply filter on observation","Tumia kichujio wakati wa uchunguzi" "Edit and create data","Hariri na uunde data" "Subset, rename and convert variables","Weka sehemu ndogo, badilisha jina na ubadilishe vigezo" +"Below, are several options for simple data manipulation like update variables by renaming, creating new labels (for nicer tables in the report) and changing variable classes (numeric, factor/categorical etc.).","Hapa chini, kuna chaguo kadhaa za urekebishaji rahisi wa data kama vile kusasisha vigezo kwa kubadilisha majina, kuunda lebo mpya (kwa majedwali mazuri zaidi katika ripoti) na kubadilisha madarasa ya vigezo (nambari, vipengele/kategoria n.k.)." +"Please note that data modifications are applied before any filtering.","Tafadhali kumbuka kwamba marekebisho ya data hutumika kabla ya kuchuja yoyote." "Advanced data manipulation","Udhibiti wa data wa hali ya juu" "Below options allow more advanced varaible manipulations.","Chaguzi zilizo hapa chini huruhusu udanganyifu wa hali ya juu zaidi unaoweza kubadilika." "New factor","Kipengele kipya" +"Create factor/categorical variable from a continous variable (number/date/time).","Unda kigezo cha kipengele/kitengo kutoka kwa kigezo endelevu (nambari/tarehe/saa)." "New variable","Kigezo kipya" +"Create a new variable based on an R-expression.","Unda kigezo kipya kulingana na usemi wa R." "Compare modified data to original","Linganisha data iliyobadilishwa na ya asili" +"Raw print of the original vs the modified data.","Chapisho ghafi la data asili dhidi ya data iliyorekebishwa." "Original data:","Data asilia:" "Modified data:","Data iliyorekebishwa:" "New column name:","Jina jipya la safu wima:" @@ -58,6 +64,7 @@ "Imported data","Data iliyoingizwa" "www/intro.md","www/intro.md" "Choose your data","Chagua data yako" +"Upload a file, get data directly from REDCap or use local or sample data.","Pakia faili, pata data moja kwa moja kutoka REDCap au tumia data ya ndani au sampuli." "Factor variable to reorder:","Kigezo cha vipengele ili kupanga upya:" "Sort by levels","Panga kwa viwango" "Sort by count","Panga kwa hesabu" @@ -88,7 +95,9 @@ "Visuals","Picha" "Regression","Urejeshaji" "Download","Pakua" +"{data_text} has {n} observations and {n_var} variables, with {n_complete} ({p_complete} %) complete cases.","{data_text} ina uchunguzi wa {n} na vigezo vya {n_var}, pamoja na visa kamili vya {n_complete} ({p_complete}%)." "Prepare","Tayarisha" +"At 0, only complete variables are included; at 100, all variables are included.","Katika 0, ni vigezo kamili pekee vilivyojumuishwa; katika 100, vigezo vyote vimejumuishwa." "The following variable pairs are highly correlated: {sentence_paste(.x,and_str)}.\nConsider excluding one {more}from the dataset to ensure variables are independent.","Jozi zifuatazo za vigeu zina uhusiano wa hali ya juu: {sentence_paste(.x,and_str)}.\nFikiria kutenga moja {zaidi} kutoka kwenye seti ya data ili kuhakikisha vigeu vinajitegemea." "No variables have a correlation measure above the threshold.","Hakuna vigezo vyenye kipimo cha uhusiano kilicho juu ya kizingiti." "and","na" @@ -132,17 +141,23 @@ "Create plot","Unda njama" "Coefficients plot","Mchoro wa viambato" "Checks","Hundi" +"Below you find a summary table for quick insigths, and on the right you can visualise data classes, browse observations and apply different data filters.","Hapa chini kuna jedwali la muhtasari kwa ajili ya ufahamu wa haraka, na upande wa kulia unaweza kuibua madarasa ya data, kuvinjari uchunguzi na kutumia vichujio tofauti vya data." "Browse observations","Vinjari uchunguzi" "Settings","Mipangilio" "The following error occured on determining correlations:","Hitilafu ifuatayo ilitokea katika kubaini uhusiano:" +"We encountered the following error creating your report:","Tulikutana na hitilafu ifuatayo katika kuunda ripoti yako:" "No missing observations","Hakuna uchunguzi unaokosekana" "There is a total of {p_miss} % missing observations.","Kuna jumla ya uchunguzi wa {p_miss}% unaokosekana." "Median:","Wastani:" "Restore original data","Rejesha data asili" +"Reset to original imported dataset. Careful! There is no un-doing.","Rudisha kwenye seti ya data asili iliyoingizwa. Kuwa mwangalifu! Hakuna kutengua." "Characteristics","Sifa" +"Only factor/categorical variables are available for stratification. Go back to the 'Prepare' tab to reclass a variable if it's not on the list.","Vigezo vya vipengele/kategoria pekee ndivyo vinavyopatikana kwa ajili ya uainishaji wa tabaka. Rudi kwenye kichupo cha 'Tayarisha' ili kupanga upya kigezo ikiwa hakipo kwenye orodha." "Compare strata?","Linganisha tabaka?" "Correlations","Uhusiano" +"To avoid evaluating the correlation of the outcome variable, this can be excluded from the plot or select 'none'.","Ili kuepuka kutathmini uhusiano wa kigezo cha matokeo, hii inaweza kutengwa kwenye njama au kuchagua 'hakuna'." "Correlation cut-off","Kikomo cha uhusiano" +"Set the cut-off for considered 'highly correlated'.","Weka kikomo cha 'kinachohusiana sana'." "Missings","Hazipo" "Class","Darasa" "Observations","Uchunguzi" @@ -152,9 +167,11 @@ "Confirm","Thibitisha" "The filtered data","Data iliyochujwa" "Create new factor","Unda kipengele kipya" +"This window is aimed at advanced users and require some *R*-experience!","Dirisha hili linalenga watumiaji wa hali ya juu na linahitaji uzoefu wa *R*!" "Create new variables","Unda vigezo vipya" "Select data types to include","Chagua aina za data za kujumuisha" "Uploaded data overview","Muhtasari wa data iliyopakiwa" +"Here is an overview of how your data is interpreted, and where data is missing. Use this information to consider if data is missing at random or if some observations are missing systematically wich may be caused by an observation bias.","Hapa kuna muhtasari wa jinsi data yako inavyotafsiriwa, na mahali ambapo data inakosekana. Tumia taarifa hii kuzingatia ikiwa data inakosekana bila mpangilio au ikiwa baadhi ya uchunguzi unakosekana kimfumo ambao unaweza kusababishwa na upendeleo wa uchunguzi." "Specify covariables","Bainisha vigeu vinavyoweza kuunganishwa" "If none are selected, all are included.","Ikiwa hakuna aliyechaguliwa, wote wamejumuishwa." "Analyse","Changanua" @@ -192,6 +209,7 @@ "List of datasets...","Orodha ya seti za data..." "No data selected!","Hakuna data iliyochaguliwa!" "No dataset here...","Hakuna seti ya data hapa..." +"Use a dataset from your environment or from the environment of a package.","Tumia seti ya data kutoka kwa mazingira yako au kutoka kwa mazingira ya kifurushi." "Not a data.frame","Sio data.frame" "Select source","Chagua chanzo" "Select a data source:","Chagua chanzo cha data:" @@ -211,6 +229,7 @@ "Multivariable regression model checks","Ukaguzi wa modeli ya urejeshaji unaoweza kubadilika-badilika" "Grouped by {get_label(data,ter)}","Imepangwa kwa makundi kulingana na {get_label(data,ter)}" "Option to perform statistical comparisons between strata in baseline table.","Chaguo la kufanya ulinganisho wa takwimu kati ya tabaka katika jedwali la msingi." +"Press 'Evaluate' to create the comparison table.","Bonyeza 'Tathmini' ili kuunda jedwali la kulinganisha." "The data includes {n_col} variables. Please limit to 100.","Data inajumuisha vigezo vya {n_col}. Tafadhali punguza hadi 100." "Data import","Uingizaji wa data" "Data import formatting","Uumbizaji wa kuingiza data" @@ -242,6 +261,7 @@ "By specified numbers","Kwa nambari zilizoainishwa" "By quantiles (groups of equal size)","Kwa quantiles (vikundi vya ukubwa sawa)" "Please fill in web address and API token, then press 'Connect'.","Tafadhali jaza anwani ya wavuti na tokeni ya API, kisha bonyeza 'Unganisha'." +"There are more advanced options to modify factor/categorical variables as well as create new factor from an existing variable or new variables with R code. At the bottom you can restore the original data.","Kuna chaguo za hali ya juu zaidi za kurekebisha vigezo vya vipengele/kategoria pamoja na kuunda kipengele kipya kutoka kwa kigezo kilichopo au vigezo vipya vyenye msimbo wa R. Chini unaweza kurejesha data asili." "Text or character to split string by","Maandishi au herufi ya kugawanya mfuatano kwa" "Split the variable","Gawanya kigezo" "Variable to split:","Kinachoweza kubadilika hadi kugawanyika:" @@ -256,6 +276,7 @@ "Original data","Data asili" "Preview of result","Hakikisho la matokeo" "No character variables with accepted delimiters detected.","Hakuna vigezo vya herufi vilivyo na vidhibiti vinavyokubalika vilivyogunduliwa." +"Split a text column by a recognised delimiter.","Gawanya safu wima ya maandishi kwa kitenga kinachotambulika." "Apply split","Tumia mgawanyiko" "Stacked relative barplot","Kipande cha baruni kilichopangwa kwa mirundiko" "Create relative stacked barplots to show the distribution of categorical levels","Unda viwanja vya baruni vilivyopangwa ili kuonyesha usambazaji wa viwango vya kategoria" @@ -269,10 +290,14 @@ "Words","Maneno" "Shorten to first letters","Fupisha herufi za kwanza" "Shorten to first words","Fupisha maneno ya kwanza" +"Missings across variables by the variable **'{input$missings_var}'**","Hazipo katika vigezo kwa kigezo **'{input$missings_var}'**" +"Missing vs non-missing observations in the variable **'{input$missings_var}'**","Uchunguzi unaokosekana dhidi ya usiokosekana katika kigezo **'{input$missings_var}'**" +"Evaluate missingness by either comparing missing values across variables (optionally grouped by af categorical or dichotomous variable) or compare variables grouped by the missing status (missing or not) of an outcome variable. If there is a significant difference i the missingness, this may cause a bias in you data and should be considered carefully interpreting the data and analyses as data may not be missing at random.","Tathmini upungufu kwa kulinganisha thamani zinazokosekana katika vigezo (hiari zilizopangwa kwa mujibu wa kigezo cha kategoria au cha pande mbili) au linganisha vigezo vilivyopangwa kwa mujibu wa hali inayokosekana (inayokosekana au isiyokosekana) ya kigezo cha matokeo. Ikiwa kuna tofauti kubwa katika upungufu, hii inaweza kusababisha upendeleo katika data yako na inapaswa kuzingatiwa kwa uangalifu kutafsiri data na uchambuzi kwani data inaweza isikosekane bila mpangilio." "Calculating. Hold tight for a moment..","Kuhesabu. Shikilia kwa muda.." "Overview of missing observations","Muhtasari wa uchunguzi uliokosekana" "Analysis method for missingness overview","Mbinu ya uchambuzi wa muhtasari wa kukosekana" "Overview of missings across variables","Muhtasari wa mambo yanayokosekana katika vigezo" +"Overview of difference in variables by missing status in outcome","Muhtasari wa tofauti katika vigezo kwa kukosa hali katika matokeo" "Select a variable for grouped overview","Chagua kigezo cha muhtasari wa kikundi" "Select outcome variable for overview","Chagua kigezo cha matokeo kwa muhtasari" "No outcome measure chosen","Hakuna kipimo cha matokeo kilichochaguliwa" @@ -316,14 +341,3 @@ "Reorder factor levels","Reorder factor levels" "Modify factor levels","Modify factor levels" "Reorder or rename the levels of factor/categorical variables.","Reorder or rename the levels of factor/categorical variables." -"Maximum number of observations:","Maximum number of observations:" -"setting to 0 includes all","setting to 0 includes all" -"Select a dataset from your environment or sample dataset from a package.","Select a dataset from your environment or sample dataset from a package." -"Select a sample dataset from a package.","Select a sample dataset from a package." -"Data ready to be imported!","Data ready to be imported!" -"Data has %s obs. of %s variables.","Data has %s obs. of %s variables." -"Data successfully imported!","Data successfully imported!" -"Click to see data","Click to see data" -"No data present.","No data present." -"You have provided a complete dataset with no missing values.","You have provided a complete dataset with no missing values." -"Start by loading data.","Start by loading data." diff --git a/man/get_dimensions.Rd b/man/get_dimensions.Rd deleted file mode 100644 index 0c2096d3..00000000 --- a/man/get_dimensions.Rd +++ /dev/null @@ -1,19 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/import_globalenv-ext.R -\name{get_dimensions} -\alias{get_dimensions} -\title{Extension of the helper function from datamods} -\usage{ -get_dimensions(objs, filter_df = TRUE) -} -\arguments{ -\item{objs}{objs} - -\item{filter_df}{flag to only include data frames} -} -\value{ -vector of data frames with the package names as attr -} -\description{ -Extension of the helper function from datamods -} diff --git a/man/import-file.Rd b/man/import-file.Rd index 5105ee53..0f092d52 100644 --- a/man/import-file.Rd +++ b/man/import-file.Rd @@ -12,10 +12,7 @@ import_file_ui( preview_data = TRUE, file_extensions = c(".csv", ".txt", ".xls", ".xlsx", ".rds", ".fst", ".sas7bdat", ".sav"), - layout_params = c("dropdown", "inline"), - limit_default = 10000, - limit_upper = 10000, - limit_lower = 0 + layout_params = c("dropdown", "inline") ) import_file_server( @@ -24,7 +21,8 @@ import_file_server( show_data_in = c("popup", "modal"), trigger_return = c("button", "change"), return_class = c("data.frame", "data.table", "tbl_df", "raw"), - reset = reactive(NULL) + reset = reactive(NULL), + limit = 1e+05 ) } \arguments{ diff --git a/man/import-globalenv.Rd b/man/import-globalenv.Rd index 0ccd0fbc..5c8f304c 100644 --- a/man/import-globalenv.Rd +++ b/man/import-globalenv.Rd @@ -19,8 +19,7 @@ import_globalenv_server( show_data_in = c("popup", "modal"), trigger_return = c("button", "change"), return_class = c("data.frame", "data.table", "tbl_df", "raw"), - reset = reactive(NULL), - limit_data = NULL + reset = reactive(NULL) ) } \arguments{ @@ -44,8 +43,6 @@ use \code{NULL} for no title or a \code{shiny.tag} for a custom one.} \item{return_class}{Class of returned data: \code{data.frame}, \code{data.table}, \code{tbl_df} (tibble) or \code{raw}.} \item{reset}{A \code{reactive} function that when triggered resets the data.} - -\item{limit_data}{upper limit to imported data} } \description{ Let the user select a dataset from its own environment or from a package's environment. diff --git a/man/launch_FreesearchR.Rd b/man/launch_FreesearchR.Rd index e052ba7b..c456e530 100644 --- a/man/launch_FreesearchR.Rd +++ b/man/launch_FreesearchR.Rd @@ -4,25 +4,10 @@ \alias{launch_FreesearchR} \title{Easily launch the FreesearchR app} \usage{ -launch_FreesearchR( - inlcude_globalenv = TRUE, - data_limit_default = 1000, - data_limit_upper = 1e+05, - data_limit_lower = 1, - ... -) +launch_FreesearchR(...) } \arguments{ -\item{data_limit_default}{default data set observations limit} - -\item{data_limit_upper}{data set observations upper limit} - -\item{data_limit_lower}{data set observations lower limit} - \item{...}{passed on to \code{shiny::runApp()}} - -\item{include_globalenv}{flag to include global env (local data) as option -when loading data} } \value{ shiny app diff --git a/man/limit_data_size.Rd b/man/limit_data_size.Rd index 54048fb5..f6780e8c 100644 --- a/man/limit_data_size.Rd +++ b/man/limit_data_size.Rd @@ -18,10 +18,9 @@ data.frame This function may act to guard a hosted app against very large data sets in addition to the file size limitations. The function will limit the data set by dropping rows. -If limit is set to 0 or NULL, the original data set is returned. } \examples{ prod(dim(mtcars)) -limit_data_size(mtcars,2) +limit_data_size(mtcars) limit_data_size(mtcars,100) } diff --git a/renv.lock b/renv.lock index dfbaf8cd..6841ab5e 100644 --- a/renv.lock +++ b/renv.lock @@ -1,6 +1,6 @@ { "R": { - "Version": "4.5.2", + "Version": "4.4.1", "Repositories": [ { "Name": "CRAN", @@ -169,9 +169,9 @@ }, "Hmisc": { "Package": "Hmisc", - "Version": "5.2-5", + "Version": "5.2-4", "Source": "Repository", - "Date": "2026-01-08", + "Date": "2025-10-02", "Title": "Harrell Miscellaneous", "Authors@R": "c(person(given = \"Frank E\", family = \"Harrell Jr\", role = c(\"aut\", \"cre\"), email = \"fh@fharrell.com\", comment = c(ORCID = \"0000-0002-8271-5493\")), person(given = \"Cole\", family = \"Beck\", role = c(\"ctb\"), email = \"cole.beck@vumc.org\" ), person(given = \"Charles\", family = \"Dupont\", role = \"ctb\") )", "Depends": [ @@ -537,28 +537,33 @@ }, "REDCapCAST": { "Package": "REDCapCAST", - "Version": "26.1.1", + "Version": "25.3.2", "Source": "Repository", "Title": "REDCap Metadata Casting and Castellated Data Handling", - "Authors@R": "c( person(\"Andreas Gammelgaard\", \"Damsbo\", email = \"andreas@gdamsbo.dk\", role = c(\"aut\", \"cre\"),comment = c(ORCID = \"0000-0002-7559-1154\")), person(\"Paul\", \"Egeler\", email = \"paulegeler@gmail.com\", role = c(\"aut\"), comment = c(ORCID = \"0000-0001-6948-9498\")))", + "Authors@R": "c( person(\"Andreas Gammelgaard\", \"Damsbo\", email = \"agdamsbo@clin.au.dk\", role = c(\"aut\", \"cre\"),comment = c(ORCID = \"0000-0002-7559-1154\")), person(\"Paul\", \"Egeler\", email = \"paulegeler@gmail.com\", role = c(\"aut\"), comment = c(ORCID = \"0000-0001-6948-9498\")))", "Description": "Casting metadata for REDCap database creation and handling of castellated data using repeated instruments and longitudinal projects in 'REDCap'. Keeps a focused data export approach, by allowing to only export required data from the database. Also for casting new REDCap databases based on datasets from other sources. Originally forked from the R part of 'REDCapRITS' by Paul Egeler. See . 'REDCap' (Research Electronic Data Capture) is a secure, web-based software platform designed to support data capture for research studies, providing 1) an intuitive interface for validated data capture; 2) audit trails for tracking data manipulation and export procedures; 3) automated export procedures for seamless data downloads to common statistical packages; and 4) procedures for data integration and interoperability with external sources (Harris et al (2009) ; Harris et al (2019) ).", "Depends": [ "R (>= 4.1.0)" ], "Suggests": [ + "httr", + "jsonlite", + "testthat", "Hmisc", "knitr", "rmarkdown", + "styler", "devtools", "roxygen2", "spelling", - "jsonlite", - "testthat" + "rhub", + "rsconnect", + "pkgconfig" ], "License": "GPL (>= 3)", "Encoding": "UTF-8", "LazyData": "true", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "URL": "https://github.com/agdamsbo/REDCapCAST, https://agdamsbo.github.io/REDCapCAST/", "BugReports": "https://github.com/agdamsbo/REDCapCAST/issues", "Imports": [ @@ -588,8 +593,8 @@ "VignetteBuilder": "knitr", "Collate": "'REDCapCAST-package.R' 'utils.r' 'process_user_input.r' 'REDCap_split.r' 'as_factor.R' 'as_logical.R' 'doc2dd.R' 'ds2dd_detailed.R' 'easy_redcap.R' 'export_redcap_instrument.R' 'fct_drop.R' 'html_styling.R' 'mtcars_redcap.R' 'read_redcap_instrument.R' 'read_redcap_tables.R' 'redcap_wider.R' 'redcapcast_data.R' 'redcapcast_meta.R' 'shiny_cast.R'", "NeedsCompilation": "no", - "Author": "Andreas Gammelgaard Damsbo [aut, cre] (ORCID: ), Paul Egeler [aut] (ORCID: )", - "Maintainer": "Andreas Gammelgaard Damsbo ", + "Author": "Andreas Gammelgaard Damsbo [aut, cre] (), Paul Egeler [aut] ()", + "Maintainer": "Andreas Gammelgaard Damsbo ", "Repository": "CRAN" }, "REDCapR": { @@ -643,15 +648,12 @@ }, "Rcpp": { "Package": "Rcpp", - "Version": "1.1.1", + "Version": "1.1.0", "Source": "Repository", "Title": "Seamless R and C++ Integration", - "Date": "2026-01-07", + "Date": "2025-07-01", "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Romain\", \"Francois\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"JJ\", \"Allaire\", role = \"aut\", comment = c(ORCID = \"0000-0003-0174-9868\")), person(\"Kevin\", \"Ushey\", role = \"aut\", comment = c(ORCID = \"0000-0003-2880-7407\")), person(\"Qiang\", \"Kou\", role = \"aut\", comment = c(ORCID = \"0000-0001-6786-5453\")), person(\"Nathan\", \"Russell\", role = \"aut\"), person(\"Iñaki\", \"Ucar\", role = \"aut\", comment = c(ORCID = \"0000-0001-6403-5550\")), person(\"Doug\", \"Bates\", role = \"aut\", comment = c(ORCID = \"0000-0001-8316-9503\")), person(\"John\", \"Chambers\", role = \"aut\"))", "Description": "The 'Rcpp' package provides R functions as well as C++ classes which offer a seamless integration of R and C++. Many R data types and objects can be mapped back and forth to C++ equivalents which facilitates both writing of new code as well as easier integration of third-party libraries. Documentation about 'Rcpp' is provided by several vignettes included in this package, via the 'Rcpp Gallery' site at , the paper by Eddelbuettel and Francois (2011, ), the book by Eddelbuettel (2013, ) and the paper by Eddelbuettel and Balamuta (2018, ); see 'citation(\"Rcpp\")' for details.", - "Depends": [ - "R (>= 3.5.0)" - ], "Imports": [ "methods", "utils" @@ -668,7 +670,6 @@ "MailingList": "rcpp-devel@lists.r-forge.r-project.org", "RoxygenNote": "6.1.1", "Encoding": "UTF-8", - "VignetteBuilder": "Rcpp", "NeedsCompilation": "yes", "Author": "Dirk Eddelbuettel [aut, cre] (ORCID: ), Romain Francois [aut] (ORCID: ), JJ Allaire [aut] (ORCID: ), Kevin Ushey [aut] (ORCID: ), Qiang Kou [aut] (ORCID: ), Nathan Russell [aut], Iñaki Ucar [aut] (ORCID: ), Doug Bates [aut] (ORCID: ), John Chambers [aut]", "Maintainer": "Dirk Eddelbuettel ", @@ -676,11 +677,11 @@ }, "RcppArmadillo": { "Package": "RcppArmadillo", - "Version": "15.2.3-1", + "Version": "15.2.2-1", "Source": "Repository", "Type": "Package", "Title": "'Rcpp' Integration for the 'Armadillo' Templated Linear Algebra Library", - "Date": "2025-12-16", + "Date": "2025-11-21", "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Romain\", \"Francois\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Doug\", \"Bates\", role = \"aut\", comment = c(ORCID = \"0000-0001-8316-9503\")), person(\"Binxiang\", \"Ni\", role = \"aut\"), person(\"Conrad\", \"Sanderson\", role = \"aut\", comment = c(ORCID = \"0000-0002-0049-4501\")))", "Description": "'Armadillo' is a templated C++ linear algebra library aiming towards a good balance between speed and ease of use. It provides high-level syntax and functionality deliberately similar to Matlab. It is useful for algorithm development directly in C++, or quick conversion of research code into production environments. It provides efficient classes for vectors, matrices and cubes where dense and sparse matrices are supported. Integer, floating point and complex numbers are supported. A sophisticated expression evaluator (based on template meta-programming) automatically combines several operations to increase speed and efficiency. Dynamic evaluation automatically chooses optimal code paths based on detected matrix structures. Matrix decompositions are provided through integration with LAPACK, or one of its high performance drop-in replacements (such as 'MKL' or 'OpenBLAS'). It can automatically use 'OpenMP' multi-threading (parallelisation) to speed up computationally expensive operations. . The 'RcppArmadillo' package includes the header files from the 'Armadillo' library; users do not need to install 'Armadillo' itself in order to use 'RcppArmadillo'. Starting from release 15.0.0, the minimum compilation standard is C++14 so 'Armadillo' version 14.6.3 is included as a fallback when an R package forces the C++11 standard. Package authors should set a '#define' to select the 'current' version, or select the 'legacy' version (also chosen as default) if they must. See 'GitHub issue #475' for details. . Since release 7.800.0, 'Armadillo' is licensed under Apache License 2; previous releases were under licensed as MPL 2.0 from version 3.800.0 onwards and LGPL-3 prior to that; 'RcppArmadillo' (the 'Rcpp' bindings/bridge to Armadillo) is licensed under the GNU GPL version 2 or later, as is the rest of 'Rcpp'.", "License": "GPL (>= 2)", @@ -751,13 +752,13 @@ }, "Rdpack": { "Package": "Rdpack", - "Version": "2.6.6", + "Version": "2.6.4", "Source": "Repository", "Type": "Package", "Title": "Update and Manipulate Rd Documentation Objects", "Authors@R": "c( person(given = c(\"Georgi\", \"N.\"), family = \"Boshnakov\", role = c(\"aut\", \"cre\"), email = \"georgi.boshnakov@manchester.ac.uk\", comment = c(ORCID = \"0000-0003-2839-346X\")), person(given = \"Duncan\", family = \"Murdoch\", role = \"ctb\", email = \"murdoch.duncan@gmail.com\") )", "Description": "Functions for manipulation of R documentation objects, including functions reprompt() and ereprompt() for updating 'Rd' documentation for functions, methods and classes; 'Rd' macros for citations and import of references from 'bibtex' files for use in 'Rd' files and 'roxygen2' comments; 'Rd' macros for evaluating and inserting snippets of 'R' code and the results of its evaluation or creating graphics on the fly; and many functions for manipulation of references and Rd files.", - "URL": "https://geobosh.github.io/Rdpack/ (doc), https://CRAN.R-project.org/package=Rdpack", + "URL": "https://geobosh.github.io/Rdpack/ (doc), https://github.com/GeoBosh/Rdpack (devel)", "BugReports": "https://github.com/GeoBosh/Rdpack/issues", "Depends": [ "R (>= 2.15.0)", @@ -766,7 +767,7 @@ "Imports": [ "tools", "utils", - "rbibutils (> 2.4)" + "rbibutils (>= 1.3)" ], "Suggests": [ "grDevices", @@ -777,10 +778,9 @@ ], "License": "GPL (>= 2)", "LazyLoad": "yes", - "Encoding": "UTF-8", "RoxygenNote": "7.1.1", "NeedsCompilation": "no", - "Author": "Georgi N. Boshnakov [aut, cre] (ORCID: ), Duncan Murdoch [ctb]", + "Author": "Georgi N. Boshnakov [aut, cre] (), Duncan Murdoch [ctb]", "Maintainer": "Georgi N. Boshnakov ", "Repository": "CRAN" }, @@ -903,7 +903,7 @@ }, "apexcharter": { "Package": "apexcharter", - "Version": "0.4.5", + "Version": "0.4.4", "Source": "Repository", "Title": "Create Interactive Chart with the JavaScript 'ApexCharts' Library", "Description": "Provides an 'htmlwidgets' interface to 'apexcharts.js'. 'Apexcharts' is a modern JavaScript charting library to build interactive charts and visualizations with simple API. 'Apexcharts' examples and documentation are available here: .", @@ -931,7 +931,7 @@ "rmarkdown", "covr" ], - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "URL": "https://github.com/dreamRs/apexcharter, https://dreamrs.github.io/apexcharter/", "BugReports": "https://github.com/dreamRs/apexcharter/issues", "VignetteBuilder": "knitr", @@ -1011,11 +1011,10 @@ }, "base64enc": { "Package": "base64enc", - "Version": "0.1-6", + "Version": "0.1-3", "Source": "Repository", - "Title": "Tools for 'base64' Encoding", - "Author": "Simon Urbanek [aut, cre, cph] (https://urbanek.nz, ORCID: )", - "Authors@R": "person(\"Simon\", \"Urbanek\", role=c(\"aut\",\"cre\",\"cph\"), email=\"Simon.Urbanek@r-project.org\", comment=c(\"https://urbanek.nz\", ORCID=\"0000-0003-2297-1732\"))", + "Title": "Tools for base64 encoding", + "Author": "Simon Urbanek ", "Maintainer": "Simon Urbanek ", "Depends": [ "R (>= 2.9.0)" @@ -1023,10 +1022,9 @@ "Enhances": [ "png" ], - "Description": "Tools for handling 'base64' encoding. It is more flexible than the orphaned 'base64' package.", + "Description": "This package provides tools for handling base64 encoding. It is more flexible than the orphaned base64 package.", "License": "GPL-2 | GPL-3", - "URL": "https://www.rforge.net/base64enc", - "BugReports": "https://github.com/s-u/base64enc/issues", + "URL": "http://www.rforge.net/base64enc", "NeedsCompilation": "yes", "Repository": "CRAN" }, @@ -1275,7 +1273,7 @@ }, "broom": { "Package": "broom", - "Version": "1.0.12", + "Version": "1.0.11", "Source": "Repository", "Type": "Package", "Title": "Convert Statistical Objects into Tidy Tibbles", @@ -1526,7 +1524,7 @@ }, "bslib": { "Package": "bslib", - "Version": "0.10.0", + "Version": "0.9.0", "Source": "Repository", "Title": "Custom 'Bootstrap' 'Sass' Themes for 'shiny' and 'rmarkdown'", "Authors@R": "c( person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Garrick\", \"Aden-Buie\", , \"garrick@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Javi\", \"Aguilar\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap colorpicker library\"), person(\"Thomas\", \"Park\", role = c(\"ctb\", \"cph\"), comment = \"Bootswatch library\"), person(, \"PayPal\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap accessibility plugin\") )", @@ -1552,18 +1550,16 @@ "sass (>= 0.4.9)" ], "Suggests": [ - "brand.yml", "bsicons", "curl", "fontawesome", "future", "ggplot2", "knitr", - "lattice", "magrittr", "rappdirs", "rmarkdown (>= 2.7)", - "shiny (>= 1.11.1)", + "shiny (> 1.8.1)", "testthat", "thematic", "tools", @@ -1578,10 +1574,10 @@ "Config/testthat/parallel": "true", "Config/testthat/start-first": "zzzz-bs-sass, fonts, zzz-precompile, theme-*, rmd-*", "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", - "Collate": "'accordion.R' 'breakpoints.R' 'bs-current-theme.R' 'bs-dependencies.R' 'bs-global.R' 'bs-remove.R' 'bs-theme-layers.R' 'bs-theme-preset-bootswatch.R' 'bs-theme-preset-brand.R' 'bs-theme-preset-builtin.R' 'bs-theme-preset.R' 'utils.R' 'bs-theme-preview.R' 'bs-theme-update.R' 'bs-theme.R' 'bslib-package.R' 'buttons.R' 'card.R' 'deprecated.R' 'files.R' 'fill.R' 'imports.R' 'input-code-editor.R' 'input-dark-mode.R' 'input-submit.R' 'input-switch.R' 'layout.R' 'nav-items.R' 'nav-update.R' 'navbar_options.R' 'navs-legacy.R' 'navs.R' 'onLoad.R' 'page.R' 'popover.R' 'precompiled.R' 'print.R' 'shiny-devmode.R' 'sidebar.R' 'staticimports.R' 'toast.R' 'tooltip.R' 'utils-deps.R' 'utils-shiny.R' 'utils-tags.R' 'value-box.R' 'version-default.R' 'versions.R'", + "RoxygenNote": "7.3.2", + "Collate": "'accordion.R' 'breakpoints.R' 'bs-current-theme.R' 'bs-dependencies.R' 'bs-global.R' 'bs-remove.R' 'bs-theme-layers.R' 'bs-theme-preset-bootswatch.R' 'bs-theme-preset-brand.R' 'bs-theme-preset-builtin.R' 'bs-theme-preset.R' 'utils.R' 'bs-theme-preview.R' 'bs-theme-update.R' 'bs-theme.R' 'bslib-package.R' 'buttons.R' 'card.R' 'deprecated.R' 'files.R' 'fill.R' 'imports.R' 'input-dark-mode.R' 'input-switch.R' 'layout.R' 'nav-items.R' 'nav-update.R' 'navbar_options.R' 'navs-legacy.R' 'navs.R' 'onLoad.R' 'page.R' 'popover.R' 'precompiled.R' 'print.R' 'shiny-devmode.R' 'sidebar.R' 'staticimports.R' 'tooltip.R' 'utils-deps.R' 'utils-shiny.R' 'utils-tags.R' 'value-box.R' 'version-default.R' 'versions.R'", "NeedsCompilation": "no", - "Author": "Carson Sievert [aut, cre] (ORCID: ), Joe Cheng [aut], Garrick Aden-Buie [aut] (ORCID: ), Posit Software, PBC [cph, fnd], Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Javi Aguilar [ctb, cph] (Bootstrap colorpicker library), Thomas Park [ctb, cph] (Bootswatch library), PayPal [ctb, cph] (Bootstrap accessibility plugin)", + "Author": "Carson Sievert [aut, cre] (), Joe Cheng [aut], Garrick Aden-Buie [aut] (), Posit Software, PBC [cph, fnd], Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Javi Aguilar [ctb, cph] (Bootstrap colorpicker library), Thomas Park [ctb, cph] (Bootswatch library), PayPal [ctb, cph] (Bootstrap accessibility plugin)", "Maintainer": "Carson Sievert ", "Repository": "CRAN" }, @@ -1710,7 +1706,7 @@ }, "cardx": { "Package": "cardx", - "Version": "0.3.2", + "Version": "0.3.1", "Source": "Repository", "Title": "Extra Analysis Results Data Utilities", "Authors@R": "c( person(\"Daniel D.\", \"Sjoberg\", , \"danield.sjoberg@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-0862-2018\")), person(\"Abinaya\", \"Yogasekaram\", , \"abinaya.yogasekaram@contractors.roche.com\", role = \"aut\"), person(\"Emily\", \"de la Rua\", , \"emily.de_la_rua@contractors.roche.com\", role = \"aut\"), person(\"Malcolm\", \"Barrett\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0299-5825\")), person(\"F. Hoffmann-La Roche AG\", role = c(\"cph\", \"fnd\")) )", @@ -1724,7 +1720,7 @@ "Imports": [ "cards (>= 0.7.0)", "cli (>= 3.6.1)", - "dplyr (>= 1.2.0)", + "dplyr (>= 1.1.2)", "glue (>= 1.6.2)", "lifecycle (>= 1.0.3)", "rlang (>= 1.1.1)", @@ -1792,7 +1788,7 @@ }, "checkmate": { "Package": "checkmate", - "Version": "2.3.4", + "Version": "2.3.3", "Source": "Repository", "Type": "Package", "Title": "Fast and Versatile Argument Checks", @@ -1827,7 +1823,7 @@ ], "License": "BSD_3_clause + file LICENSE", "VignetteBuilder": "knitr", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "Collate": "'AssertCollection.R' 'allMissing.R' 'anyInfinite.R' 'anyMissing.R' 'anyNaN.R' 'asInteger.R' 'assert.R' 'helper.R' 'makeExpectation.R' 'makeTest.R' 'makeAssertion.R' 'checkAccess.R' 'checkArray.R' 'checkAtomic.R' 'checkAtomicVector.R' 'checkCharacter.R' 'checkChoice.R' 'checkClass.R' 'checkComplex.R' 'checkCount.R' 'checkDataFrame.R' 'checkDataTable.R' 'checkDate.R' 'checkDirectoryExists.R' 'checkDisjunct.R' 'checkDouble.R' 'checkEnvironment.R' 'checkFALSE.R' 'checkFactor.R' 'checkFileExists.R' 'checkFlag.R' 'checkFormula.R' 'checkFunction.R' 'checkInt.R' 'checkInteger.R' 'checkIntegerish.R' 'checkList.R' 'checkLogical.R' 'checkMatrix.R' 'checkMultiClass.R' 'checkNamed.R' 'checkNames.R' 'checkNull.R' 'checkNumber.R' 'checkNumeric.R' 'checkOS.R' 'checkPOSIXct.R' 'checkPathForOutput.R' 'checkPermutation.R' 'checkR6.R' 'checkRaw.R' 'checkScalar.R' 'checkScalarNA.R' 'checkSetEqual.R' 'checkString.R' 'checkSubset.R' 'checkTRUE.R' 'checkTibble.R' 'checkVector.R' 'coalesce.R' 'isIntegerish.R' 'matchArg.R' 'qassert.R' 'qassertr.R' 'vname.R' 'wfwl.R' 'zzz.R'", "Author": "Michel Lang [cre, aut] (ORCID: ), Bernd Bischl [ctb], Dénes Tóth [ctb] (ORCID: )", "Maintainer": "Michel Lang ", @@ -1975,10 +1971,10 @@ }, "cluster": { "Package": "cluster", - "Version": "2.1.8.2", + "Version": "2.1.8.1", "Source": "Repository", - "VersionNote": "Last CRAN: 2.1.8.1 on 2025-03-11; 2.1.8 on 2024-12-10; 2.1.7 on 2024-12-06; 2.1.6 on 2023-11-30;", - "Date": "2026-02-03", + "VersionNote": "Last CRAN: 2.1.8 on 2024-12-10; 2.1.7 on 2024-12-06; 2.1.6 on 2023-11-30; 2.1.5 on 2023-11-27", + "Date": "2025-03-11", "Priority": "recommended", "Title": "\"Finding Groups in Data\": Cluster Analysis Extended Rousseeuw et al.", "Description": "Methods for Cluster analysis. Much extended the original from Peter Rousseeuw, Anja Struyf and Mia Hubert, based on Kaufman and Rousseeuw (1990) \"Finding Groups in Data\".", @@ -2012,7 +2008,7 @@ "License": "GPL (>= 2)", "URL": "https://svn.r-project.org/R-packages/trunk/cluster/", "NeedsCompilation": "yes", - "Author": "Martin Maechler [aut, cre] (ORCID: ), Peter Rousseeuw [aut] (Fortran original, ORCID: ), Anja Struyf [aut] (S original), Mia Hubert [aut] (S original, ORCID: ), Kurt Hornik [trl, ctb] (port to R; maintenance(1999-2000), ORCID: ), Matthias Studer [ctb], Pierre Roudier [ctb], Juan Gonzalez [ctb], Kamil Kozlowski [ctb], Erich Schubert [ctb] (fastpam options for pam(), ORCID: ), Keefe Murphy [ctb] (volume.ellipsoid({d >= 3}))", + "Author": "Martin Maechler [aut, cre] (), Peter Rousseeuw [aut] (Fortran original, ), Anja Struyf [aut] (S original), Mia Hubert [aut] (S original, ), Kurt Hornik [trl, ctb] (port to R; maintenance(1999-2000), ), Matthias Studer [ctb], Pierre Roudier [ctb], Juan Gonzalez [ctb], Kamil Kozlowski [ctb], Erich Schubert [ctb] (fastpam options for pam(), ), Keefe Murphy [ctb] (volume.ellipsoid({d >= 3}))", "Repository": "CRAN" }, "codetools": { @@ -2170,7 +2166,7 @@ }, "cpp11": { "Package": "cpp11", - "Version": "0.5.3", + "Version": "0.5.2", "Source": "Repository", "Title": "A C++11 Interface for R's C Interface", "Authors@R": "c( person(\"Davis\", \"Vaughan\", email = \"davis@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4777-038X\")), person(\"Jim\",\"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Romain\", \"François\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Benjamin\", \"Kietzman\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", @@ -2211,7 +2207,7 @@ "Encoding": "UTF-8", "RoxygenNote": "7.3.2", "NeedsCompilation": "no", - "Author": "Davis Vaughan [aut, cre] (ORCID: ), Jim Hester [aut] (ORCID: ), Romain François [aut] (ORCID: ), Benjamin Kietzman [ctb], Posit Software, PBC [cph, fnd]", + "Author": "Davis Vaughan [aut, cre] (), Jim Hester [aut] (), Romain François [aut] (), Benjamin Kietzman [ctb], Posit Software, PBC [cph, fnd]", "Maintainer": "Davis Vaughan ", "Repository": "CRAN" }, @@ -2313,11 +2309,11 @@ }, "data.table": { "Package": "data.table", - "Version": "1.18.2.1", + "Version": "1.17.8", "Source": "Repository", "Title": "Extension of `data.frame`", "Depends": [ - "R (>= 3.4.0)" + "R (>= 3.3.0)" ], "Imports": [ "methods" @@ -2325,7 +2321,7 @@ "Suggests": [ "bit64 (>= 4.0.0)", "bit (>= 4.0.4)", - "R.utils (>= 2.13.0)", + "R.utils", "xts", "zoo (>= 1.8-1)", "yaml", @@ -2339,9 +2335,9 @@ "VignetteBuilder": "knitr", "Encoding": "UTF-8", "ByteCompile": "TRUE", - "Authors@R": "c( person(\"Tyson\",\"Barrett\", role=c(\"aut\",\"cre\"), email=\"t.barrett88@gmail.com\", comment = c(ORCID=\"0000-0002-2137-1391\")), person(\"Matt\",\"Dowle\", role=\"aut\", email=\"mattjdowle@gmail.com\"), person(\"Arun\",\"Srinivasan\", role=\"aut\", email=\"asrini@pm.me\"), person(\"Jan\",\"Gorecki\", role=\"aut\", email=\"j.gorecki@wit.edu.pl\"), person(\"Michael\",\"Chirico\", role=\"aut\", email=\"michaelchirico4@gmail.com\", comment = c(ORCID=\"0000-0003-0787-087X\")), person(\"Toby\",\"Hocking\", role=\"aut\", email=\"toby.hocking@r-project.org\", comment = c(ORCID=\"0000-0002-3146-0865\")), person(\"Benjamin\",\"Schwendinger\",role=\"aut\", comment = c(ORCID=\"0000-0003-3315-8114\")), person(\"Ivan\", \"Krylov\", role=\"aut\", email=\"ikrylov@disroot.org\", comment = c(ORCID=\"0000-0002-0172-3812\")), person(\"Pasha\",\"Stetsenko\", role=\"ctb\"), person(\"Tom\",\"Short\", role=\"ctb\"), person(\"Steve\",\"Lianoglou\", role=\"ctb\"), person(\"Eduard\",\"Antonyan\", role=\"ctb\"), person(\"Markus\",\"Bonsch\", role=\"ctb\"), person(\"Hugh\",\"Parsonage\", role=\"ctb\"), person(\"Scott\",\"Ritchie\", role=\"ctb\"), person(\"Kun\",\"Ren\", role=\"ctb\"), person(\"Xianying\",\"Tan\", role=\"ctb\"), person(\"Rick\",\"Saporta\", role=\"ctb\"), person(\"Otto\",\"Seiskari\", role=\"ctb\"), person(\"Xianghui\",\"Dong\", role=\"ctb\"), person(\"Michel\",\"Lang\", role=\"ctb\"), person(\"Watal\",\"Iwasaki\", role=\"ctb\"), person(\"Seth\",\"Wenchel\", role=\"ctb\"), person(\"Karl\",\"Broman\", role=\"ctb\"), person(\"Tobias\",\"Schmidt\", role=\"ctb\"), person(\"David\",\"Arenburg\", role=\"ctb\"), person(\"Ethan\",\"Smith\", role=\"ctb\"), person(\"Francois\",\"Cocquemas\", role=\"ctb\"), person(\"Matthieu\",\"Gomez\", role=\"ctb\"), person(\"Philippe\",\"Chataignon\", role=\"ctb\"), person(\"Nello\",\"Blaser\", role=\"ctb\"), person(\"Dmitry\",\"Selivanov\", role=\"ctb\"), person(\"Andrey\",\"Riabushenko\", role=\"ctb\"), person(\"Cheng\",\"Lee\", role=\"ctb\"), person(\"Declan\",\"Groves\", role=\"ctb\"), person(\"Daniel\",\"Possenriede\", role=\"ctb\"), person(\"Felipe\",\"Parages\", role=\"ctb\"), person(\"Denes\",\"Toth\", role=\"ctb\"), person(\"Mus\",\"Yaramaz-David\", role=\"ctb\"), person(\"Ayappan\",\"Perumal\", role=\"ctb\"), person(\"James\",\"Sams\", role=\"ctb\"), person(\"Martin\",\"Morgan\", role=\"ctb\"), person(\"Michael\",\"Quinn\", role=\"ctb\"), person(given=\"@javrucebo\", role=\"ctb\", comment=\"GitHub user\"), person(\"Marc\",\"Halperin\", role=\"ctb\"), person(\"Roy\",\"Storey\", role=\"ctb\"), person(\"Manish\",\"Saraswat\", role=\"ctb\"), person(\"Morgan\",\"Jacob\", role=\"ctb\"), person(\"Michael\",\"Schubmehl\", role=\"ctb\"), person(\"Davis\",\"Vaughan\", role=\"ctb\"), person(\"Leonardo\",\"Silvestri\", role=\"ctb\"), person(\"Jim\",\"Hester\", role=\"ctb\"), person(\"Anthony\",\"Damico\", role=\"ctb\"), person(\"Sebastian\",\"Freundt\", role=\"ctb\"), person(\"David\",\"Simons\", role=\"ctb\"), person(\"Elliott\",\"Sales de Andrade\", role=\"ctb\"), person(\"Cole\",\"Miller\", role=\"ctb\"), person(\"Jens Peder\",\"Meldgaard\", role=\"ctb\"), person(\"Vaclav\",\"Tlapak\", role=\"ctb\"), person(\"Kevin\",\"Ushey\", role=\"ctb\"), person(\"Dirk\",\"Eddelbuettel\", role=\"ctb\"), person(\"Tony\",\"Fischetti\", role=\"ctb\"), person(\"Ofek\",\"Shilon\", role=\"ctb\"), person(\"Vadim\",\"Khotilovich\", role=\"ctb\"), person(\"Hadley\",\"Wickham\", role=\"ctb\"), person(\"Bennet\",\"Becker\", role=\"ctb\"), person(\"Kyle\",\"Haynes\", role=\"ctb\"), person(\"Boniface Christian\",\"Kamgang\", role=\"ctb\"), person(\"Olivier\",\"Delmarcell\", role=\"ctb\"), person(\"Josh\",\"O'Brien\", role=\"ctb\"), person(\"Dereck\",\"de Mezquita\", role=\"ctb\"), person(\"Michael\",\"Czekanski\", role=\"ctb\"), person(\"Dmitry\", \"Shemetov\", role=\"ctb\"), person(\"Nitish\", \"Jha\", role=\"ctb\"), person(\"Joshua\", \"Wu\", role=\"ctb\"), person(\"Iago\", \"Giné-Vázquez\", role=\"ctb\"), person(\"Anirban\", \"Chetia\", role=\"ctb\"), person(\"Doris\", \"Amoakohene\", role=\"ctb\"), person(\"Angel\", \"Feliz\", role=\"ctb\"), person(\"Michael\",\"Young\", role=\"ctb\"), person(\"Mark\", \"Seeto\", role=\"ctb\"), person(\"Philippe\", \"Grosjean\", role=\"ctb\"), person(\"Vincent\", \"Runge\", role=\"ctb\"), person(\"Christian\", \"Wia\", role=\"ctb\"), person(\"Elise\", \"Maigné\", role=\"ctb\"), person(\"Vincent\", \"Rocher\", role=\"ctb\"), person(\"Vijay\", \"Lulla\", role=\"ctb\"), person(\"Aljaž\", \"Sluga\", role=\"ctb\"), person(\"Bill\", \"Evans\", role=\"ctb\"), person(\"Reino\", \"Bruner\", role=\"ctb\"), person(given=\"@badasahog\", role=\"ctb\", comment=\"GitHub user\"), person(\"Vinit\", \"Thakur\", role=\"ctb\"), person(\"Mukul\", \"Kumar\", role=\"ctb\"), person(\"Ildikó\", \"Czeller\", role=\"ctb\"), person(\"Manmita\", \"Das\", role=\"ctb\") )", + "Authors@R": "c( person(\"Tyson\",\"Barrett\", role=c(\"aut\",\"cre\"), email=\"t.barrett88@gmail.com\", comment = c(ORCID=\"0000-0002-2137-1391\")), person(\"Matt\",\"Dowle\", role=\"aut\", email=\"mattjdowle@gmail.com\"), person(\"Arun\",\"Srinivasan\", role=\"aut\", email=\"asrini@pm.me\"), person(\"Jan\",\"Gorecki\", role=\"aut\"), person(\"Michael\",\"Chirico\", role=\"aut\", comment = c(ORCID=\"0000-0003-0787-087X\")), person(\"Toby\",\"Hocking\", role=\"aut\", comment = c(ORCID=\"0000-0002-3146-0865\")), person(\"Benjamin\",\"Schwendinger\",role=\"aut\", comment = c(ORCID=\"0000-0003-3315-8114\")), person(\"Ivan\", \"Krylov\", role=\"aut\", email=\"ikrylov@disroot.org\", comment = c(ORCID=\"0000-0002-0172-3812\")), person(\"Pasha\",\"Stetsenko\", role=\"ctb\"), person(\"Tom\",\"Short\", role=\"ctb\"), person(\"Steve\",\"Lianoglou\", role=\"ctb\"), person(\"Eduard\",\"Antonyan\", role=\"ctb\"), person(\"Markus\",\"Bonsch\", role=\"ctb\"), person(\"Hugh\",\"Parsonage\", role=\"ctb\"), person(\"Scott\",\"Ritchie\", role=\"ctb\"), person(\"Kun\",\"Ren\", role=\"ctb\"), person(\"Xianying\",\"Tan\", role=\"ctb\"), person(\"Rick\",\"Saporta\", role=\"ctb\"), person(\"Otto\",\"Seiskari\", role=\"ctb\"), person(\"Xianghui\",\"Dong\", role=\"ctb\"), person(\"Michel\",\"Lang\", role=\"ctb\"), person(\"Watal\",\"Iwasaki\", role=\"ctb\"), person(\"Seth\",\"Wenchel\", role=\"ctb\"), person(\"Karl\",\"Broman\", role=\"ctb\"), person(\"Tobias\",\"Schmidt\", role=\"ctb\"), person(\"David\",\"Arenburg\", role=\"ctb\"), person(\"Ethan\",\"Smith\", role=\"ctb\"), person(\"Francois\",\"Cocquemas\", role=\"ctb\"), person(\"Matthieu\",\"Gomez\", role=\"ctb\"), person(\"Philippe\",\"Chataignon\", role=\"ctb\"), person(\"Nello\",\"Blaser\", role=\"ctb\"), person(\"Dmitry\",\"Selivanov\", role=\"ctb\"), person(\"Andrey\",\"Riabushenko\", role=\"ctb\"), person(\"Cheng\",\"Lee\", role=\"ctb\"), person(\"Declan\",\"Groves\", role=\"ctb\"), person(\"Daniel\",\"Possenriede\", role=\"ctb\"), person(\"Felipe\",\"Parages\", role=\"ctb\"), person(\"Denes\",\"Toth\", role=\"ctb\"), person(\"Mus\",\"Yaramaz-David\", role=\"ctb\"), person(\"Ayappan\",\"Perumal\", role=\"ctb\"), person(\"James\",\"Sams\", role=\"ctb\"), person(\"Martin\",\"Morgan\", role=\"ctb\"), person(\"Michael\",\"Quinn\", role=\"ctb\"), person(\"@javrucebo\",\"\", role=\"ctb\"), person(\"@marc-outins\",\"\", role=\"ctb\"), person(\"Roy\",\"Storey\", role=\"ctb\"), person(\"Manish\",\"Saraswat\", role=\"ctb\"), person(\"Morgan\",\"Jacob\", role=\"ctb\"), person(\"Michael\",\"Schubmehl\", role=\"ctb\"), person(\"Davis\",\"Vaughan\", role=\"ctb\"), person(\"Leonardo\",\"Silvestri\", role=\"ctb\"), person(\"Jim\",\"Hester\", role=\"ctb\"), person(\"Anthony\",\"Damico\", role=\"ctb\"), person(\"Sebastian\",\"Freundt\", role=\"ctb\"), person(\"David\",\"Simons\", role=\"ctb\"), person(\"Elliott\",\"Sales de Andrade\", role=\"ctb\"), person(\"Cole\",\"Miller\", role=\"ctb\"), person(\"Jens Peder\",\"Meldgaard\", role=\"ctb\"), person(\"Vaclav\",\"Tlapak\", role=\"ctb\"), person(\"Kevin\",\"Ushey\", role=\"ctb\"), person(\"Dirk\",\"Eddelbuettel\", role=\"ctb\"), person(\"Tony\",\"Fischetti\", role=\"ctb\"), person(\"Ofek\",\"Shilon\", role=\"ctb\"), person(\"Vadim\",\"Khotilovich\", role=\"ctb\"), person(\"Hadley\",\"Wickham\", role=\"ctb\"), person(\"Bennet\",\"Becker\", role=\"ctb\"), person(\"Kyle\",\"Haynes\", role=\"ctb\"), person(\"Boniface Christian\",\"Kamgang\", role=\"ctb\"), person(\"Olivier\",\"Delmarcell\", role=\"ctb\"), person(\"Josh\",\"O'Brien\", role=\"ctb\"), person(\"Dereck\",\"de Mezquita\", role=\"ctb\"), person(\"Michael\",\"Czekanski\", role=\"ctb\"), person(\"Dmitry\", \"Shemetov\", role=\"ctb\"), person(\"Nitish\", \"Jha\", role=\"ctb\"), person(\"Joshua\", \"Wu\", role=\"ctb\"), person(\"Iago\", \"Giné-Vázquez\", role=\"ctb\"), person(\"Anirban\", \"Chetia\", role=\"ctb\"), person(\"Doris\", \"Amoakohene\", role=\"ctb\"), person(\"Angel\", \"Feliz\", role=\"ctb\"), person(\"Michael\",\"Young\", role=\"ctb\"), person(\"Mark\", \"Seeto\", role=\"ctb\"), person(\"Philippe\", \"Grosjean\", role=\"ctb\"), person(\"Vincent\", \"Runge\", role=\"ctb\"), person(\"Christian\", \"Wia\", role=\"ctb\"), person(\"Elise\", \"Maigné\", role=\"ctb\"), person(\"Vincent\", \"Rocher\", role=\"ctb\"), person(\"Vijay\", \"Lulla\", role=\"ctb\"), person(\"Aljaž\", \"Sluga\", role=\"ctb\"), person(\"Bill\", \"Evans\", role=\"ctb\") )", "NeedsCompilation": "yes", - "Author": "Tyson Barrett [aut, cre] (ORCID: ), Matt Dowle [aut], Arun Srinivasan [aut], Jan Gorecki [aut], Michael Chirico [aut] (ORCID: ), Toby Hocking [aut] (ORCID: ), Benjamin Schwendinger [aut] (ORCID: ), Ivan Krylov [aut] (ORCID: ), Pasha Stetsenko [ctb], Tom Short [ctb], Steve Lianoglou [ctb], Eduard Antonyan [ctb], Markus Bonsch [ctb], Hugh Parsonage [ctb], Scott Ritchie [ctb], Kun Ren [ctb], Xianying Tan [ctb], Rick Saporta [ctb], Otto Seiskari [ctb], Xianghui Dong [ctb], Michel Lang [ctb], Watal Iwasaki [ctb], Seth Wenchel [ctb], Karl Broman [ctb], Tobias Schmidt [ctb], David Arenburg [ctb], Ethan Smith [ctb], Francois Cocquemas [ctb], Matthieu Gomez [ctb], Philippe Chataignon [ctb], Nello Blaser [ctb], Dmitry Selivanov [ctb], Andrey Riabushenko [ctb], Cheng Lee [ctb], Declan Groves [ctb], Daniel Possenriede [ctb], Felipe Parages [ctb], Denes Toth [ctb], Mus Yaramaz-David [ctb], Ayappan Perumal [ctb], James Sams [ctb], Martin Morgan [ctb], Michael Quinn [ctb], @javrucebo [ctb] (GitHub user), Marc Halperin [ctb], Roy Storey [ctb], Manish Saraswat [ctb], Morgan Jacob [ctb], Michael Schubmehl [ctb], Davis Vaughan [ctb], Leonardo Silvestri [ctb], Jim Hester [ctb], Anthony Damico [ctb], Sebastian Freundt [ctb], David Simons [ctb], Elliott Sales de Andrade [ctb], Cole Miller [ctb], Jens Peder Meldgaard [ctb], Vaclav Tlapak [ctb], Kevin Ushey [ctb], Dirk Eddelbuettel [ctb], Tony Fischetti [ctb], Ofek Shilon [ctb], Vadim Khotilovich [ctb], Hadley Wickham [ctb], Bennet Becker [ctb], Kyle Haynes [ctb], Boniface Christian Kamgang [ctb], Olivier Delmarcell [ctb], Josh O'Brien [ctb], Dereck de Mezquita [ctb], Michael Czekanski [ctb], Dmitry Shemetov [ctb], Nitish Jha [ctb], Joshua Wu [ctb], Iago Giné-Vázquez [ctb], Anirban Chetia [ctb], Doris Amoakohene [ctb], Angel Feliz [ctb], Michael Young [ctb], Mark Seeto [ctb], Philippe Grosjean [ctb], Vincent Runge [ctb], Christian Wia [ctb], Elise Maigné [ctb], Vincent Rocher [ctb], Vijay Lulla [ctb], Aljaž Sluga [ctb], Bill Evans [ctb], Reino Bruner [ctb], @badasahog [ctb] (GitHub user), Vinit Thakur [ctb], Mukul Kumar [ctb], Ildikó Czeller [ctb], Manmita Das [ctb]", + "Author": "Tyson Barrett [aut, cre] (ORCID: ), Matt Dowle [aut], Arun Srinivasan [aut], Jan Gorecki [aut], Michael Chirico [aut] (ORCID: ), Toby Hocking [aut] (ORCID: ), Benjamin Schwendinger [aut] (ORCID: ), Ivan Krylov [aut] (ORCID: ), Pasha Stetsenko [ctb], Tom Short [ctb], Steve Lianoglou [ctb], Eduard Antonyan [ctb], Markus Bonsch [ctb], Hugh Parsonage [ctb], Scott Ritchie [ctb], Kun Ren [ctb], Xianying Tan [ctb], Rick Saporta [ctb], Otto Seiskari [ctb], Xianghui Dong [ctb], Michel Lang [ctb], Watal Iwasaki [ctb], Seth Wenchel [ctb], Karl Broman [ctb], Tobias Schmidt [ctb], David Arenburg [ctb], Ethan Smith [ctb], Francois Cocquemas [ctb], Matthieu Gomez [ctb], Philippe Chataignon [ctb], Nello Blaser [ctb], Dmitry Selivanov [ctb], Andrey Riabushenko [ctb], Cheng Lee [ctb], Declan Groves [ctb], Daniel Possenriede [ctb], Felipe Parages [ctb], Denes Toth [ctb], Mus Yaramaz-David [ctb], Ayappan Perumal [ctb], James Sams [ctb], Martin Morgan [ctb], Michael Quinn [ctb], @javrucebo [ctb], @marc-outins [ctb], Roy Storey [ctb], Manish Saraswat [ctb], Morgan Jacob [ctb], Michael Schubmehl [ctb], Davis Vaughan [ctb], Leonardo Silvestri [ctb], Jim Hester [ctb], Anthony Damico [ctb], Sebastian Freundt [ctb], David Simons [ctb], Elliott Sales de Andrade [ctb], Cole Miller [ctb], Jens Peder Meldgaard [ctb], Vaclav Tlapak [ctb], Kevin Ushey [ctb], Dirk Eddelbuettel [ctb], Tony Fischetti [ctb], Ofek Shilon [ctb], Vadim Khotilovich [ctb], Hadley Wickham [ctb], Bennet Becker [ctb], Kyle Haynes [ctb], Boniface Christian Kamgang [ctb], Olivier Delmarcell [ctb], Josh O'Brien [ctb], Dereck de Mezquita [ctb], Michael Czekanski [ctb], Dmitry Shemetov [ctb], Nitish Jha [ctb], Joshua Wu [ctb], Iago Giné-Vázquez [ctb], Anirban Chetia [ctb], Doris Amoakohene [ctb], Angel Feliz [ctb], Michael Young [ctb], Mark Seeto [ctb], Philippe Grosjean [ctb], Vincent Runge [ctb], Christian Wia [ctb], Elise Maigné [ctb], Vincent Rocher [ctb], Vijay Lulla [ctb], Aljaž Sluga [ctb], Bill Evans [ctb]", "Maintainer": "Tyson Barrett ", "Repository": "CRAN" }, @@ -2607,7 +2603,7 @@ }, "dplyr": { "Package": "dplyr", - "Version": "1.2.0", + "Version": "1.1.4", "Source": "Repository", "Type": "Package", "Title": "A Grammar of Data Manipulation", @@ -2617,25 +2613,27 @@ "URL": "https://dplyr.tidyverse.org, https://github.com/tidyverse/dplyr", "BugReports": "https://github.com/tidyverse/dplyr/issues", "Depends": [ - "R (>= 4.1.0)" + "R (>= 3.5.0)" ], "Imports": [ - "cli (>= 3.6.2)", + "cli (>= 3.4.0)", "generics", "glue (>= 1.3.2)", - "lifecycle (>= 1.0.5)", + "lifecycle (>= 1.0.3)", "magrittr (>= 1.5)", "methods", "pillar (>= 1.9.0)", "R6", - "rlang (>= 1.1.7)", + "rlang (>= 1.1.0)", "tibble (>= 3.2.0)", "tidyselect (>= 1.2.0)", "utils", - "vctrs (>= 0.7.1)" + "vctrs (>= 0.6.4)" ], "Suggests": [ + "bench", "broom", + "callr", "covr", "DBI", "dbplyr (>= 2.2.1)", @@ -2643,9 +2641,12 @@ "knitr", "Lahman", "lobstr", + "microbenchmark", "nycflights13", "purrr", "rmarkdown", + "RMySQL", + "RPostgreSQL", "RSQLite", "stringi (>= 1.7.6)", "testthat (>= 3.1.5)", @@ -2653,20 +2654,19 @@ "withr" ], "VignetteBuilder": "knitr", - "Config/build/compilation-database": "true", - "Config/Needs/website": "tidyverse/tidytemplate", + "Config/Needs/website": "tidyverse, shiny, pkgdown, tidyverse/tidytemplate", "Config/testthat/edition": "3", "Encoding": "UTF-8", "LazyData": "true", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.2.3", "NeedsCompilation": "yes", - "Author": "Hadley Wickham [aut, cre] (ORCID: ), Romain François [aut] (ORCID: ), Lionel Henry [aut], Kirill Müller [aut] (ORCID: ), Davis Vaughan [aut] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Author": "Hadley Wickham [aut, cre] (), Romain François [aut] (), Lionel Henry [aut], Kirill Müller [aut] (), Davis Vaughan [aut] (), Posit Software, PBC [cph, fnd]", "Maintainer": "Hadley Wickham ", "Repository": "CRAN" }, "e1071": { "Package": "e1071", - "Version": "1.7-17", + "Version": "1.7-16", "Source": "Repository", "Title": "Misc Functions of the Department of Statistics, Probability Theory Group (Formerly: E1071), TU Wien", "Imports": [ @@ -2695,7 +2695,7 @@ "License": "GPL-2 | GPL-3", "LazyLoad": "yes", "NeedsCompilation": "yes", - "Author": "David Meyer [aut, cre] (ORCID: ), Evgenia Dimitriadou [aut, cph], Kurt Hornik [aut] (ORCID: ), Andreas Weingessel [aut], Friedrich Leisch [aut], Chih-Chung Chang [ctb, cph] (libsvm C++-code), Chih-Chen Lin [ctb, cph] (libsvm C++-code)", + "Author": "David Meyer [aut, cre] (), Evgenia Dimitriadou [aut, cph], Kurt Hornik [aut] (), Andreas Weingessel [aut], Friedrich Leisch [aut], Chih-Chung Chang [ctb, cph] (libsvm C++-code), Chih-Chen Lin [ctb, cph] (libsvm C++-code)", "Maintainer": "David Meyer ", "Repository": "CRAN" }, @@ -2819,11 +2819,11 @@ }, "emmeans": { "Package": "emmeans", - "Version": "2.0.1", + "Version": "2.0.0", "Source": "Repository", "Type": "Package", "Title": "Estimated Marginal Means, aka Least-Squares Means", - "Date": "2025-12-10", + "Date": "2025-10-24", "Authors@R": "c(person(\"Russell V.\", \"Lenth\", role = c(\"aut\", \"cph\"), email = \"russell-lenth@uiowa.edu\"), person(\"Julia\", \"Piaskowski\", role = c(\"cre\", \"aut\"), email = \"julia.piask@gmail.com\"), person(\"Balazs\", \"Banfai\", role = \"ctb\"), person(\"Ben\", \"Bolker\", role = \"ctb\"), person(\"Paul\", \"Buerkner\", role = \"ctb\"), person(\"Iago\", \"Giné-Vázquez\", role = \"ctb\"), person(\"Maxime\", \"Hervé\", role = \"ctb\"), person(\"Maarten\", \"Jung\", role = \"ctb\"), person(\"Jonathon\", \"Love\", role = \"ctb\"), person(\"Fernando\", \"Miguez\", role = \"ctb\"), person(\"Hannes\", \"Riebl\", role = \"ctb\"), person(\"Henrik\", \"Singmann\", role = \"ctb\"))", "Maintainer": "Julia Piaskowski ", "Depends": [ @@ -3160,24 +3160,24 @@ }, "flextable": { "Package": "flextable", - "Version": "0.9.11", + "Version": "0.9.10", "Source": "Repository", "Type": "Package", "Title": "Functions for Tabular Reporting", "Authors@R": "c( person(\"David\", \"Gohel\", , \"david.gohel@ardata.fr\", role = c(\"aut\", \"cre\")), person(\"ArData\", role = \"cph\"), person(\"Clementine\", \"Jager\", role = \"ctb\"), person(\"Eli\", \"Daniels\", role = \"ctb\"), person(\"Panagiotis\", \"Skintzos\", , \"panagiotis.skintzos@ardata.fr\", role = \"aut\"), person(\"Quentin\", \"Fazilleau\", role = \"ctb\"), person(\"Maxim\", \"Nazarov\", role = \"ctb\"), person(\"Titouan\", \"Robert\", role = \"ctb\"), person(\"Michael\", \"Barrowman\", role = \"ctb\"), person(\"Atsushi\", \"Yasumoto\", role = \"ctb\"), person(\"Paul\", \"Julian\", role = \"ctb\"), person(\"Sean\", \"Browning\", role = \"ctb\"), person(\"Rémi\", \"Thériault\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4315-6788\")), person(\"Samuel\", \"Jobert\", role = \"ctb\"), person(\"Keith\", \"Newman\", role = \"ctb\") )", - "Description": "Use a grammar for creating and customizing pretty tables. The following formats are supported: 'HTML', 'PDF', 'RTF', 'Microsoft Word', 'Microsoft PowerPoint', R 'Grid Graphics' and 'patchwork'. 'R Markdown', 'Quarto' and the package 'officer' can be used to produce the result files. The syntax is the same for the user regardless of the type of output to be produced. A set of functions allows the creation, definition of cell arrangement, addition of headers or footers, formatting and definition of cell content with text and or images. The package also offers a set of high-level functions that allow tabular reporting of statistical models and the creation of complex cross tabulations.", + "Description": "Use a grammar for creating and customizing pretty tables. The following formats are supported: 'HTML', 'PDF', 'RTF', 'Microsoft Word', 'Microsoft PowerPoint' and R 'Grid Graphics'. 'R Markdown', 'Quarto' and the package 'officer' can be used to produce the result files. The syntax is the same for the user regardless of the type of output to be produced. A set of functions allows the creation, definition of cell arrangement, addition of headers or footers, formatting and definition of cell content with text and or images. The package also offers a set of high-level functions that allow tabular reporting of statistical models and the creation of complex cross tabulations.", "License": "GPL-3", "URL": "https://ardata-fr.github.io/flextable-book/, https://davidgohel.github.io/flextable/", "BugReports": "https://github.com/davidgohel/flextable/issues", "Imports": [ "data.table (>= 1.13.0)", - "gdtools (>= 0.5.0)", + "gdtools (>= 0.4.0)", "graphics", "grDevices", "grid", "htmltools", "knitr", - "officer (>= 0.7.3)", + "officer (>= 0.6.10)", "ragg", "rlang", "rmarkdown (>= 2.0)", @@ -3196,14 +3196,11 @@ "doconv (>= 0.3.0)", "equatags", "ggplot2", - "gtable", - "jsonlite", "lme4", "magick", "mgcv", "nlme", "officedown", - "patchwork", "pdftools", "pkgdown (>= 2.0.0)", "scales", @@ -3217,7 +3214,7 @@ "VignetteBuilder": "knitr", "Config/testthat/edition": "3", "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "NeedsCompilation": "no", "Author": "David Gohel [aut, cre], ArData [cph], Clementine Jager [ctb], Eli Daniels [ctb], Panagiotis Skintzos [aut], Quentin Fazilleau [ctb], Maxim Nazarov [ctb], Titouan Robert [ctb], Michael Barrowman [ctb], Atsushi Yasumoto [ctb], Paul Julian [ctb], Sean Browning [ctb], Rémi Thériault [ctb] (ORCID: ), Samuel Jobert [ctb], Keith Newman [ctb]", "Maintainer": "David Gohel ", @@ -3477,11 +3474,11 @@ }, "gap": { "Package": "gap", - "Version": "1.14", + "Version": "1.6", "Source": "Repository", "Type": "Package", "Title": "Genetic Analysis Package", - "Date": "2026-2-19", + "Date": "2024-8-26", "Authors@R": "c( person(\"Jing Hua\", \"Zhao\", role = c(\"aut\", \"cre\"), email = \"jinghuazhao@hotmail.com\", comment = c(ORCID = \"0000-0002-1463-5870\", \"0000-0003-4930-3582\")), person(\"Kurt\", \"Hornik\", role = \"ctb\"), person(\"Brian\", \"Ripley\", role = \"ctb\"), person(\"Uwe\", \"Ligges\", role = \"ctb\"), person(\"Achim\", \"Zeileis\", role = \"ctb\") )", "Description": "As first reported [Zhao, J. H. 2007. \"gap: Genetic Analysis Package\". J Stat Soft 23(8):1-18. ], it is designed as an integrated package for genetic data analysis of both population and family data. Currently, it contains functions for sample size calculations of both population-based and family-based designs, probability of familial disease aggregation, kinship calculation, statistics in linkage analysis, and association analysis involving genetic markers including haplotype analysis with or without environmental covariates. Over years, the package has been developed in-between many projects hence also in line with the name (gap).", "License": "GPL (>= 2)", @@ -3522,6 +3519,7 @@ "knitr", "lattice", "magic", + "manhattanly", "matrixStats", "meta", "metafor", @@ -3544,9 +3542,9 @@ "NeedsCompilation": "yes", "Encoding": "UTF-8", "VignetteBuilder": "knitr", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "RdMacros": "Rdpack", - "Author": "Jing Hua Zhao [aut, cre] (ORCID: , 0000-0003-4930-3582), Kurt Hornik [ctb], Brian Ripley [ctb], Uwe Ligges [ctb], Achim Zeileis [ctb]", + "Author": "Jing Hua Zhao [aut, cre] (, 0000-0003-4930-3582), Kurt Hornik [ctb], Brian Ripley [ctb], Uwe Ligges [ctb], Achim Zeileis [ctb]", "Maintainer": "Jing Hua Zhao ", "Repository": "CRAN" }, @@ -3573,11 +3571,11 @@ }, "gdtools": { "Package": "gdtools", - "Version": "0.5.0", + "Version": "0.4.4", "Source": "Repository", - "Title": "Font Metrics and Font Management Utilities for R Graphics", + "Title": "Utilities for Graphical Rendering and Fonts Management", "Authors@R": "c( person(\"David\", \"Gohel\", , \"david.gohel@ardata.fr\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@rstudio.com\", role = \"aut\"), person(\"Jeroen\", \"Ooms\", , \"jeroen@berkeley.edu\", role = \"aut\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Yixuan\", \"Qiu\", role = \"ctb\"), person(\"R Core Team\", role = \"cph\", comment = \"Cairo code from X11 device\"), person(\"ArData\", role = \"cph\"), person(\"RStudio\", role = \"cph\") )", - "Description": "Compute text metrics (width, ascent, descent) using 'Cairo' and 'FreeType', independently of the active graphic device. Font lookup is delegated to 'systemfonts'. Additional utilities let users register 'Google Fonts' or bundled 'Liberation' fonts, check font availability, and assemble 'htmlDependency' objects so that fonts are correctly embedded in 'Shiny' applications, 'R Markdown' documents, and 'htmlwidgets' outputs such as 'ggiraph'.", + "Description": "Tools are provided to compute metrics of formatted strings and to check the availability of a font. Another set of functions is provided to support the collection of fonts from 'Google Fonts' in a cache. Their use is simple within 'R Markdown' documents and 'shiny' applications but also with graphic productions generated with the 'ggiraph', 'ragg' and 'svglite' packages or with tabular productions from the 'flextable' package.", "License": "GPL-3 | file LICENSE", "URL": "https://davidgohel.github.io/gdtools/", "BugReports": "https://github.com/davidgohel/gdtools/issues", @@ -3775,7 +3773,7 @@ }, "ggplot2": { "Package": "ggplot2", - "Version": "4.0.2", + "Version": "4.0.1", "Source": "Repository", "Title": "Create Elegant Data Visualisations Using the Grammar of Graphics", "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Winston\", \"Chang\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Lionel\", \"Henry\", role = \"aut\"), person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Kohske\", \"Takahashi\", role = \"aut\"), person(\"Claus\", \"Wilke\", role = \"aut\", comment = c(ORCID = \"0000-0002-7470-9261\")), person(\"Kara\", \"Woo\", role = \"aut\", comment = c(ORCID = \"0000-0002-5125-4188\")), person(\"Hiroaki\", \"Yutani\", role = \"aut\", comment = c(ORCID = \"0000-0002-3385-7233\")), person(\"Dewey\", \"Dunnington\", role = \"aut\", comment = c(ORCID = \"0000-0002-9415-4582\")), person(\"Teun\", \"van den Brand\", role = \"aut\", comment = c(ORCID = \"0000-0002-9335-7468\")), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", @@ -3889,7 +3887,7 @@ }, "ggstats": { "Package": "ggstats", - "Version": "0.12.0", + "Version": "0.11.0", "Source": "Repository", "Type": "Package", "Title": "Extension to 'ggplot2' for Plotting Stats", @@ -3937,7 +3935,7 @@ "vdiffr" ], "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "Config/testthat/edition": "3", "Language": "en-US", "VignetteBuilder": "knitr", @@ -4019,17 +4017,17 @@ }, "gt": { "Package": "gt", - "Version": "1.3.0", + "Version": "1.1.0", "Source": "Repository", "Type": "Package", "Title": "Easily Create Presentation-Ready Display Tables", - "Authors@R": "c( person(\"Richard\", \"Iannone\", , \"rich@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Shannon\", \"Haughton\", , \"shannon.l.haughton@gsk.com\", role = \"aut\"), person(\"Ellis\", \"Hughes\", , \"ellis.h.hughes@gsk.com\", role = \"aut\", comment = c(ORCID = \"0000-0003-0637-4436\")), person(\"Alexandra\", \"Lauer\", , \"alexandralauer1@gmail.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-4191-6301\")), person(\"Romain\", \"François\", , \"romain@tada.science\", role = \"aut\"), person(\"JooYoung\", \"Seo\", , \"jseo1005@illinois.edu\", role = \"aut\", comment = c(ORCID = \"0000-0002-4064-6012\")), person(\"Ken\", \"Brevoort\", , \"ken@brevoort.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-4001-8358\")), person(\"Olivier\", \"Roy\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Authors@R": "c( person(\"Richard\", \"Iannone\", , \"rich@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Ellis\", \"Hughes\", , \"ellis.h.hughes@gsk.com\", role = \"aut\", comment = c(ORCID = \"0000-0003-0637-4436\")), person(\"Alexandra\", \"Lauer\", , \"alexandralauer1@gmail.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-4191-6301\")), person(\"JooYoung\", \"Seo\", , \"jseo1005@illinois.edu\", role = \"aut\", comment = c(ORCID = \"0000-0002-4064-6012\")), person(\"Ken\", \"Brevoort\", , \"ken@brevoort.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-4001-8358\")), person(\"Olivier\", \"Roy\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", "Description": "Build display tables from tabular data with an easy-to-use set of functions. With its progressive approach, we can construct display tables with a cohesive set of table parts. Table values can be formatted using any of the included formatting functions. Footnotes and cell styles can be precisely added through a location targeting system. The way in which 'gt' handles things for you means that you don't often have to worry about the fine details.", "License": "MIT + file LICENSE", "URL": "https://gt.rstudio.com, https://github.com/rstudio/gt", "BugReports": "https://github.com/rstudio/gt/issues", "Depends": [ - "R (>= 4.1.0)" + "R (>= 3.6.0)" ], "Imports": [ "base64enc (>= 0.1-3)", @@ -4054,7 +4052,6 @@ "xml2 (>= 1.3.6)" ], "Suggests": [ - "bit64", "farver", "fontawesome (>= 0.5.2)", "ggplot2", @@ -4082,9 +4079,9 @@ "Config/testthat/parallel": "true", "Encoding": "UTF-8", "LazyData": "true", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "NeedsCompilation": "no", - "Author": "Richard Iannone [aut, cre] (ORCID: ), Joe Cheng [aut], Barret Schloerke [aut] (ORCID: ), Shannon Haughton [aut], Ellis Hughes [aut] (ORCID: ), Alexandra Lauer [aut] (ORCID: ), Romain François [aut], JooYoung Seo [aut] (ORCID: ), Ken Brevoort [aut] (ORCID: ), Olivier Roy [aut], Posit Software, PBC [cph, fnd]", + "Author": "Richard Iannone [aut, cre] (ORCID: ), Joe Cheng [aut], Barret Schloerke [aut] (ORCID: ), Ellis Hughes [aut] (ORCID: ), Alexandra Lauer [aut] (ORCID: ), JooYoung Seo [aut] (ORCID: ), Ken Brevoort [aut] (ORCID: ), Olivier Roy [aut], Posit Software, PBC [cph, fnd]", "Maintainer": "Richard Iannone ", "Repository": "CRAN" }, @@ -4517,19 +4514,19 @@ }, "httr": { "Package": "httr", - "Version": "1.4.8", + "Version": "1.4.7", "Source": "Repository", "Title": "Tools for Working with URLs and HTTP", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\")) )", "Description": "Useful tools for working with HTTP organised by HTTP verbs (GET(), POST(), etc). Configuration functions make it easy to control additional request components (authenticate(), add_headers() and so on).", "License": "MIT + file LICENSE", "URL": "https://httr.r-lib.org/, https://github.com/r-lib/httr", "BugReports": "https://github.com/r-lib/httr/issues", "Depends": [ - "R (>= 3.6)" + "R (>= 3.5)" ], "Imports": [ - "curl (>= 5.1.0)", + "curl (>= 5.0.2)", "jsonlite", "mime", "openssl (>= 0.8)", @@ -4549,15 +4546,15 @@ "VignetteBuilder": "knitr", "Config/Needs/website": "tidyverse/tidytemplate", "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.2.3", "NeedsCompilation": "no", - "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd]", + "Author": "Hadley Wickham [aut, cre], Posit, PBC [cph, fnd]", "Maintainer": "Hadley Wickham ", "Repository": "CRAN" }, "insight": { "Package": "insight", - "Version": "1.4.6", + "Version": "1.4.4", "Source": "Repository", "Type": "Package", "Title": "Easy Access to Model Information for Various Model Objects", @@ -4679,7 +4676,6 @@ "quantreg", "Rcpp", "RcppEigen", - "recipes", "rmarkdown", "rms", "robustbase", @@ -4700,7 +4696,6 @@ "survival", "svylme", "testthat", - "tidymodels", "tinytable (>= 0.13.0)", "TMB", "truncreg", @@ -4708,8 +4703,7 @@ "tweedie", "VGAM", "WeightIt", - "withr", - "workflows" + "withr" ], "VignetteBuilder": "knitr", "Encoding": "UTF-8", @@ -4906,7 +4900,7 @@ }, "knitr": { "Package": "knitr", - "Version": "1.51", + "Version": "1.50", "Source": "Repository", "Type": "Package", "Title": "A General-Purpose Package for Dynamic Report Generation in R", @@ -4920,11 +4914,12 @@ "highr (>= 0.11)", "methods", "tools", - "xfun (>= 0.52)", + "xfun (>= 0.51)", "yaml (>= 2.1.19)" ], "Suggests": [ "bslib", + "codetools", "DBI (>= 0.4-1)", "digest", "formatR", @@ -4936,8 +4931,6 @@ "magick", "litedown", "markdown (>= 1.3)", - "otel", - "otelsdk", "png", "ragg", "reticulate (>= 1.4)", @@ -4962,10 +4955,10 @@ "Encoding": "UTF-8", "VignetteBuilder": "litedown, knitr", "SystemRequirements": "Package vignettes based on R Markdown v2 or reStructuredText require Pandoc (http://pandoc.org). The function rst2pdf() requires rst2pdf (https://github.com/rst2pdf/rst2pdf).", - "Collate": "'block.R' 'cache.R' 'citation.R' 'hooks-html.R' 'plot.R' 'utils.R' 'defaults.R' 'concordance.R' 'engine.R' 'highlight.R' 'themes.R' 'header.R' 'hooks-asciidoc.R' 'hooks-chunk.R' 'hooks-extra.R' 'hooks-latex.R' 'hooks-md.R' 'hooks-rst.R' 'hooks-textile.R' 'hooks.R' 'otel.R' 'output.R' 'package.R' 'pandoc.R' 'params.R' 'parser.R' 'pattern.R' 'rocco.R' 'spin.R' 'table.R' 'template.R' 'utils-conversion.R' 'utils-rd2html.R' 'utils-string.R' 'utils-sweave.R' 'utils-upload.R' 'utils-vignettes.R' 'zzz.R'", - "RoxygenNote": "7.3.3", + "Collate": "'block.R' 'cache.R' 'citation.R' 'hooks-html.R' 'plot.R' 'utils.R' 'defaults.R' 'concordance.R' 'engine.R' 'highlight.R' 'themes.R' 'header.R' 'hooks-asciidoc.R' 'hooks-chunk.R' 'hooks-extra.R' 'hooks-latex.R' 'hooks-md.R' 'hooks-rst.R' 'hooks-textile.R' 'hooks.R' 'output.R' 'package.R' 'pandoc.R' 'params.R' 'parser.R' 'pattern.R' 'rocco.R' 'spin.R' 'table.R' 'template.R' 'utils-conversion.R' 'utils-rd2html.R' 'utils-string.R' 'utils-sweave.R' 'utils-upload.R' 'utils-vignettes.R' 'zzz.R'", + "RoxygenNote": "7.3.2", "NeedsCompilation": "no", - "Author": "Yihui Xie [aut, cre] (ORCID: , URL: https://yihui.org), Abhraneel Sarma [ctb], Adam Vogt [ctb], Alastair Andrew [ctb], Alex Zvoleff [ctb], Amar Al-Zubaidi [ctb], Andre Simon [ctb] (the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de), Aron Atkins [ctb], Aaron Wolen [ctb], Ashley Manton [ctb], Atsushi Yasumoto [ctb] (ORCID: ), Ben Baumer [ctb], Brian Diggs [ctb], Brian Zhang [ctb], Bulat Yapparov [ctb], Cassio Pereira [ctb], Christophe Dervieux [ctb], David Hall [ctb], David Hugh-Jones [ctb], David Robinson [ctb], Doug Hemken [ctb], Duncan Murdoch [ctb], Elio Campitelli [ctb], Ellis Hughes [ctb], Emily Riederer [ctb], Fabian Hirschmann [ctb], Fitch Simeon [ctb], Forest Fang [ctb], Frank E Harrell Jr [ctb] (the Sweavel package at inst/misc/Sweavel.sty), Garrick Aden-Buie [ctb], Gregoire Detrez [ctb], Hadley Wickham [ctb], Hao Zhu [ctb], Heewon Jeon [ctb], Henrik Bengtsson [ctb], Hiroaki Yutani [ctb], Ian Lyttle [ctb], Hodges Daniel [ctb], Jacob Bien [ctb], Jake Burkhead [ctb], James Manton [ctb], Jared Lander [ctb], Jason Punyon [ctb], Javier Luraschi [ctb], Jeff Arnold [ctb], Jenny Bryan [ctb], Jeremy Ashkenas [ctb, cph] (the CSS file at inst/misc/docco-classic.css), Jeremy Stephens [ctb], Jim Hester [ctb], Joe Cheng [ctb], Johannes Ranke [ctb], John Honaker [ctb], John Muschelli [ctb], Jonathan Keane [ctb], JJ Allaire [ctb], Johan Toloe [ctb], Jonathan Sidi [ctb], Joseph Larmarange [ctb], Julien Barnier [ctb], Kaiyin Zhong [ctb], Kamil Slowikowski [ctb], Karl Forner [ctb], Kevin K. Smith [ctb], Kirill Mueller [ctb], Kohske Takahashi [ctb], Lorenz Walthert [ctb], Lucas Gallindo [ctb], Marius Hofert [ctb], Martin Modrák [ctb], Michael Chirico [ctb], Michael Friendly [ctb], Michal Bojanowski [ctb], Michel Kuhlmann [ctb], Miller Patrick [ctb], Nacho Caballero [ctb], Nick Salkowski [ctb], Niels Richard Hansen [ctb], Noam Ross [ctb], Obada Mahdi [ctb], Pavel N. Krivitsky [ctb] (ORCID: ), Pedro Faria [ctb], Qiang Li [ctb], Ramnath Vaidyanathan [ctb], Richard Cotton [ctb], Robert Krzyzanowski [ctb], Rodrigo Copetti [ctb], Romain Francois [ctb], Ruaridh Williamson [ctb], Sagiru Mati [ctb] (ORCID: ), Scott Kostyshak [ctb], Sebastian Meyer [ctb], Sietse Brouwer [ctb], Simon de Bernard [ctb], Sylvain Rousseau [ctb], Taiyun Wei [ctb], Thibaut Assus [ctb], Thibaut Lamadon [ctb], Thomas Leeper [ctb], Tim Mastny [ctb], Tom Torsney-Weir [ctb], Trevor Davis [ctb], Viktoras Veitas [ctb], Weicheng Zhu [ctb], Wush Wu [ctb], Zachary Foster [ctb], Zhian N. Kamvar [ctb] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Author": "Yihui Xie [aut, cre] (, https://yihui.org), Abhraneel Sarma [ctb], Adam Vogt [ctb], Alastair Andrew [ctb], Alex Zvoleff [ctb], Amar Al-Zubaidi [ctb], Andre Simon [ctb] (the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de), Aron Atkins [ctb], Aaron Wolen [ctb], Ashley Manton [ctb], Atsushi Yasumoto [ctb] (), Ben Baumer [ctb], Brian Diggs [ctb], Brian Zhang [ctb], Bulat Yapparov [ctb], Cassio Pereira [ctb], Christophe Dervieux [ctb], David Hall [ctb], David Hugh-Jones [ctb], David Robinson [ctb], Doug Hemken [ctb], Duncan Murdoch [ctb], Elio Campitelli [ctb], Ellis Hughes [ctb], Emily Riederer [ctb], Fabian Hirschmann [ctb], Fitch Simeon [ctb], Forest Fang [ctb], Frank E Harrell Jr [ctb] (the Sweavel package at inst/misc/Sweavel.sty), Garrick Aden-Buie [ctb], Gregoire Detrez [ctb], Hadley Wickham [ctb], Hao Zhu [ctb], Heewon Jeon [ctb], Henrik Bengtsson [ctb], Hiroaki Yutani [ctb], Ian Lyttle [ctb], Hodges Daniel [ctb], Jacob Bien [ctb], Jake Burkhead [ctb], James Manton [ctb], Jared Lander [ctb], Jason Punyon [ctb], Javier Luraschi [ctb], Jeff Arnold [ctb], Jenny Bryan [ctb], Jeremy Ashkenas [ctb, cph] (the CSS file at inst/misc/docco-classic.css), Jeremy Stephens [ctb], Jim Hester [ctb], Joe Cheng [ctb], Johannes Ranke [ctb], John Honaker [ctb], John Muschelli [ctb], Jonathan Keane [ctb], JJ Allaire [ctb], Johan Toloe [ctb], Jonathan Sidi [ctb], Joseph Larmarange [ctb], Julien Barnier [ctb], Kaiyin Zhong [ctb], Kamil Slowikowski [ctb], Karl Forner [ctb], Kevin K. Smith [ctb], Kirill Mueller [ctb], Kohske Takahashi [ctb], Lorenz Walthert [ctb], Lucas Gallindo [ctb], Marius Hofert [ctb], Martin Modrák [ctb], Michael Chirico [ctb], Michael Friendly [ctb], Michal Bojanowski [ctb], Michel Kuhlmann [ctb], Miller Patrick [ctb], Nacho Caballero [ctb], Nick Salkowski [ctb], Niels Richard Hansen [ctb], Noam Ross [ctb], Obada Mahdi [ctb], Pavel N. Krivitsky [ctb] (), Pedro Faria [ctb], Qiang Li [ctb], Ramnath Vaidyanathan [ctb], Richard Cotton [ctb], Robert Krzyzanowski [ctb], Rodrigo Copetti [ctb], Romain Francois [ctb], Ruaridh Williamson [ctb], Sagiru Mati [ctb] (), Scott Kostyshak [ctb], Sebastian Meyer [ctb], Sietse Brouwer [ctb], Simon de Bernard [ctb], Sylvain Rousseau [ctb], Taiyun Wei [ctb], Thibaut Assus [ctb], Thibaut Lamadon [ctb], Thomas Leeper [ctb], Tim Mastny [ctb], Tom Torsney-Weir [ctb], Trevor Davis [ctb], Viktoras Veitas [ctb], Weicheng Zhu [ctb], Wush Wu [ctb], Zachary Foster [ctb], Zhian N. Kamvar [ctb] (), Posit Software, PBC [cph, fnd]", "Maintainer": "Yihui Xie ", "Repository": "CRAN" }, @@ -5041,26 +5034,22 @@ }, "later": { "Package": "later", - "Version": "1.4.6", + "Version": "1.4.4", "Source": "Repository", "Type": "Package", "Title": "Utilities for Scheduling Functions to Execute Later with Event Loops", - "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Charlie\", \"Gao\", , \"charlie.gao@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-0750-061X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"Marcus\", \"Geelnard\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\"), person(\"Evan\", \"Nemerson\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\") )", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\"), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Charlie\", \"Gao\", , \"charlie.gao@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-0750-061X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"Marcus\", \"Geelnard\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\"), person(\"Evan\", \"Nemerson\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\") )", "Description": "Executes arbitrary R or C functions some time after the current time, after the R execution stack has emptied. The functions are scheduled in an event loop.", "License": "MIT + file LICENSE", "URL": "https://later.r-lib.org, https://github.com/r-lib/later", "BugReports": "https://github.com/r-lib/later/issues", - "Depends": [ - "R (>= 3.5)" - ], "Imports": [ - "Rcpp (>= 1.0.10)", + "Rcpp (>= 0.12.9)", "rlang" ], "Suggests": [ "knitr", "nanonext", - "promises", "rmarkdown", "testthat (>= 3.0.0)" ], @@ -5068,14 +5057,13 @@ "Rcpp" ], "VignetteBuilder": "knitr", - "Config/build/compilation-database": "true", "Config/Needs/website": "tidyverse/tidytemplate", "Config/testthat/edition": "3", "Config/usethis/last-upkeep": "2025-07-18", "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "NeedsCompilation": "yes", - "Author": "Winston Chang [aut] (ORCID: ), Joe Cheng [aut], Charlie Gao [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: ), Marcus Geelnard [ctb, cph] (TinyCThread library, https://tinycthread.github.io/), Evan Nemerson [ctb, cph] (TinyCThread library, https://tinycthread.github.io/)", + "Author": "Winston Chang [aut], Joe Cheng [aut], Charlie Gao [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: ), Marcus Geelnard [ctb, cph] (TinyCThread library, https://tinycthread.github.io/), Evan Nemerson [ctb, cph] (TinyCThread library, https://tinycthread.github.io/)", "Maintainer": "Charlie Gao ", "Repository": "CRAN" }, @@ -5145,7 +5133,7 @@ }, "lifecycle": { "Package": "lifecycle", - "Version": "1.0.5", + "Version": "1.0.4", "Source": "Repository", "Title": "Manage the Life Cycle of your Package Functions", "Authors@R": "c( person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", @@ -5158,34 +5146,35 @@ ], "Imports": [ "cli (>= 3.4.0)", + "glue", "rlang (>= 1.1.0)" ], "Suggests": [ "covr", + "crayon", "knitr", - "lintr (>= 3.1.0)", + "lintr", "rmarkdown", "testthat (>= 3.0.1)", "tibble", "tidyverse", "tools", "vctrs", - "withr", - "xml2" + "withr" ], "VignetteBuilder": "knitr", "Config/Needs/website": "tidyverse/tidytemplate, usethis", "Config/testthat/edition": "3", "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.2.1", "NeedsCompilation": "no", - "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut] (), Posit Software, PBC [cph, fnd]", "Maintainer": "Lionel Henry ", "Repository": "CRAN" }, "litedown": { "Package": "litedown", - "Version": "0.9", + "Version": "0.8", "Source": "Repository", "Type": "Package", "Title": "A Lightweight Version of R Markdown", @@ -5197,7 +5186,7 @@ "Imports": [ "utils", "commonmark (>= 2.0.0)", - "xfun (>= 0.55)" + "xfun (>= 0.54)" ], "Suggests": [ "rbibutils", @@ -5320,14 +5309,14 @@ }, "lubridate": { "Package": "lubridate", - "Version": "1.9.5", + "Version": "1.9.4", "Source": "Repository", "Type": "Package", "Title": "Make Dealing with Dates a Little Easier", "Authors@R": "c( person(\"Vitalie\", \"Spinu\", , \"spinuvit@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Garrett\", \"Grolemund\", role = \"aut\"), person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Davis\", \"Vaughan\", role = \"ctb\"), person(\"Ian\", \"Lyttle\", role = \"ctb\"), person(\"Imanuel\", \"Costigan\", role = \"ctb\"), person(\"Jason\", \"Law\", role = \"ctb\"), person(\"Doug\", \"Mitarotonda\", role = \"ctb\"), person(\"Joseph\", \"Larmarange\", role = \"ctb\"), person(\"Jonathan\", \"Boiser\", role = \"ctb\"), person(\"Chel Hee\", \"Lee\", role = \"ctb\") )", "Maintainer": "Vitalie Spinu ", "Description": "Functions to work with date-times and time-spans: fast and user friendly parsing of date-time data, extraction and updating of components of a date-time (years, months, days, hours, minutes, and seconds), algebraic manipulation on date-time and time-span objects. The 'lubridate' package has a consistent and memorable syntax that makes working with dates easy and fun.", - "License": "MIT + file LICENSE", + "License": "GPL (>= 2)", "URL": "https://lubridate.tidyverse.org, https://github.com/tidyverse/lubridate", "BugReports": "https://github.com/tidyverse/lubridate/issues", "Depends": [ @@ -5336,7 +5325,7 @@ ], "Imports": [ "generics", - "timechange (>= 0.4.0)" + "timechange (>= 0.3.0)" ], "Suggests": [ "covr", @@ -5357,8 +5346,8 @@ "Config/testthat/edition": "3", "Encoding": "UTF-8", "LazyData": "true", - "RoxygenNote": "7.3.3", - "SystemRequirements": "A system with zoneinfo data (e.g. /usr/share/zoneinfo). On Windows the zoneinfo included with R is used.", + "RoxygenNote": "7.2.3", + "SystemRequirements": "C++11, A system with zoneinfo data (e.g. /usr/share/zoneinfo). On Windows the zoneinfo included with R is used.", "Collate": "'Dates.r' 'POSIXt.r' 'util.r' 'parse.r' 'timespans.r' 'intervals.r' 'difftimes.r' 'durations.r' 'periods.r' 'accessors-date.R' 'accessors-day.r' 'accessors-dst.r' 'accessors-hour.r' 'accessors-minute.r' 'accessors-month.r' 'accessors-quarter.r' 'accessors-second.r' 'accessors-tz.r' 'accessors-week.r' 'accessors-year.r' 'am-pm.r' 'time-zones.r' 'numeric.r' 'coercion.r' 'constants.r' 'cyclic_encoding.r' 'data.r' 'decimal-dates.r' 'deprecated.r' 'format_ISO8601.r' 'guess.r' 'hidden.r' 'instants.r' 'leap-years.r' 'ops-addition.r' 'ops-compare.r' 'ops-division.r' 'ops-integer-division.r' 'ops-m+.r' 'ops-modulo.r' 'ops-multiplication.r' 'ops-subtraction.r' 'package.r' 'pretty.r' 'round.r' 'stamp.r' 'tzdir.R' 'update.r' 'vctrs.R' 'zzz.R'", "NeedsCompilation": "yes", "Author": "Vitalie Spinu [aut, cre], Garrett Grolemund [aut], Hadley Wickham [aut], Davis Vaughan [ctb], Ian Lyttle [ctb], Imanuel Costigan [ctb], Jason Law [ctb], Doug Mitarotonda [ctb], Joseph Larmarange [ctb], Jonathan Boiser [ctb], Chel Hee Lee [ctb]", @@ -5459,14 +5448,14 @@ }, "mgcv": { "Package": "mgcv", - "Version": "1.9-3", + "Version": "1.9-4", "Source": "Repository", "Authors@R": "person(given = \"Simon\", family = \"Wood\", role = c(\"aut\", \"cre\"), email = \"simon.wood@r-project.org\")", "Title": "Mixed GAM Computation Vehicle with Automatic Smoothness Estimation", - "Description": "Generalized additive (mixed) models, some of their extensions and other generalized ridge regression with multiple smoothing parameter estimation by (Restricted) Marginal Likelihood, Generalized Cross Validation and similar, or using iterated nested Laplace approximation for fully Bayesian inference. See Wood (2017) for an overview. Includes a gam() function, a wide variety of smoothers, 'JAGS' support and distributions beyond the exponential family.", + "Description": "Generalized additive (mixed) models, some of their extensions and other generalized ridge regression with multiple smoothing parameter estimation by (Restricted) Marginal Likelihood, Cross Validation and similar, or using iterated nested Laplace approximation for fully Bayesian inference. See Wood (2025) for an overview. Includes a gam() function, a wide variety of smoothers, 'JAGS' support and distributions beyond the exponential family.", "Priority": "recommended", "Depends": [ - "R (>= 3.6.0)", + "R (>= 4.4.0)", "nlme (>= 3.1-64)" ], "Imports": [ @@ -5535,20 +5524,20 @@ }, "minty": { "Package": "minty", - "Version": "0.0.6", + "Version": "0.0.5", "Source": "Repository", "Title": "Minimal Type Guesser", "Authors@R": "c( person(\"Chung-hong\", \"Chan\", role = c(\"aut\", \"cre\"), email = \"chainsawtiney@gmail.com\", comment = c(ORCID = \"0000-0002-6232-7530\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = \"author of the ported code from readr\"), person(\"Jim\", \"Hester\", role = \"aut\", comment = \"author of the ported code from readr\"), person(\"Romain\", \"Francois\", role = \"ctb\", comment = \"author of the ported code from readr\"), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\"), comment = \"author of the ported code from readr\"), person(\"Shelby\", \"Bearrows\", role = \"ctb\", comment = \"author of the ported code from readr\"), person(\"Posit Software, PBC\", role = \"cph\", comment = \"copyright holder of readr\"), person(\"David\", \"Olson\", role = \"aut\", comment = \"author of src/tzfile.h\") )", "Description": "Port the type guesser from 'readr' (so-called 'readr' first edition parsing engine, now superseded by 'vroom').", "License": "MIT + file LICENSE", - "URL": "https://gesistsa.github.io/minty/, https://codeberg.org/chainsawriot/minty", - "BugReports": "https://codeberg.org/chainsawriot/minty/issues", + "URL": "https://gesistsa.github.io/minty/, https://github.com/gesistsa/minty", + "BugReports": "https://github.com/gesistsa/minty/issues", "Depends": [ - "R (>= 4.0)" + "R (>= 3.6)" ], "LinkingTo": [ - "cpp11 (>= 0.5.3)", - "tzdb (>= 0.5.0)" + "cpp11 (>= 0.5.0)", + "tzdb (>= 0.1.1)" ], "Config/testthat/edition": "3", "Config/testthat/parallel": "false", @@ -5568,13 +5557,13 @@ ], "Config/Needs/website": "gesistsa/tsatemplate", "NeedsCompilation": "yes", - "Author": "Chung-hong Chan [aut, cre] (ORCID: ), Hadley Wickham [aut] (author of the ported code from readr), Jim Hester [aut] (author of the ported code from readr), Romain Francois [ctb] (author of the ported code from readr), Jennifer Bryan [aut] (author of the ported code from readr), Shelby Bearrows [ctb] (author of the ported code from readr), Posit Software, PBC [cph] (copyright holder of readr), David Olson [aut] (author of src/tzfile.h)", + "Author": "Chung-hong Chan [aut, cre] (), Hadley Wickham [aut] (author of the ported code from readr), Jim Hester [aut] (author of the ported code from readr), Romain Francois [ctb] (author of the ported code from readr), Jennifer Bryan [aut] (author of the ported code from readr), Shelby Bearrows [ctb] (author of the ported code from readr), Posit Software, PBC [cph] (copyright holder of readr), David Olson [aut] (author of src/tzfile.h)", "Maintainer": "Chung-hong Chan ", "Repository": "CRAN" }, "modelbased": { "Package": "modelbased", - "Version": "0.14.0", + "Version": "0.13.1", "Source": "Repository", "Type": "Package", "Title": "Estimation of Model-Based Predictions, Contrasts and Means", @@ -5590,7 +5579,7 @@ "Imports": [ "bayestestR (>= 0.17.0)", "datawizard (>= 1.3.0)", - "insight (>= 1.4.4)", + "insight (>= 1.4.3)", "parameters (>= 0.28.3)", "graphics", "stats", @@ -5802,11 +5791,11 @@ }, "officer": { "Package": "officer", - "Version": "0.7.3", + "Version": "0.7.2", "Source": "Repository", "Type": "Package", "Title": "Manipulation of Microsoft Word and PowerPoint Documents", - "Authors@R": "c( person(\"David\", \"Gohel\", , \"david.gohel@ardata.fr\", role = c(\"aut\", \"cre\")), person(\"Stefan\", \"Moog\", , \"moogs@gmx.de\", role = \"aut\"), person(\"Mark\", \"Heckmann\", , \"heckmann.mark@gmail.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-0736-7417\")), person(\"ArData\", role = \"cph\"), person(\"Frank\", \"Hangler\", , \"frank@plotandscatter.com\", role = \"ctb\", comment = \"function body_replace_all_text\"), person(\"Liz\", \"Sander\", , \"lsander@civisanalytics.com\", role = \"ctb\", comment = \"several documentation fixes\"), person(\"Anton\", \"Victorson\", , \"anton@victorson.se\", role = \"ctb\", comment = \"fixes xml structures\"), person(\"Jon\", \"Calder\", , \"jonmcalder@gmail.com\", role = \"ctb\", comment = \"update vignettes\"), person(\"John\", \"Harrold\", , \"john.m.harrold@gmail.com\", role = \"ctb\", comment = \"function annotate_base\"), person(\"John\", \"Muschelli\", , \"muschellij2@gmail.com\", role = \"ctb\", comment = \"google doc compatibility\"), person(\"Bill\", \"Denney\", , \"wdenney@humanpredictions.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5759-428X\", \"function as.matrix.rpptx\")), person(\"Nikolai\", \"Beck\", , \"beck.nikolai@gmail.com\", role = \"ctb\", comment = \"set speaker notes for .pptx documents\"), person(\"Greg\", \"Leleu\", , \"gregoire.leleu@gmail.com\", role = \"ctb\", comment = \"fields functionality in ppt\"), person(\"Majid\", \"Eismann\", role = \"ctb\"), person(\"Wahiduzzaman\", \"Khan\", role = \"ctb\", comment = \"vectorization of remove_slide\"), person(\"Hongyuan\", \"Jia\", , \"hongyuanjia@cqust.edu.cn\", role = \"ctb\", comment = c(ORCID = \"0000-0002-0075-8183\")), person(\"Michael\", \"Stackhouse\", , \"mike.stackhouse@atorusresearch.com\", role = \"ctb\") )", + "Authors@R": "c( person(\"David\", \"Gohel\", , \"david.gohel@ardata.fr\", role = c(\"aut\", \"cre\")), person(\"Stefan\", \"Moog\", , \"moogs@gmx.de\", role = \"aut\"), person(\"Mark\", \"Heckmann\", , \"heckmann.mark@gmail.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-0736-7417\")), person(\"ArData\", role = \"cph\"), person(\"Frank\", \"Hangler\", , \"frank@plotandscatter.com\", role = \"ctb\", comment = \"function body_replace_all_text\"), person(\"Liz\", \"Sander\", , \"lsander@civisanalytics.com\", role = \"ctb\", comment = \"several documentation fixes\"), person(\"Anton\", \"Victorson\", , \"anton@victorson.se\", role = \"ctb\", comment = \"fixes xml structures\"), person(\"Jon\", \"Calder\", , \"jonmcalder@gmail.com\", role = \"ctb\", comment = \"update vignettes\"), person(\"John\", \"Harrold\", , \"john.m.harrold@gmail.com\", role = \"ctb\", comment = \"function annotate_base\"), person(\"John\", \"Muschelli\", , \"muschellij2@gmail.com\", role = \"ctb\", comment = \"google doc compatibility\"), person(\"Bill\", \"Denney\", , \"wdenney@humanpredictions.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5759-428X\", \"function as.matrix.rpptx\")), person(\"Nikolai\", \"Beck\", , \"beck.nikolai@gmail.com\", role = \"ctb\", comment = \"set speaker notes for .pptx documents\"), person(\"Greg\", \"Leleu\", , \"gregoire.leleu@gmail.com\", role = \"ctb\", comment = \"fields functionality in ppt\"), person(\"Majid\", \"Eismann\", role = \"ctb\"), person(\"Hongyuan\", \"Jia\", , \"hongyuanjia@cqust.edu.cn\", role = \"ctb\", comment = c(ORCID = \"0000-0002-0075-8183\")), person(\"Michael\", \"Stackhouse\", , \"mike.stackhouse@atorusresearch.com\", role = \"ctb\") )", "Description": "Access and manipulate 'Microsoft Word', 'RTF' and 'Microsoft PowerPoint' documents from R. The package focuses on tabular and graphical reporting from R; it also provides two functions that let users get document content into data objects. A set of functions lets add and remove images, tables and paragraphs of text in new or existing documents. The package does not require any installation of Microsoft products to be able to write Microsoft files.", "License": "MIT + file LICENSE", "URL": "https://ardata-fr.github.io/officeverse/, https://davidgohel.github.io/officer/", @@ -5842,7 +5831,7 @@ "RoxygenNote": "7.3.3", "Collate": "'core_properties.R' 'custom_properties.R' 'defunct.R' 'dev-utils.R' 'docx_add.R' 'docx_comments.R' 'docx_cursor.R' 'docx_part.R' 'docx_replace.R' 'docx_section.R' 'docx_settings.R' 'docx_styles.R' 'docx_utils_funs.R' 'empty_content.R' 'formatting_properties.R' 'fortify_docx.R' 'fortify_pptx.R' 'knitr_utils.R' 'officer.R' 'ooxml.R' 'ooxml_block_objects.R' 'ooxml_run_objects.R' 'openxml_content_type.R' 'openxml_document.R' 'pack_folder.R' 'ph_location.R' 'post-proc.R' 'ppt_class_dir_collection.R' 'ppt_classes.R' 'ppt_notes.R' 'ppt_ph_dedupe_layout.R' 'ppt_ph_manipulate.R' 'ppt_ph_rename_layout.R' 'ppt_ph_with_methods.R' 'pptx_informations.R' 'pptx_layout_helper.R' 'pptx_matrix.R' 'utils.R' 'pptx_slide_manip.R' 'read_docx.R' 'docx_write.R' 'read_docx_styles.R' 'read_pptx.R' 'read_xlsx.R' 'relationship.R' 'rtf.R' 'shape_properties.R' 'shorcuts.R' 'docx_append_context.R' 'utils-xml.R' 'deprecated.R' 'zzz.R'", "NeedsCompilation": "no", - "Author": "David Gohel [aut, cre], Stefan Moog [aut], Mark Heckmann [aut] (ORCID: ), ArData [cph], Frank Hangler [ctb] (function body_replace_all_text), Liz Sander [ctb] (several documentation fixes), Anton Victorson [ctb] (fixes xml structures), Jon Calder [ctb] (update vignettes), John Harrold [ctb] (function annotate_base), John Muschelli [ctb] (google doc compatibility), Bill Denney [ctb] (ORCID: , function as.matrix.rpptx), Nikolai Beck [ctb] (set speaker notes for .pptx documents), Greg Leleu [ctb] (fields functionality in ppt), Majid Eismann [ctb], Wahiduzzaman Khan [ctb] (vectorization of remove_slide), Hongyuan Jia [ctb] (ORCID: ), Michael Stackhouse [ctb]", + "Author": "David Gohel [aut, cre], Stefan Moog [aut], Mark Heckmann [aut] (ORCID: ), ArData [cph], Frank Hangler [ctb] (function body_replace_all_text), Liz Sander [ctb] (several documentation fixes), Anton Victorson [ctb] (fixes xml structures), Jon Calder [ctb] (update vignettes), John Harrold [ctb] (function annotate_base), John Muschelli [ctb] (google doc compatibility), Bill Denney [ctb] (ORCID: , function as.matrix.rpptx), Nikolai Beck [ctb] (set speaker notes for .pptx documents), Greg Leleu [ctb] (fields functionality in ppt), Majid Eismann [ctb], Hongyuan Jia [ctb] (ORCID: ), Michael Stackhouse [ctb]", "Maintainer": "David Gohel ", "Repository": "CRAN" }, @@ -5915,7 +5904,7 @@ }, "openxlsx2": { "Package": "openxlsx2", - "Version": "1.23.1", + "Version": "1.22", "Source": "Repository", "Type": "Package", "Title": "Read, Write and Edit 'xlsx' Files", @@ -6234,7 +6223,7 @@ }, "performance": { "Package": "performance", - "Version": "0.16.0", + "Version": "0.15.3", "Source": "Repository", "Type": "Package", "Title": "Assessment of Regression Models Performance", @@ -6249,7 +6238,7 @@ ], "Imports": [ "bayestestR (>= 0.17.0)", - "insight (>= 1.4.4)", + "insight (>= 1.4.2)", "datawizard (>= 1.3.0)", "stats", "methods", @@ -6326,7 +6315,7 @@ "rstanarm", "rstantools", "sandwich", - "see (>= 0.13.0)", + "see (>= 0.9.0)", "survey", "survival", "testthat (>= 3.2.1)", @@ -6456,7 +6445,7 @@ }, "plotly": { "Package": "plotly", - "Version": "4.12.0", + "Version": "4.11.0", "Source": "Repository", "Title": "Create Interactive Web Graphics via 'plotly.js'", "Authors@R": "c(person(\"Carson\", \"Sievert\", role = c(\"aut\", \"cre\"), email = \"cpsievert1@gmail.com\", comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Chris\", \"Parmer\", role = \"aut\", email = \"chris@plot.ly\"), person(\"Toby\", \"Hocking\", role = \"aut\", email = \"tdhock5@gmail.com\"), person(\"Scott\", \"Chamberlain\", role = \"aut\", email = \"myrmecocystus@gmail.com\"), person(\"Karthik\", \"Ram\", role = \"aut\", email = \"karthik.ram@gmail.com\"), person(\"Marianne\", \"Corvellec\", role = \"aut\", email = \"marianne.corvellec@igdore.org\", comment = c(ORCID = \"0000-0002-1994-3581\")), person(\"Pedro\", \"Despouy\", role = \"aut\", email = \"pedro@plot.ly\"), person(\"Salim\", \"Brüggemann\", role = \"ctb\", email = \"salim-b@pm.me\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Plotly Technologies Inc.\", role = \"cph\"))", @@ -6465,7 +6454,7 @@ "URL": "https://plotly-r.com, https://github.com/plotly/plotly.R, https://plotly.com/r/", "BugReports": "https://github.com/plotly/plotly.R/issues", "Depends": [ - "R (>= 3.5.0)", + "R (>= 3.2.0)", "ggplot2 (>= 3.0.0)" ], "Imports": [ @@ -6523,7 +6512,7 @@ "ggridges" ], "LazyData": "true", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "Encoding": "UTF-8", "Config/Needs/check": "tidyverse/ggplot2, ggobi/GGally, rcmdcheck, devtools, reshape2, s2", "NeedsCompilation": "no", @@ -6591,7 +6580,7 @@ }, "polylabelr": { "Package": "polylabelr", - "Version": "1.0.0", + "Version": "0.3.0", "Source": "Repository", "Title": "Find the Pole of Inaccessibility (Visual Center) of a Polygon", "Authors@R": "c(person(given = \"Johan\", family = \"Larsson\", role = c(\"aut\", \"cre\"), email = \"johanlarsson@outlook.com\", comment = c(ORCID = \"0000-0002-4029-5945\")), person(given = \"Kent\", family = \"Johnson\", role = \"ctb\", email = \"kent@kentsjohnson.com\"), person(\"Mapbox\", role = \"cph\", comment = \"polylabel, variant, and geometry libraries\"))", @@ -6610,7 +6599,7 @@ "Imports": [ "Rcpp" ], - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "Suggests": [ "covr", "testthat", @@ -6619,7 +6608,7 @@ ], "Language": "en-US", "NeedsCompilation": "yes", - "Author": "Johan Larsson [aut, cre] (ORCID: ), Kent Johnson [ctb], Mapbox [cph] (polylabel, variant, and geometry libraries)", + "Author": "Johan Larsson [aut, cre] (), Kent Johnson [ctb], Mapbox [cph] (polylabel, variant, and geometry libraries)", "Maintainer": "Johan Larsson ", "Repository": "CRAN" }, @@ -6800,11 +6789,11 @@ }, "proxy": { "Package": "proxy", - "Version": "0.4-29", + "Version": "0.4-27", "Source": "Repository", "Type": "Package", "Title": "Distance and Similarity Measures", - "Authors@R": "c(person(given = \"David\", family = \"Meyer\", role = c(\"aut\", \"cre\"), email = \"David.Meyer@R-project.org\", comment = c(ORCID = \"0000-0002-5196-3048\")),\t person(given = \"Christian\", family = \"Buchta\", role = \"aut\"))", + "Authors@R": "c(person(given = \"David\", family = \"Meyer\", role = c(\"aut\", \"cre\"), email = \"David.Meyer@R-project.org\"), person(given = \"Christian\", family = \"Buchta\", role = \"aut\"))", "Description": "Provides an extensible framework for the efficient calculation of auto- and cross-proximities, along with implementations of the most popular ones.", "Depends": [ "R (>= 3.4.0)" @@ -6817,9 +6806,9 @@ "cba" ], "Collate": "registry.R database.R dist.R similarities.R dissimilarities.R util.R seal.R", - "License": "GPL-2 | GPL-3", + "License": "GPL-2", "NeedsCompilation": "yes", - "Author": "David Meyer [aut, cre] (ORCID: ), Christian Buchta [aut]", + "Author": "David Meyer [aut, cre], Christian Buchta [aut]", "Maintainer": "David Meyer ", "Repository": "CRAN" }, @@ -6864,7 +6853,7 @@ }, "purrr": { "Package": "purrr", - "Version": "1.2.1", + "Version": "1.2.0", "Source": "Repository", "Title": "Functional Programming Tools", "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"https://ror.org/03wc8by49\")) )", @@ -7153,45 +7142,43 @@ }, "rappdirs": { "Package": "rappdirs", - "Version": "0.3.4", + "Version": "0.3.3", "Source": "Repository", "Type": "Package", "Title": "Application Directories: Determine Where to Save Data, Caches, and Logs", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"trl\", \"cre\", \"cph\")), person(\"Sridhar\", \"Ratnakumar\", role = \"aut\"), person(\"Trent\", \"Mick\", role = \"aut\"), person(\"ActiveState\", role = \"cph\", comment = \"R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs\"), person(\"Eddy\", \"Petrisor\", role = \"ctb\"), person(\"Trevor\", \"Davis\", role = c(\"trl\", \"aut\"), comment = c(ORCID = \"0000-0001-6341-4639\")), person(\"Gabor\", \"Csardi\", role = \"ctb\"), person(\"Gregory\", \"Jefferis\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Authors@R": "c(person(given = \"Hadley\", family = \"Wickham\", role = c(\"trl\", \"cre\", \"cph\"), email = \"hadley@rstudio.com\"), person(given = \"RStudio\", role = \"cph\"), person(given = \"Sridhar\", family = \"Ratnakumar\", role = \"aut\"), person(given = \"Trent\", family = \"Mick\", role = \"aut\"), person(given = \"ActiveState\", role = \"cph\", comment = \"R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs\"), person(given = \"Eddy\", family = \"Petrisor\", role = \"ctb\"), person(given = \"Trevor\", family = \"Davis\", role = c(\"trl\", \"aut\")), person(given = \"Gabor\", family = \"Csardi\", role = \"ctb\"), person(given = \"Gregory\", family = \"Jefferis\", role = \"ctb\"))", "Description": "An easy way to determine which directories on the users computer you should use to save data, caches and logs. A port of Python's 'Appdirs' () to R.", "License": "MIT + file LICENSE", "URL": "https://rappdirs.r-lib.org, https://github.com/r-lib/rappdirs", "BugReports": "https://github.com/r-lib/rappdirs/issues", "Depends": [ - "R (>= 4.1)" + "R (>= 3.2)" ], "Suggests": [ - "covr", "roxygen2", - "testthat (>= 3.2.0)", + "testthat (>= 3.0.0)", + "covr", "withr" ], - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Config/usethis/last-upkeep": "2025-05-05", - "Copyright": "Original python appdirs module copyright (c) 2010 ActiveState Software Inc. R port copyright Hadley Wickham, Posit, PBC. See file LICENSE for details.", + "Copyright": "Original python appdirs module copyright (c) 2010 ActiveState Software Inc. R port copyright Hadley Wickham, RStudio. See file LICENSE for details.", "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.1.1", + "Config/testthat/edition": "3", "NeedsCompilation": "yes", - "Author": "Hadley Wickham [trl, cre, cph], Sridhar Ratnakumar [aut], Trent Mick [aut], ActiveState [cph] (R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs), Eddy Petrisor [ctb], Trevor Davis [trl, aut] (ORCID: ), Gabor Csardi [ctb], Gregory Jefferis [ctb], Posit Software, PBC [cph, fnd] (ROR: )", - "Maintainer": "Hadley Wickham ", + "Author": "Hadley Wickham [trl, cre, cph], RStudio [cph], Sridhar Ratnakumar [aut], Trent Mick [aut], ActiveState [cph] (R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs), Eddy Petrisor [ctb], Trevor Davis [trl, aut], Gabor Csardi [ctb], Gregory Jefferis [ctb]", + "Maintainer": "Hadley Wickham ", "Repository": "CRAN" }, "rbibutils": { "Package": "rbibutils", - "Version": "2.4.1", + "Version": "2.4", "Source": "Repository", "Type": "Package", "Title": "Read 'Bibtex' Files and Convert Between Bibliography Formats", - "Authors@R": "c( person(given = c(\"Georgi\", \"N.\"), family = \"Boshnakov\", role = c(\"aut\", \"cre\"), \t email = \"georgi.boshnakov@manchester.ac.uk\", comment = c(ORCID = \"0000-0003-2839-346X\", \"R port, R code, new C code and modifications to bibutils' C code, conversion to Bibentry (R and C code)\") ), person(given = \"Chris\", family = \"Putman\", role = \"aut\", comment = \"src/*, author of the bibutils libraries, https://sourceforge.net/projects/bibutils/\"), person(given = \"Richard\", family = \"Mathar\", role = \"ctb\", comment = \"src/addsout.c\"), person(given = \"Johannes\", family = \"Wilm\", role = \"ctb\", comment = \"src/biblatexin.c, src/bltypes.c\"), person(\"R Core Team\", role = \"ctb\", comment = \"base R's bibentry and bibstyle implementation\") )", + "Authors@R": "c( person(given = c(\"Georgi\", \"N.\"), family = \"Boshnakov\", role = c(\"aut\", \"cre\"), \t email = \"georgi.boshnakov@manchester.ac.uk\", comment = c(\"R port, R code, new C code and modifications to bibutils' C code, conversion to Bibentry (R and C code)\", comment = c(ORCID = \"0000-0003-2839-346X\")) ), person(given = \"Chris\", family = \"Putman\", role = \"aut\", comment = \"src/*, author of the bibutils libraries, https://sourceforge.net/projects/bibutils/\"), person(given = \"Richard\", family = \"Mathar\", role = \"ctb\", comment = \"src/addsout.c\"), person(given = \"Johannes\", family = \"Wilm\", role = \"ctb\", comment = \"src/biblatexin.c, src/bltypes.c\"), person(\"R Core Team\", role = \"ctb\", comment = \"base R's bibentry and bibstyle implementation\") )", "Description": "Read and write 'Bibtex' files. Convert between bibliography formats, including 'Bibtex', 'Biblatex', 'PubMed', 'Endnote', and 'Bibentry'. Includes a port of the 'bibutils' utilities by Chris Putnam . Supports all bibliography formats and character encodings implemented in 'bibutils'.", "License": "GPL-2", - "URL": "https://geobosh.github.io/rbibutils/ (doc), https://CRAN.R-project.org/package=rbibutils", + "URL": "https://geobosh.github.io/rbibutils/ (doc), https://github.com/GeoBosh/rbibutils (devel)", "BugReports": "https://github.com/GeoBosh/rbibutils/issues", "Depends": [ "R (>= 2.10)" @@ -7206,7 +7193,7 @@ "Encoding": "UTF-8", "NeedsCompilation": "yes", "Config/Needs/memcheck": "devtools, rcmdcheck", - "Author": "Georgi N. Boshnakov [aut, cre] (ORCID: , R port, R code, new C code and modifications to bibutils' C code, conversion to Bibentry (R and C code)), Chris Putman [aut] (src/*, author of the bibutils libraries, https://sourceforge.net/projects/bibutils/), Richard Mathar [ctb] (src/addsout.c), Johannes Wilm [ctb] (src/biblatexin.c, src/bltypes.c), R Core Team [ctb] (base R's bibentry and bibstyle implementation)", + "Author": "Georgi N. Boshnakov [aut, cre] (R port, R code, new C code and modifications to bibutils' C code, conversion to Bibentry (R and C code), comment.ORCID: 0000-0003-2839-346X), Chris Putman [aut] (src/*, author of the bibutils libraries, https://sourceforge.net/projects/bibutils/), Richard Mathar [ctb] (src/addsout.c), Johannes Wilm [ctb] (src/biblatexin.c, src/bltypes.c), R Core Team [ctb] (base R's bibentry and bibstyle implementation)", "Maintainer": "Georgi N. Boshnakov ", "Repository": "CRAN" }, @@ -7333,31 +7320,29 @@ }, "readr": { "Package": "readr", - "Version": "2.2.0", + "Version": "2.1.6", "Source": "Repository", "Title": "Read Rectangular Text Data", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Romain\", \"Francois\", role = \"ctb\"), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Shelby\", \"Bearrows\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"https://github.com/mandreyel/\", role = \"cph\", comment = \"mio library\"), person(\"Jukka\", \"Jylänki\", role = c(\"ctb\", \"cph\"), comment = \"grisu3 implementation\"), person(\"Mikkel\", \"Jørgensen\", role = c(\"ctb\", \"cph\"), comment = \"grisu3 implementation\") )", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Romain\", \"Francois\", role = \"ctb\"), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Shelby\", \"Bearrows\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"https://github.com/mandreyel/\", role = \"cph\", comment = \"mio library\"), person(\"Jukka\", \"Jylänki\", role = c(\"ctb\", \"cph\"), comment = \"grisu3 implementation\"), person(\"Mikkel\", \"Jørgensen\", role = c(\"ctb\", \"cph\"), comment = \"grisu3 implementation\") )", "Description": "The goal of 'readr' is to provide a fast and friendly way to read rectangular data (like 'csv', 'tsv', and 'fwf'). It is designed to flexibly parse many types of data found in the wild, while still cleanly failing when data unexpectedly changes.", "License": "MIT + file LICENSE", "URL": "https://readr.tidyverse.org, https://github.com/tidyverse/readr", "BugReports": "https://github.com/tidyverse/readr/issues", "Depends": [ - "R (>= 4.1)" + "R (>= 3.6)" ], "Imports": [ - "cli", + "cli (>= 3.2.0)", "clipr", "crayon", - "glue", "hms (>= 0.4.1)", - "lifecycle", + "lifecycle (>= 0.2.0)", "methods", "R6", "rlang", "tibble", "utils", - "vroom (>= 1.7.0)", - "withr" + "vroom (>= 1.6.0)" ], "Suggests": [ "covr", @@ -7370,6 +7355,7 @@ "testthat (>= 3.2.0)", "tzdb (>= 0.1.1)", "waldo", + "withr", "xml2" ], "LinkingTo": [ @@ -7380,12 +7366,11 @@ "Config/Needs/website": "tidyverse, tidyverse/tidytemplate", "Config/testthat/edition": "3", "Config/testthat/parallel": "false", - "Config/usethis/last-upkeep": "2025-11-14", "Encoding": "UTF-8", "Language": "en-US", "RoxygenNote": "7.3.3", "NeedsCompilation": "yes", - "Author": "Hadley Wickham [aut], Jim Hester [aut], Romain Francois [ctb], Jennifer Bryan [aut, cre] (ORCID: ), Shelby Bearrows [ctb], Posit Software, PBC [cph, fnd] (ROR: ), https://github.com/mandreyel/ [cph] (mio library), Jukka Jylänki [ctb, cph] (grisu3 implementation), Mikkel Jørgensen [ctb, cph] (grisu3 implementation)", + "Author": "Hadley Wickham [aut], Jim Hester [aut], Romain Francois [ctb], Jennifer Bryan [aut, cre] (ORCID: ), Shelby Bearrows [ctb], Posit Software, PBC [cph, fnd], https://github.com/mandreyel/ [cph] (mio library), Jukka Jylänki [ctb, cph] (grisu3 implementation), Mikkel Jørgensen [ctb, cph] (grisu3 implementation)", "Maintainer": "Jennifer Bryan ", "Repository": "CRAN" }, @@ -7431,10 +7416,10 @@ }, "reformulas": { "Package": "reformulas", - "Version": "0.4.4", + "Version": "0.4.2", "Source": "Repository", "Title": "Machinery for Processing Random Effect Formulas", - "Authors@R": "c( person(given = \"Ben\", family = \"Bolker\", role = c(\"aut\", \"cre\"), email = \"bolker@mcmaster.ca\", comment=c(ORCID=\"0000-0002-2127-0443\")), person(\"Anna\", \"Ly\", role = \"ctb\", comment = c(ORCID = \"0000-0002-0210-0342\")) )", + "Authors@R": "person(given = \"Ben\", family = \"Bolker\", role = c(\"aut\", \"cre\"), email = \"bolker@mcmaster.ca\", comment=c(ORCID=\"0000-0002-2127-0443\"))", "Description": "Takes formulas including random-effects components (formatted as in 'lme4', 'glmmTMB', etc.) and processes them. Includes various helper functions.", "URL": "https://github.com/bbolker/reformulas", "License": "GPL-3", @@ -7449,13 +7434,11 @@ "Suggests": [ "lme4", "tinytest", - "glmmTMB", - "Formula" + "glmmTMB" ], - "RoxygenNote": "7.3.3", - "Config/testthat/edition": "3", + "RoxygenNote": "7.3.2.9000", "NeedsCompilation": "no", - "Author": "Ben Bolker [aut, cre] (ORCID: ), Anna Ly [ctb] (ORCID: )", + "Author": "Ben Bolker [aut, cre] (ORCID: )", "Maintainer": "Ben Bolker ", "Repository": "CRAN" }, @@ -7541,7 +7524,7 @@ }, "renv": { "Package": "renv", - "Version": "1.1.7", + "Version": "1.1.5", "Source": "Repository", "Type": "Package", "Title": "Project Environments", @@ -7559,7 +7542,6 @@ "compiler", "covr", "cpp11", - "curl", "devtools", "generics", "gitcreds", @@ -7583,7 +7565,7 @@ "webfakes" ], "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "VignetteBuilder": "knitr", "Config/Needs/website": "tidyverse/tidytemplate", "Config/testthat/edition": "3", @@ -7596,7 +7578,7 @@ }, "report": { "Package": "report", - "Version": "0.6.3", + "Version": "0.6.2", "Source": "Repository", "Type": "Package", "Title": "Automated Reporting of Results and Statistical Models", @@ -7753,7 +7735,7 @@ }, "rlang": { "Package": "rlang", - "Version": "1.1.7", + "Version": "1.1.6", "Source": "Repository", "Title": "Functions for Base Types and Core R and 'Tidyverse' Features", "Description": "A toolbox for working with base types, core R features like the condition system, and core 'Tidyverse' features like tidy evaluation.", @@ -7762,7 +7744,7 @@ "ByteCompile": "true", "Biarch": "true", "Depends": [ - "R (>= 4.0.0)" + "R (>= 3.5.0)" ], "Imports": [ "utils" @@ -7791,7 +7773,7 @@ "winch" ], "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "URL": "https://rlang.r-lib.org, https://github.com/r-lib/rlang", "BugReports": "https://github.com/r-lib/rlang/issues", "Config/build/compilation-database": "true", @@ -7860,10 +7842,10 @@ }, "robustbase": { "Package": "robustbase", - "Version": "0.99-7", + "Version": "0.99-6", "Source": "Repository", - "VersionNote": "Released 0.99-6 on 2025-09-03, 0.99-5 on 2024-11-01, 0.99-4-1 on 2024-09-24, 0.99-4 on 2024-08-19 to CRAN", - "Date": "2026-02-03", + "VersionNote": "Released 0.99-5 on 2024-11-01, 0.99-4-1 on 2024-09-24, 0.99-4 on 2024-08-19, 0.99-3 on 2024-07-01 to CRAN", + "Date": "2025-09-03", "Title": "Basic Robust Statistics", "Authors@R": "c(person(\"Martin\",\"Maechler\", role=c(\"aut\",\"cre\"), email=\"maechler@stat.math.ethz.ch\", comment = c(ORCID = \"0000-0002-8685-9910\")) , person(\"Peter\", \"Rousseeuw\", role=\"ctb\", comment = \"Qn and Sn\") , person(\"Christophe\", \"Croux\", role=\"ctb\", comment = \"Qn and Sn\") , person(\"Valentin\", \"Todorov\", role = \"aut\", email = \"valentin.todorov@chello.at\", comment = \"most robust Cov\") , person(\"Andreas\", \"Ruckstuhl\", role = \"aut\", email = \"andreas.ruckstuhl@zhaw.ch\", comment = \"nlrob, anova, glmrob\") , person(\"Matias\", \"Salibian-Barrera\", role = \"aut\", email = \"matias@stat.ubc.ca\", comment = \"lmrob orig.\") , person(\"Tobias\", \"Verbeke\", role = c(\"ctb\",\"fnd\"), email = \"tobias.verbeke@openanalytics.eu\", comment = \"mc, adjbox\") , person(\"Manuel\", \"Koller\", role = \"aut\", email = \"koller.manuel@gmail.com\", comment = \"mc, lmrob, psi-func.\") , person(c(\"Eduardo\", \"L. T.\"), \"Conceicao\", role = \"aut\", email = \"mail@eduardoconceicao.org\", comment = \"MM-, tau-, CM-, and MTL- nlrob\") , person(\"Maria\", \"Anna di Palma\", role = \"ctb\", comment = \"initial version of Comedian\") )", "URL": "https://robustbase.R-forge.R-project.org/, https://R-forge.R-project.org/R/?group_id=59, https://R-forge.R-project.org/scm/viewvc.php/pkg/robustbase/?root=robustbase, svn://svn.r-forge.r-project.org/svnroot/robustbase/pkg/robustbase", @@ -7980,7 +7962,7 @@ }, "rstudioapi": { "Package": "rstudioapi", - "Version": "0.18.0", + "Version": "0.17.1", "Source": "Repository", "Title": "Safely Access the RStudio API", "Description": "Access the RStudio API (if available) and provide informative error messages when it's not.", @@ -7989,16 +7971,13 @@ "License": "MIT + file LICENSE", "URL": "https://rstudio.github.io/rstudioapi/, https://github.com/rstudio/rstudioapi", "BugReports": "https://github.com/rstudio/rstudioapi/issues", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.2", "Suggests": [ "testthat", "knitr", "rmarkdown", "clipr", - "covr", - "curl", - "jsonlite", - "withr" + "covr" ], "VignetteBuilder": "knitr", "Encoding": "UTF-8", @@ -8088,12 +8067,12 @@ }, "see": { "Package": "see", - "Version": "0.13.0", + "Version": "0.12.0", "Source": "Repository", "Type": "Package", "Title": "Model Visualisation Toolbox for 'easystats' and 'ggplot2'", - "Authors@R": "c(person(given = \"Daniel\", family = \"Lüdecke\", role = c(\"aut\", \"cre\"), email = \"officialeasystats@gmail.com\", comment = c(ORCID = \"0000-0002-8895-3206\")), person(given = \"Dominique\", family = \"Makowski\", role = c(\"aut\", \"inv\"), email = \"dom.makowski@gmail.com\", comment = c(ORCID = \"0000-0001-5375-9967\")), person(given = \"Indrajeet\", family = \"Patil\", role = c(\"aut\"), email = \"patilindrajeet.science@gmail.com\", comment = c(ORCID = \"0000-0003-1995-6531\")), person(given = \"Mattan S.\", family = \"Ben-Shachar\", role = c(\"aut\", \"ctb\"), email = \"matanshm@post.bgu.ac.il\", comment = c(ORCID = \"0000-0002-4287-4801\")), person(given = \"Brenton M.\", family = \"Wiernik\", role = c(\"aut\", \"ctb\"), email = \"brenton@wiernik.org\", comment = c(ORCID = \"0000-0001-9560-6336\")), person(given = \"Rémi\", family = \"Thériault\", role = c(\"aut\", \"ctb\"), email = \"remi.theriault@mail.mcgill.ca\", comment = c(ORCID = \"0000-0003-4315-6788\")), person(given = \"Philip\", family = \"Waggoner\", role = c(\"aut\", \"ctb\"), email = \"philip.waggoner@gmail.com\", comment = c(ORCID = \"0000-0002-7825-7573\")), person(given = \"Jeffrey R.\", family = \"Stevens\", role = \"ctb\", email = \"jeffrey.r.stevens@gmail.com\", comment = c(ORCID = \"0000-0003-2375-1360\")), person(given = \"Matthew\", family = \"Smith\", role = \"rev\", email = \"M.Smith3@napier.ac.uk\"), person(given = \"Jakob\", family = \"Bossek\", role = \"rev\", email = \"bossek@wi.uni-muenster.de\"))", - "Maintainer": "Daniel Lüdecke ", + "Authors@R": "c(person(given = \"Daniel\", family = \"Lüdecke\", role = c(\"aut\", \"ctb\"), email = \"d.luedecke@uke.de\", comment = c(ORCID = \"0000-0002-8895-3206\")), person(given = \"Dominique\", family = \"Makowski\", role = c(\"aut\", \"inv\"), email = \"dom.makowski@gmail.com\", comment = c(ORCID = \"0000-0001-5375-9967\")), person(given = \"Indrajeet\", family = \"Patil\", role = c(\"aut\", \"cre\"), email = \"patilindrajeet.science@gmail.com\", comment = c(ORCID = \"0000-0003-1995-6531\")), person(given = \"Mattan S.\", family = \"Ben-Shachar\", role = c(\"aut\", \"ctb\"), email = \"matanshm@post.bgu.ac.il\", comment = c(ORCID = \"0000-0002-4287-4801\")), person(given = \"Brenton M.\", family = \"Wiernik\", role = c(\"aut\", \"ctb\"), email = \"brenton@wiernik.org\", comment = c(ORCID = \"0000-0001-9560-6336\")), person(given = \"Rémi\", family = \"Thériault\", role = c(\"aut\", \"ctb\"), email = \"remi.theriault@mail.mcgill.ca\", comment = c(ORCID = \"0000-0003-4315-6788\")), person(given = \"Philip\", family = \"Waggoner\", role = c(\"aut\", \"ctb\"), email = \"philip.waggoner@gmail.com\", comment = c(ORCID = \"0000-0002-7825-7573\")), person(given = \"Jeffrey R.\", family = \"Stevens\", role = \"ctb\", email = \"jeffrey.r.stevens@gmail.com\", comment = c(ORCID = \"0000-0003-2375-1360\")), person(given = \"Matthew\", family = \"Smith\", role = \"rev\", email = \"M.Smith3@napier.ac.uk\"), person(given = \"Jakob\", family = \"Bossek\", role = \"rev\", email = \"bossek@wi.uni-muenster.de\"))", + "Maintainer": "Indrajeet Patil ", "Description": "Provides plotting utilities supporting packages in the 'easystats' ecosystem () and some extra themes, geoms, and scales for 'ggplot2'. Color scales are based on . References: Lüdecke et al. (2021) .", "License": "MIT + file LICENSE", "URL": "https://easystats.github.io/see/", @@ -8107,14 +8086,14 @@ "Imports": [ "bayestestR (>= 0.17.0)", "correlation (>= 0.8.8)", - "datawizard (>= 1.3.0)", + "datawizard (>= 1.2.0)", "effectsize (>= 1.0.1)", - "ggplot2 (>= 4.0.1)", - "insight (>= 1.4.4)", - "modelbased (>= 0.13.1)", + "ggplot2 (>= 4.0.0)", + "insight (>= 1.4.1)", + "modelbased (>= 0.13.0)", "patchwork (>= 1.3.2)", - "parameters (>= 0.28.3)", - "performance (>= 0.15.3)" + "parameters (>= 0.28.1)", + "performance (>= 0.15.1)" ], "Suggests": [ "BH", @@ -8168,23 +8147,23 @@ "Config/Needs/website": "easystats/easystatstemplate", "Config/rcmdcheck/ignore-inconsequential-notes": "true", "NeedsCompilation": "no", - "Author": "Daniel Lüdecke [aut, cre] (ORCID: ), Dominique Makowski [aut, inv] (ORCID: ), Indrajeet Patil [aut] (ORCID: ), Mattan S. Ben-Shachar [aut, ctb] (ORCID: ), Brenton M. Wiernik [aut, ctb] (ORCID: ), Rémi Thériault [aut, ctb] (ORCID: ), Philip Waggoner [aut, ctb] (ORCID: ), Jeffrey R. Stevens [ctb] (ORCID: ), Matthew Smith [rev], Jakob Bossek [rev]", + "Author": "Daniel Lüdecke [aut, ctb] (ORCID: ), Dominique Makowski [aut, inv] (ORCID: ), Indrajeet Patil [aut, cre] (ORCID: ), Mattan S. Ben-Shachar [aut, ctb] (ORCID: ), Brenton M. Wiernik [aut, ctb] (ORCID: ), Rémi Thériault [aut, ctb] (ORCID: ), Philip Waggoner [aut, ctb] (ORCID: ), Jeffrey R. Stevens [ctb] (ORCID: ), Matthew Smith [rev], Jakob Bossek [rev]", "Repository": "CRAN" }, "shiny": { "Package": "shiny", - "Version": "1.13.0", + "Version": "1.12.1", "Source": "Repository", "Type": "Package", "Title": "Web Application Framework for R", "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"JJ\", \"Allaire\", , \"jj@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Garrick\", \"Aden-Buie\", , \"garrick@adenbuie.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Yihui\", \"Xie\", , \"yihui@posit.co\", role = \"aut\"), person(\"Jeff\", \"Allen\", role = \"aut\"), person(\"Jonathan\", \"McPherson\", , \"jonathan@posit.co\", role = \"aut\"), person(\"Alan\", \"Dipert\", role = \"aut\"), person(\"Barbara\", \"Borges\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(, \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library and jQuery UI library\"), person(, \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt\"), person(, \"jQuery UI contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery UI library; authors listed in inst/www/shared/jqueryui/AUTHORS.txt\"), person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"), person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Prem Nawaz\", \"Khan\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Victor\", \"Tsaran\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Dennis\", \"Lembree\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Srinivasu\", \"Chakravarthula\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Cathy\", \"O'Connor\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(, \"PayPal, Inc\", role = \"cph\", comment = \"Bootstrap accessibility plugin\"), person(\"Stefan\", \"Petre\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap-datepicker library\"), person(\"Andrew\", \"Rowls\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap-datepicker library\"), person(\"Brian\", \"Reavis\", role = c(\"ctb\", \"cph\"), comment = \"selectize.js library\"), person(\"Salmen\", \"Bejaoui\", role = c(\"ctb\", \"cph\"), comment = \"selectize-plugin-a11y library\"), person(\"Denis\", \"Ineshin\", role = c(\"ctb\", \"cph\"), comment = \"ion.rangeSlider library\"), person(\"Sami\", \"Samhuri\", role = c(\"ctb\", \"cph\"), comment = \"Javascript strftime library\"), person(, \"SpryMedia Limited\", role = c(\"ctb\", \"cph\"), comment = \"DataTables library\"), person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\"), person(\"R Core Team\", role = c(\"ctb\", \"cph\"), comment = \"tar implementation from R\") )", "Description": "Makes it incredibly easy to build interactive web applications with R. Automatic \"reactive\" binding between inputs and outputs and extensive prebuilt widgets make it possible to build beautiful, responsive, and powerful applications with minimal effort.", - "License": "MIT + file LICENSE", + "License": "GPL-3 | file LICENSE", "URL": "https://shiny.posit.co/, https://github.com/rstudio/shiny", "BugReports": "https://github.com/rstudio/shiny/issues", "Depends": [ "methods", - "R (>= 3.1.2)" + "R (>= 3.0.2)" ], "Imports": [ "bslib (>= 0.6.0)", @@ -8386,7 +8365,7 @@ }, "shinyjs": { "Package": "shinyjs", - "Version": "2.1.1", + "Version": "2.1.0", "Source": "Repository", "Title": "Easily Improve the User Experience of Your Shiny Apps in Seconds", "Authors@R": "person(\"Dean\", \"Attali\", email = \"daattali@gmail.com\", role = c(\"aut\", \"cre\"), comment= c(ORCID=\"0000-0002-5645-3493\"))", @@ -8411,10 +8390,10 @@ ], "License": "MIT + file LICENSE", "VignetteBuilder": "knitr", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.1.1", "Encoding": "UTF-8", "NeedsCompilation": "no", - "Author": "Dean Attali [aut, cre] (ORCID: )", + "Author": "Dean Attali [aut, cre] ()", "Maintainer": "Dean Attali ", "Repository": "CRAN" }, @@ -8775,10 +8754,10 @@ }, "tibble": { "Package": "tibble", - "Version": "3.3.1", + "Version": "3.3.0", "Source": "Repository", "Title": "Simple Data Frames", - "Authors@R": "c( person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = \"aut\"), person(\"Romain\", \"Francois\", , \"romain@r-enthusiasts.com\", role = \"ctb\"), person(\"Jennifer\", \"Bryan\", , \"jenny@rstudio.com\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Authors@R": "c(person(given = \"Kirill\", family = \"M\\u00fcller\", role = c(\"aut\", \"cre\"), email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(given = \"Hadley\", family = \"Wickham\", role = \"aut\", email = \"hadley@rstudio.com\"), person(given = \"Romain\", family = \"Francois\", role = \"ctb\", email = \"romain@r-enthusiasts.com\"), person(given = \"Jennifer\", family = \"Bryan\", role = \"ctb\", email = \"jenny@rstudio.com\"), person(given = \"RStudio\", role = c(\"cph\", \"fnd\")))", "Description": "Provides a 'tbl_df' class (the 'tibble') with stricter checking and better formatting than the traditional data frame.", "License": "MIT + file LICENSE", "URL": "https://tibble.tidyverse.org/, https://github.com/tidyverse/tibble", @@ -8823,37 +8802,36 @@ "withr" ], "VignetteBuilder": "knitr", - "Config/autostyle/rmd": "false", - "Config/autostyle/scope": "line_breaks", - "Config/autostyle/strict": "true", - "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", "Config/testthat/edition": "3", "Config/testthat/parallel": "true", "Config/testthat/start-first": "vignette-formats, as_tibble, add, invariants", - "Config/usethis/last-upkeep": "2025-06-07", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.3.9000", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "true", + "Config/autostyle/rmd": "false", + "Config/Needs/website": "tidyverse/tidytemplate", "NeedsCompilation": "yes", - "Author": "Kirill Müller [aut, cre] (ORCID: ), Hadley Wickham [aut], Romain Francois [ctb], Jennifer Bryan [ctb], Posit Software, PBC [cph, fnd] (ROR: )", + "Author": "Kirill Müller [aut, cre] (ORCID: ), Hadley Wickham [aut], Romain Francois [ctb], Jennifer Bryan [ctb], RStudio [cph, fnd]", "Maintainer": "Kirill Müller ", "Repository": "CRAN" }, "tidyr": { "Package": "tidyr", - "Version": "1.3.2", + "Version": "1.3.1", "Source": "Repository", "Title": "Tidy Messy Data", "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = \"aut\"), person(\"Maximilian\", \"Girlich\", role = \"aut\"), person(\"Kevin\", \"Ushey\", , \"kevin@posit.co\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", - "Description": "Tools to help to create tidy data, where each column is a variable, each row is an observation, and each cell contains a single value. 'tidyr' contains tools for changing the shape (pivoting) and hierarchy (nesting and 'unnesting') of a dataset, turning deeply nested lists into rectangular data frames ('rectangling'), and extracting values out of string columns. It also includes tools for working with missing values (both implicit and explicit).", + "Description": "Tools to help to create tidy data, where each column is a variable, each row is an observation, and each cell contains a single value. 'tidyr' contains tools for changing the shape (pivoting) and hierarchy (nesting and 'unnesting') of a dataset, turning deeply nested lists into rectangular data frames ('rectangling'), and extracting values out of string columns. It also includes tools for working with missing values (both implicit and explicit).", "License": "MIT + file LICENSE", "URL": "https://tidyr.tidyverse.org, https://github.com/tidyverse/tidyr", "BugReports": "https://github.com/tidyverse/tidyr/issues", "Depends": [ - "R (>= 4.1.0)" + "R (>= 3.6)" ], "Imports": [ "cli (>= 3.4.1)", - "dplyr (>= 1.1.0)", + "dplyr (>= 1.0.10)", "glue", "lifecycle (>= 1.0.3)", "magrittr", @@ -8861,7 +8839,7 @@ "rlang (>= 1.1.1)", "stringr (>= 1.5.0)", "tibble (>= 2.1.1)", - "tidyselect (>= 1.2.1)", + "tidyselect (>= 1.2.0)", "utils", "vctrs (>= 0.5.2)" ], @@ -8878,12 +8856,11 @@ "cpp11 (>= 0.4.0)" ], "VignetteBuilder": "knitr", - "Config/build/compilation-database": "true", "Config/Needs/website": "tidyverse/tidytemplate", "Config/testthat/edition": "3", "Encoding": "UTF-8", "LazyData": "true", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.3.0", "NeedsCompilation": "yes", "Author": "Hadley Wickham [aut, cre], Davis Vaughan [aut], Maximilian Girlich [aut], Kevin Ushey [ctb], Posit Software, PBC [cph, fnd]", "Maintainer": "Hadley Wickham ", @@ -8934,7 +8911,7 @@ }, "timechange": { "Package": "timechange", - "Version": "0.4.0", + "Version": "0.3.0", "Source": "Repository", "Title": "Efficient Manipulation of Date-Times", "Authors@R": "c(person(\"Vitalie\", \"Spinu\", email = \"spinuvit@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Google Inc.\", role = c(\"ctb\", \"cph\")))", @@ -8951,7 +8928,7 @@ "testthat (>= 0.7.1.99)", "knitr" ], - "SystemRequirements": "A system with zoneinfo data (e.g. /usr/share/zoneinfo). On Windows the zoneinfo included with R is used.", + "SystemRequirements": "A system with zoneinfo data (e.g. /usr/share/zoneinfo) as well as a recent-enough C++11 compiler (such as g++-4.8 or later). On Windows the zoneinfo included with R is used.", "BugReports": "https://github.com/vspinu/timechange/issues", "URL": "https://github.com/vspinu/timechange/", "RoxygenNote": "7.2.1", @@ -9147,10 +9124,10 @@ }, "uuid": { "Package": "uuid", - "Version": "1.2-2", + "Version": "1.2-1", "Source": "Repository", "Title": "Tools for Generating and Handling of UUIDs", - "Author": "Simon Urbanek [aut, cre, cph] (https://urbanek.org, ORCID: ), Theodore Ts'o [aut, cph] (libuuid)", + "Author": "Simon Urbanek [aut, cre, cph] (https://urbanek.org, ), Theodore Ts'o [aut, cph] (libuuid)", "Maintainer": "Simon Urbanek ", "Authors@R": "c(person(\"Simon\", \"Urbanek\", role=c(\"aut\",\"cre\",\"cph\"), email=\"Simon.Urbanek@r-project.org\", comment=c(\"https://urbanek.org\", ORCID=\"0000-0003-2297-1732\")), person(\"Theodore\",\"Ts'o\", email=\"tytso@thunk.org\", role=c(\"aut\",\"cph\"), comment=\"libuuid\"))", "Depends": [ @@ -9165,7 +9142,7 @@ }, "vctrs": { "Package": "vctrs", - "Version": "0.7.1", + "Version": "0.6.5", "Source": "Repository", "Title": "Vector Helpers", "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"aut\"), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = c(\"aut\", \"cre\")), person(\"data.table team\", role = \"cph\", comment = \"Radix sort based on data.table's forder() and their contribution to R's order()\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", @@ -9174,13 +9151,13 @@ "URL": "https://vctrs.r-lib.org/, https://github.com/r-lib/vctrs", "BugReports": "https://github.com/r-lib/vctrs/issues", "Depends": [ - "R (>= 4.0.0)" + "R (>= 3.5.0)" ], "Imports": [ "cli (>= 3.4.0)", "glue", "lifecycle (>= 1.0.3)", - "rlang (>= 1.1.7)" + "rlang (>= 1.1.0)" ], "Suggests": [ "bit64", @@ -9200,13 +9177,11 @@ "zeallot" ], "VignetteBuilder": "knitr", - "Config/build/compilation-database": "true", "Config/Needs/website": "tidyverse/tidytemplate", "Config/testthat/edition": "3", - "Config/testthat/parallel": "true", "Encoding": "UTF-8", "Language": "en-GB", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.2.3", "NeedsCompilation": "yes", "Author": "Hadley Wickham [aut], Lionel Henry [aut], Davis Vaughan [aut, cre], data.table team [cph] (Radix sort based on data.table's forder() and their contribution to R's order()), Posit Software, PBC [cph, fnd]", "Maintainer": "Davis Vaughan ", @@ -9260,11 +9235,11 @@ }, "viridisLite": { "Package": "viridisLite", - "Version": "0.4.3", + "Version": "0.4.2", "Source": "Repository", "Type": "Package", "Title": "Colorblind-Friendly Color Maps (Lite Version)", - "Date": "2026-02-03", + "Date": "2023-05-02", "Authors@R": "c( person(\"Simon\", \"Garnier\", email = \"garnier@njit.edu\", role = c(\"aut\", \"cre\")), person(\"Noam\", \"Ross\", email = \"noam.ross@gmail.com\", role = c(\"ctb\", \"cph\")), person(\"Bob\", \"Rudis\", email = \"bob@rud.is\", role = c(\"ctb\", \"cph\")), person(\"Marco\", \"Sciaini\", email = \"sciaini.marco@gmail.com\", role = c(\"ctb\", \"cph\")), person(\"Antônio Pedro\", \"Camargo\", role = c(\"ctb\", \"cph\")), person(\"Cédric\", \"Scherer\", email = \"scherer@izw-berlin.de\", role = c(\"ctb\", \"cph\")) )", "Maintainer": "Simon Garnier ", "Description": "Color maps designed to improve graph readability for readers with common forms of color blindness and/or color vision deficiency. The color maps are also perceptually-uniform, both in regular form and also when converted to black-and-white for printing. This is the 'lite' version of the 'viridis' package that also contains 'ggplot2' bindings for discrete and continuous color and fill scales and can be found at .", @@ -9281,20 +9256,20 @@ ], "URL": "https://sjmgarnier.github.io/viridisLite/, https://github.com/sjmgarnier/viridisLite/", "BugReports": "https://github.com/sjmgarnier/viridisLite/issues/", - "RoxygenNote": "7.3.3", + "RoxygenNote": "7.2.3", "NeedsCompilation": "no", "Author": "Simon Garnier [aut, cre], Noam Ross [ctb, cph], Bob Rudis [ctb, cph], Marco Sciaini [ctb, cph], Antônio Pedro Camargo [ctb, cph], Cédric Scherer [ctb, cph]", "Repository": "CRAN" }, "vroom": { "Package": "vroom", - "Version": "1.7.0", + "Version": "1.6.7", "Source": "Repository", "Title": "Read and Write Rectangular Text Data Quickly", "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Shelby\", \"Bearrows\", role = \"ctb\"), person(\"https://github.com/mandreyel/\", role = \"cph\", comment = \"mio library\"), person(\"Jukka\", \"Jylänki\", role = \"cph\", comment = \"grisu3 implementation\"), person(\"Mikkel\", \"Jørgensen\", role = \"cph\", comment = \"grisu3 implementation\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", "Description": "The goal of 'vroom' is to read and write data (like 'csv', 'tsv' and 'fwf') quickly. When reading it uses a quick initial indexing step, then reads the values lazily , so only the data you actually use needs to be read. The writer formats the data in parallel and writes to disk asynchronously from formatting.", "License": "MIT + file LICENSE", - "URL": "https://vroom.tidyverse.org, https://github.com/tidyverse/vroom", + "URL": "https://vroom.r-lib.org, https://github.com/tidyverse/vroom", "BugReports": "https://github.com/tidyverse/vroom/issues", "Depends": [ "R (>= 4.1)" @@ -9307,7 +9282,7 @@ "hms", "lifecycle (>= 1.0.3)", "methods", - "rlang (>= 1.1.0)", + "rlang (>= 0.4.2)", "stats", "tibble (>= 2.0.0)", "tidyselect", @@ -9352,7 +9327,6 @@ "Encoding": "UTF-8", "Language": "en-US", "RoxygenNote": "7.3.3", - "Config/build/compilation-database": "true", "NeedsCompilation": "yes", "Author": "Jim Hester [aut] (ORCID: ), Hadley Wickham [aut] (ORCID: ), Jennifer Bryan [aut, cre] (ORCID: ), Shelby Bearrows [ctb], https://github.com/mandreyel/ [cph] (mio library), Jukka Jylänki [cph] (grisu3 implementation), Mikkel Jørgensen [cph] (grisu3 implementation), Posit Software, PBC [cph, fnd] (ROR: )", "Maintainer": "Jennifer Bryan ", @@ -9425,7 +9399,7 @@ }, "xfun": { "Package": "xfun", - "Version": "0.56", + "Version": "0.54", "Source": "Repository", "Type": "Package", "Title": "Supporting Functions for Packages Maintained by 'Yihui Xie'", @@ -9458,7 +9432,7 @@ "magick", "yaml", "data.table", - "qs2" + "qs" ], "License": "MIT + file LICENSE", "URL": "https://github.com/yihui/xfun", @@ -9473,7 +9447,7 @@ }, "xml2": { "Package": "xml2", - "Version": "1.5.2", + "Version": "1.5.1", "Source": "Repository", "Title": "Parse XML", "Authors@R": "c( person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Jeroen\", \"Ooms\", email = \"jeroenooms@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"R Foundation\", role = \"ctb\", comment = \"Copy of R-project homepage cached as example\") )", @@ -9542,28 +9516,22 @@ }, "yaml": { "Package": "yaml", - "Version": "2.3.12", + "Version": "2.3.11", "Source": "Repository", "Type": "Package", "Title": "Methods to Convert R Data to YAML and Back", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"cre\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Shawn\", \"Garbett\", , \"shawn.garbett@vumc.org\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4079-5621\")), person(\"Jeremy\", \"Stephens\", role = c(\"aut\", \"ctb\")), person(\"Kirill\", \"Simonov\", role = \"aut\"), person(\"Yihui\", \"Xie\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Zhuoer\", \"Dong\", role = \"ctb\"), person(\"Jeffrey\", \"Horner\", role = \"ctb\"), person(\"reikoch\", role = \"ctb\"), person(\"Will\", \"Beasley\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5613-5006\")), person(\"Brendan\", \"O'Connor\", role = \"ctb\"), person(\"Michael\", \"Quinn\", role = \"ctb\"), person(\"Charlie\", \"Gao\", role = \"ctb\"), person(c(\"Gregory\", \"R.\"), \"Warnes\", role = \"ctb\"), person(c(\"Zhian\", \"N.\"), \"Kamvar\", role = \"ctb\") )", - "Description": "Implements the 'libyaml' 'YAML' 1.1 parser and emitter () for R.", - "License": "BSD_3_clause + file LICENSE", - "URL": "https://yaml.r-lib.org, https://github.com/r-lib/yaml/", - "BugReports": "https://github.com/r-lib/yaml/issues", + "Date": "2025-11-06", "Suggests": [ - "knitr", - "rmarkdown", - "testthat (>= 3.0.0)" + "RUnit" ], - "Config/testthat/edition": "3", - "Config/Needs/website": "tidyverse/tidytemplate", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", - "VignetteBuilder": "knitr", + "Authors@R": "c( person(\"Shawn\", \"Garbett\", role = c(\"cre\",\"ctb\"), email = \"shawn.garbett@vumc.org\", comment = c(ORCID=\"0000-0003-4079-5621\") ), person(\"Jeremy\", \"Stephens\", role = c(\"aut\", \"ctb\")), person(\"Kirill\", \"Simonov\", role = \"aut\"), person(\"Yihui\", \"Xie\", role = \"ctb\", comment = c(ORCID=\"0000-0003-0645-5666\")), person(\"Zhuoer\", \"Dong\", role = \"ctb\"), person(\"Hadley\", \"Wickham\", role = \"ctb\", comment = c(ORCID=\"0000-0003-4757-117X\")), person(\"Jeffrey\", \"Horner\", role = \"ctb\"), person(\"reikoch\", role = \"ctb\"), person(\"Will\", \"Beasley\", role = \"ctb\", comment = c(ORCID=\"0000-0002-5613-5006\")), person(\"Brendan\", \"O'Connor\", role = \"ctb\"), person(\"Michael\", \"Quinn\", role = \"ctb\"), person(\"Charlie\", \"Gao\", role = \"ctb\"), person(c(\"Gregory\", \"R.\"), \"Warnes\", role = \"ctb\"), person(c(\"Zhian\", \"N.\"), \"Kamvar\", role = \"ctb\") )", + "Maintainer": "Shawn Garbett ", + "License": "BSD_3_clause + file LICENSE", + "Description": "Implements the 'libyaml' 'YAML' 1.1 parser and emitter () for R.", + "URL": "https://github.com/vubiostat/r-yaml/", + "BugReports": "https://github.com/vubiostat/r-yaml/issues", "NeedsCompilation": "yes", - "Author": "Hadley Wickham [cre] (ORCID: ), Shawn Garbett [ctb] (ORCID: ), Jeremy Stephens [aut, ctb], Kirill Simonov [aut], Yihui Xie [ctb] (ORCID: ), Zhuoer Dong [ctb], Jeffrey Horner [ctb], reikoch [ctb], Will Beasley [ctb] (ORCID: ), Brendan O'Connor [ctb], Michael Quinn [ctb], Charlie Gao [ctb], Gregory R. Warnes [ctb], Zhian N. Kamvar [ctb]", - "Maintainer": "Hadley Wickham ", + "Author": "Shawn Garbett [cre, ctb] (ORCID: ), Jeremy Stephens [aut, ctb], Kirill Simonov [aut], Yihui Xie [ctb] (ORCID: ), Zhuoer Dong [ctb], Hadley Wickham [ctb] (ORCID: ), Jeffrey Horner [ctb], reikoch [ctb], Will Beasley [ctb] (ORCID: ), Brendan O'Connor [ctb], Michael Quinn [ctb], Charlie Gao [ctb], Gregory R. Warnes [ctb], Zhian N. Kamvar [ctb]", "Repository": "CRAN" }, "zip": { @@ -9596,9 +9564,9 @@ }, "zoo": { "Package": "zoo", - "Version": "1.8-15", + "Version": "1.8-14", "Source": "Repository", - "Date": "2025-12-15", + "Date": "2025-04-09", "Title": "S3 Infrastructure for Regular and Irregular Time Series (Z's Ordered Observations)", "Authors@R": "c(person(given = \"Achim\", family = \"Zeileis\", role = c(\"aut\", \"cre\"), email = \"Achim.Zeileis@R-project.org\", comment = c(ORCID = \"0000-0003-0918-3766\")), person(given = \"Gabor\", family = \"Grothendieck\", role = \"aut\", email = \"ggrothendieck@gmail.com\"), person(given = c(\"Jeffrey\", \"A.\"), family = \"Ryan\", role = \"aut\", email = \"jeff.a.ryan@gmail.com\"), person(given = c(\"Joshua\", \"M.\"), family = \"Ulrich\", role = \"ctb\", email = \"josh.m.ulrich@gmail.com\"), person(given = \"Felix\", family = \"Andrews\", role = \"ctb\", email = \"felix@nfrac.org\"))", "Description": "An S3 class with methods for totally ordered indexed observations. It is particularly aimed at irregular time series of numeric vectors/matrices and factors. zoo's key design goals are independence of a particular index/date/time class and consistency with ts and base R by providing methods to extend standard generics.", @@ -9631,7 +9599,7 @@ "License": "GPL-2 | GPL-3", "URL": "https://zoo.R-Forge.R-project.org/", "NeedsCompilation": "yes", - "Author": "Achim Zeileis [aut, cre] (ORCID: ), Gabor Grothendieck [aut], Jeffrey A. Ryan [aut], Joshua M. Ulrich [ctb], Felix Andrews [ctb]", + "Author": "Achim Zeileis [aut, cre] (), Gabor Grothendieck [aut], Jeffrey A. Ryan [aut], Joshua M. Ulrich [ctb], Felix Andrews [ctb]", "Maintainer": "Achim Zeileis ", "Repository": "CRAN" } diff --git a/renv/activate.R b/renv/activate.R index ef25ef83..2753ae54 100644 --- a/renv/activate.R +++ b/renv/activate.R @@ -2,8 +2,7 @@ local({ # the requested version of renv - version <- "1.1.7" - attr(version, "md5") <- "dd5d60f155dadff4c88c2fc6680504b4" + version <- "1.1.5" attr(version, "sha") <- NULL # the project directory @@ -169,16 +168,6 @@ local({ if (quiet) return(invisible()) - # also check for config environment variables that should suppress messages - # https://github.com/rstudio/renv/issues/2214 - enabled <- Sys.getenv("RENV_CONFIG_STARTUP_QUIET", unset = NA) - if (!is.na(enabled) && tolower(enabled) %in% c("true", "1")) - return(invisible()) - - enabled <- Sys.getenv("RENV_CONFIG_SYNCHRONIZED_CHECK", unset = NA) - if (!is.na(enabled) && tolower(enabled) %in% c("false", "0")) - return(invisible()) - msg <- sprintf(fmt, ...) cat(msg, file = stdout(), sep = if (appendLF) "\n" else "") @@ -226,16 +215,6 @@ local({ section <- header(sprintf("Bootstrapping renv %s", friendly)) catf(section) - # try to install renv from cache - md5 <- attr(version, "md5", exact = TRUE) - if (length(md5)) { - pkgpath <- renv_bootstrap_find(version) - if (length(pkgpath) && file.exists(pkgpath)) { - file.copy(pkgpath, library, recursive = TRUE) - return(invisible()) - } - } - # attempt to download renv catf("- Downloading renv ... ", appendLF = FALSE) withCallingHandlers( @@ -261,6 +240,7 @@ local({ # add empty line to break up bootstrapping from normal output catf("") + return(invisible()) } @@ -277,20 +257,12 @@ local({ repos <- Sys.getenv("RENV_CONFIG_REPOS_OVERRIDE", unset = NA) if (!is.na(repos)) { - # split on ';' if present - parts <- strsplit(repos, ";", fixed = TRUE)[[1L]] + # check for RSPM; if set, use a fallback repository for renv + rspm <- Sys.getenv("RSPM", unset = NA) + if (identical(rspm, repos)) + repos <- c(RSPM = rspm, CRAN = cran) - # split into named repositories if present - idx <- regexpr("=", parts, fixed = TRUE) - keys <- substring(parts, 1L, idx - 1L) - vals <- substring(parts, idx + 1L) - names(vals) <- keys - - # if we have a single unnamed repository, call it CRAN - if (length(vals) == 1L && identical(keys, "")) - names(vals) <- "CRAN" - - return(vals) + return(repos) } @@ -539,51 +511,6 @@ local({ } - renv_bootstrap_find <- function(version) { - - path <- renv_bootstrap_find_cache(version) - if (length(path) && file.exists(path)) { - catf("- Using renv %s from global package cache", version) - return(path) - } - - } - - renv_bootstrap_find_cache <- function(version) { - - md5 <- attr(version, "md5", exact = TRUE) - if (is.null(md5)) - return() - - # infer path to renv cache - cache <- Sys.getenv("RENV_PATHS_CACHE", unset = "") - if (!nzchar(cache)) { - root <- Sys.getenv("RENV_PATHS_ROOT", unset = NA) - if (!is.na(root)) - cache <- file.path(root, "cache") - } - - if (!nzchar(cache)) { - tools <- asNamespace("tools") - if (is.function(tools$R_user_dir)) { - root <- tools$R_user_dir("renv", "cache") - cache <- file.path(root, "cache") - } - } - - # start completing path to cache - file.path( - cache, - renv_bootstrap_cache_version(), - renv_bootstrap_platform_prefix(), - "renv", - version, - md5, - "renv" - ) - - } - renv_bootstrap_download_tarball <- function(version) { # if the user has provided the path to a tarball via @@ -1052,7 +979,7 @@ local({ renv_bootstrap_validate_version_release <- function(version, description) { expected <- description[["Version"]] - is.character(expected) && identical(c(expected), c(version)) + is.character(expected) && identical(expected, version) } renv_bootstrap_hash_text <- function(text) { @@ -1254,18 +1181,6 @@ local({ } - renv_bootstrap_cache_version <- function() { - # NOTE: users should normally not override the cache version; - # this is provided just to make testing easier - Sys.getenv("RENV_CACHE_VERSION", unset = "v5") - } - - renv_bootstrap_cache_version_previous <- function() { - version <- renv_bootstrap_cache_version() - number <- as.integer(substring(version, 2L)) - paste("v", number - 1L, sep = "") - } - renv_json_read <- function(file = NULL, text = NULL) { jlerr <- NULL diff --git a/renv/settings.json b/renv/settings.json index f299d931..74c1d4bb 100644 --- a/renv/settings.json +++ b/renv/settings.json @@ -10,7 +10,6 @@ "ppm.enabled": null, "ppm.ignored.urls": [], "r.version": null, - "snapshot.dev": false, "snapshot.type": "explicit", "use.cache": true, "vcs.ignore.cellar": true,