diff --git a/.Rbuildignore b/.Rbuildignore
index 283ada0c..d9162586 100644
--- a/.Rbuildignore
+++ b/.Rbuildignore
@@ -14,3 +14,9 @@ _\.new\.png$
^docs$
^dev$
^Meta$
+^pkgdown$
+^test_data$
+^app\.R$
+^rsconnect$
+^manifest.json$
+^\.rscignore$
diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml
index 8615826f..40f09b68 100644
--- a/.github/workflows/R-CMD-check.yaml
+++ b/.github/workflows/R-CMD-check.yaml
@@ -12,7 +12,7 @@ jobs:
R-CMD-check:
runs-on: ubuntu-latest
env:
- RENV_PROFILE: "dev"
+ RENV_PROFILE: "full"
GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
R_KEEP_PKG_SOURCE: yes
steps:
@@ -22,7 +22,7 @@ jobs:
- uses: r-lib/actions/setup-r@v2
with:
- r-version: '4.3.1'
+ r-version: '4.4.1'
use-public-rspm: true
- uses: r-lib/actions/setup-tinytex@v2
@@ -35,5 +35,5 @@ jobs:
- uses: r-lib/actions/check-r-package@v2
with:
- upload-snapshots: true
+ upload-snapshots: false
build_args: 'c("--no-manual","--compact-vignettes=gs+qpdf")'
diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml
index 131dcccc..e3b82a1c 100644
--- a/.github/workflows/test-coverage.yaml
+++ b/.github/workflows/test-coverage.yaml
@@ -13,7 +13,7 @@ jobs:
test-coverage:
runs-on: ubuntu-latest
env:
- RENV_PROFILE: "dev"
+ RENV_PROFILE: "full"
GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
RENV_CONFIG_SANDBOX_ENABLED: false
@@ -26,11 +26,15 @@ jobs:
- uses: r-lib/actions/setup-r@v2
with:
use-public-rspm: true
- r-version: '4.3.1'
+ r-version: '4.4.1'
- uses: r-lib/actions/setup-tinytex@v2
- run: tlmgr --version
+ - name: add libcurl Linux dependency
+ if: runner.os == 'Linux'
+ run: sudo apt-get install -y libcurl4-openssl-dev
+
- uses: r-lib/actions/setup-renv@v2
- uses: r-lib/actions/setup-r-dependencies@v2
diff --git a/.gitignore b/.gitignore
index ed459888..b359fbb1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,4 +11,7 @@ docs/*
inst/doc
/doc/
/Meta/
-*.sqlite
\ No newline at end of file
+*.sqlite
+/pkgdown/
+/test_data/
+*.rds
\ No newline at end of file
diff --git a/.rscignore b/.rscignore
new file mode 100644
index 00000000..fdb2c5f2
--- /dev/null
+++ b/.rscignore
@@ -0,0 +1,7 @@
+dev
+vignettes
+tests
+man
+.Rprofile
+data-raw
+.github
\ No newline at end of file
diff --git a/DESCRIPTION b/DESCRIPTION
index 8ebbda20..16fc9278 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,8 +1,13 @@
Package: clinsight
Title: ClinSight
-Version: 0.0.0.9000
+Version: 0.1.0
Authors@R: c(
- person("Leonard Daniël", "Samson", , "lsamson@gcp-service.com", role = c("cre", "aut")),
+ person("Leonard Daniël", "Samson", , "lsamson@gcp-service.com", role = c("cre", "aut"),
+ comment = c(ORCID = "0000-0002-6252-7639")),
+ person("Aaron", "Clark", , "aclark02@arcusbio.com", role = "ctb",
+ comment = c(ORCID = "0000-0002-0123-0970")),
+ person("Jeff", "Thompson", , "jthompson@arcusbio.com", role = "ctb",
+ comment = c(ORCID = "0009-0007-3640-1075")),
person("GCP-Service International Ltd.& Co. KG", role = "fnd")
)
Description: Interactive application to monitor patient safety during
@@ -11,12 +16,12 @@ Description: Interactive application to monitor patient safety during
assessments of the patients' safety. Secondary goal is to improve data
quality by identifying suspicious outliers.
License: Apache License (>= 2) | file LICENSE
-URL: https://github.com/LDSamson/clinsight
-BugReports: https://github.com/LDSamson/clinsight/issues
+URL: https://github.com/openpharma/clinsight
+BugReports: https://github.com/openpharma/clinsight/issues
Depends:
R (>= 4.1)
Imports:
- bslib,
+ bslib (>= 0.6.2),
config,
DBI,
dbplyr (>= 2.4.0),
@@ -26,6 +31,7 @@ Imports:
golem,
htmltools,
plotly,
+ readr,
readxl,
rlang,
rmarkdown,
@@ -33,27 +39,27 @@ Imports:
shiny,
shinycssloaders,
shinyjs,
- shinymanager,
shinyWidgets,
stats,
tidyr,
timevis,
tools,
- vroom,
withr
Suggests:
kableExtra,
knitr,
+ pkgload,
purrr,
+ shinymanager,
shinytest2,
stringr,
testthat (>= 3.0.0)
VignetteBuilder:
knitr
-Config/renv/profiles/dev/dependencies: pkgdown, stringr, kableExtra,
- usethis, cowplot
+Config/renv/profiles/full/dependencies: pkgdown, stringr, kableExtra,
+ usethis, cowplot, covr, devtools, shinymanager
Config/testthat/edition: 3
Encoding: UTF-8
LazyData: true
Roxygen: list(markdown = TRUE)
-RoxygenNote: 7.2.3
+RoxygenNote: 7.3.2
diff --git a/NAMESPACE b/NAMESPACE
index 602f79f8..360244be 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -13,7 +13,6 @@ export(adjust_colnames)
export(app_ui)
export(bind_rows_custom)
export(check_appdata)
-export(check_available_data)
export(clean_dates)
export(collapse_column_vals)
export(collapse_fct_levels)
@@ -26,8 +25,8 @@ export(custom_plot_theme)
export(datatable_custom)
export(date_cols_to_char)
export(db_create)
-export(db_get_latest_query)
-export(db_get_latest_review)
+export(db_get_query)
+export(db_get_review)
export(db_save)
export(db_save_review)
export(db_slice_rows)
@@ -38,7 +37,6 @@ export(fig_barplot)
export(fig_boxplots)
export(fig_timeline)
export(fig_timeseries)
-export(filter_data)
export(fix_multiple_choice_vars)
export(get_appdata)
export(get_available_data)
@@ -47,7 +45,8 @@ export(get_db_connection)
export(get_ggplot_layer_names)
export(get_max_time)
export(get_meta_vars)
-export(get_raw_data)
+export(get_metadata)
+export(get_raw_csv_data)
export(get_review_data)
export(get_static_overview_data)
export(get_test_results)
@@ -81,3 +80,4 @@ importFrom(shiny,shinyApp)
importFrom(shiny,tagList)
importFrom(stats,na.omit)
importFrom(stats,setNames)
+importFrom(utils,modifyList)
diff --git a/NEWS.md b/NEWS.md
index 158eae3c..d26e4c5b 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,17 +1,35 @@
-# clinsight 0.0.9000 (development version)
+# clinsight 0.1.0
## Changed
+- Improved metadata so that external file can be used.
+- Improved data loading by using a config file.
- Created two renv profiles, one for development and one for production. Goal is
to minimize the package dependencies of the production version.
- Removed development package dependencies (for example devtools) that were not needed to run the application.
-- Improved data anonimization
+- Improved data anonymization.
- Changed license.
-
- Updated Description file.
- Improved reading of data files within clinsight::run_app()
- Improved creating test result report.
+- Added data specification to `run_app()` documentation
+- Improved function `get_test_results()`.
+- Merged data now has an attribute 'synch_time' which will be used to update the synchronization information in the side bar.
+- user roles as defined in the config.yml will now be shown at several places in the application and will be documented alongside the user name if needed.
+- Provided scaffolding for developers who plan to deploy on Posit Connect
+- Improved dataTable outputs
+- Move `shinymanager` to suggests since it is optional to use it.
+- Add functionality to mark which forms are required to review and which are not.
+- Improved required column verification of metadata columns when reading metadata using `get_metadata()`.
+- Improved visibility of queries, especially with longer query text and with smaller screen resolutions. Adds option to view query details in full screen.
## Bug fixes
- Fixed error of creating adverse events table with empty data frame input.
+- Properly handled zero regions selected in review configuration and provided user feedback.
+- Fixed issue with the timeline figure when a subject had no completed events.
+- Fixed pre-processing bug where `get_metadata()` would error when a metadata.xlsx tab exist, but were empty
+- Fixed error when running `golem::run_dev()` when `clinsight` was not installed.
+- Fixed error that the app did not recognize the user roles when using `shinymanager`.
+- Fixed issue that item names and query types were not showing up in queries in PDF report.
+- Fixed an issue in the query system that duplicate item names in the same person and same form could not be distinguished from each other.
diff --git a/R/_disable_autoload.R b/R/_disable_autoload.R
new file mode 100644
index 00000000..a8c9436a
--- /dev/null
+++ b/R/_disable_autoload.R
@@ -0,0 +1,3 @@
+# Disabling shiny autoload
+
+# See ?shiny::loadSupport for more information
diff --git a/R/app_authentication.R b/R/app_authentication.R
index 769a0f04..51ace0bc 100644
--- a/R/app_authentication.R
+++ b/R/app_authentication.R
@@ -14,10 +14,18 @@ initialize_credentials <- function(
){
if(file.exists(credentials_db)) return(
cat("Using existing credentials database.\n")
- )
+ )
cat("No credentials database found. Initializing new database.\n",
- "Login with Username 'admin' and Password '1234'.")
+ "Login with Username 'admin' and Password '1234'.\n")
+ cred_directory <- dirname(credentials_db)
+ if(tools::file_ext(credentials_db) == "sqlite" && !dir.exists(cred_directory)) {
+ cat("Folder to store credentials database does not exist. ",
+ "Creating new directory named '", cred_directory, "'.\n", sep = "")
+ dir_created <- dir.create(cred_directory)
+ if(!dir_created) stop("Could not create directory for user database")
+ }
+
con <- get_db_connection(credentials_db)
initial_credentials <- data.frame(
"user" = "admin",
@@ -26,7 +34,7 @@ initialize_credentials <- function(
"admin" = TRUE,
"name" = "Admin",
"mail" = "",
- "role" = "",
+ "roles" = get_roles_from_config()[1],
"sites" = "",
stringsAsFactors = FALSE,
check.names = FALSE
@@ -58,28 +66,24 @@ initialize_credentials <- function(
#' Authenticate UI
#'
-#' Authentication implementation in the UI.
-#'
-#' @param test_mode Logical. Whether the app should be started in test mode or
-#' not.
+#' Authentication implementation in the UI, using `shinymanager`.
#'
#'
-authenticate_ui <- function(test_mode = FALSE){
- if (test_mode) return(app_ui)
+authenticate_ui <- function(){
shinymanager::secure_app(
app_ui,
enable_admin = TRUE,
theme = bslib::bs_theme(bootswatch = "spacelab", version = "5"),
tags_top = tags$div(
golem_add_external_resources(),
- tags$img(src='www/gcp_logo.png', height = '100', width ='450'),
+ tags$img(src='www/logo.png', height = '278', width ='239'),
HTML("
")
),
tags_bottom = tags$div(
tags$p(
"For any question, please contact the ",
tags$a(
- href = "mailto:lsamson@gcp-service.com?Subject=ClinSight",
+ href = "mailto:example@example.com?Subject=ClinSight",
target="_top", "administrator"
)
)
@@ -92,45 +96,76 @@ authenticate_ui <- function(test_mode = FALSE){
#'
#' Function to authenticate the main server.
#'
-#' @param test_mode Logical, whether to start the application in test mode.
-#' @param sites Character vector. Study sites that can be allocated to a user.
-#' @param roles Character vector. Roles that can be allocated to a user.
-#' @param credentials_db Character vector. Path to the credentials
-#' database.
-#' @param credentials_pwd Character vector, containing the database
-#' password.
+#' @param user_identification Character vector showing the user identification.
+#' Is by default set by the `user_identification` option in the `golem-config`
+#' file.
+#' @param credentials_db Character vector. Path to the credentials database. By
+#' default, set by the `data_folder` and `credentials_db` options in the
+#' `golem-config_file`.
+#' @param credentials_pwd Character vector, containing the database password.
+#' @param all_sites Character vector with all sites. Will be passed on to
+#' shinymanager configuration so that data can be restricted to specific sites
+#' per user.
+#' @param all_roles Named character vector. Used to show all roles that are
+#' valid to use in the application. Also used to show all applicable roles
+#' in `shinymanager` admin mode.
+#' @param session Shiny session. Needed to access user information in case of
+#' login methods alternative to `shinymanager` are used.
#'
authenticate_server <- function(
- test_mode = FALSE,
- sites = app_vars$Sites$site_code,
- roles = c("Medical Monitor", "Data Manager", "Administrator", "Investigator"),
- credentials_db = app_sys("app/www/credentials_db.sqlite"),
- credentials_pwd = Sys.getenv("DB_SECRET")
+ user_identification = get_golem_config("user_identification"),
+ all_sites = NULL,
+ all_roles = get_roles_from_config(),
+ credentials_db = get_golem_config("credentials_db"),
+ credentials_pwd = Sys.getenv("DB_SECRET"),
+ session
){
- if (test_mode) return({
- # To skip authentication when testing application:
- reactiveValues(
- admin = TRUE,
- user = "test_user",
- name = "test user",
- role = "Medical monitor",
- sites = sites
- )
- })
- shinymanager::secure_server(
- check_credentials = shinymanager::check_credentials(
- credentials_db,
- passphrase = credentials_pwd
- ),
- inputs_list = list(
- "role" = list(
- fun = "selectInput",
- args = list(choices = roles, multiple = TRUE)
+ switch(
+ user_identification,
+ shinymanager = shinymanager::secure_server(
+ check_credentials = shinymanager::check_credentials(
+ credentials_db,
+ passphrase = credentials_pwd
),
- "sites" = list(
- fun = "selectInput",
- args = list(label = NULL, choices = sites, selected = sites, multiple = TRUE)
+ inputs_list = list(
+ "roles" = list(
+ fun = "selectInput",
+ args = list(choices = all_roles, multiple = TRUE)
+ ),
+ "sites" = list(
+ fun = "selectInput",
+ args = list(
+ label = NULL,
+ choices = all_sites,
+ selected = all_sites,
+ multiple = TRUE
+ )
+ )
)
+ ),
+ test_user = reactiveValues(
+ user = "test_user",
+ name = "test user",
+ roles = all_roles[1:3],
+ sites = all_sites
+ ),
+ http_headers = reactiveValues(
+ user = session$request$HTTP_X_SP_USERID,
+ name = session$request$HTTP_X_SP_USERNAME,
+ roles = get_valid_roles(session$request$HTTP_X_SP_USERGROUPS, all_roles),
+ sites = all_sites
+ ),
+ shiny_session = reactiveValues(
+ user = session$user,
+ name = session$user,
+ roles = get_valid_roles(session$groups, all_roles),
+ sites = all_sites
+ ),
+ reactiveValues(
+ user = "Unknown",
+ name = "Unknown",
+ roles = "",
+ sites = all_sites
)
- )
+ )
}
diff --git a/R/app_config.R b/R/app_config.R
index c728412c..5b457859 100644
--- a/R/app_config.R
+++ b/R/app_config.R
@@ -16,10 +16,12 @@ app_sys <- function(...) {
#' Read App Config
#'
#' @param value Value to retrieve from the config file.
-#' @param config GOLEM_CONFIG_ACTIVE value. If unset, R_CONFIG_ACTIVE.
-#' If unset, "default".
+#' @param config GOLEM_CONFIG_ACTIVE value. If unset, R_CONFIG_ACTIVE. If unset,
+#' "default".
#' @param use_parent Logical, scan the parent directory for config file.
-#' @param file Location of the config file
+#' @param file Location of the config file. Can be set with the option
+#' 'CONFIG_PATH' so that a study-specific config.yml file can be provided at
+#' runtime, without rebuilding the application's package from source.
#'
#' @noRd
get_golem_config <- function(
@@ -32,8 +34,7 @@ get_golem_config <- function(
)
),
use_parent = TRUE,
- # Modify this if your config file is somewhere else
- file = app_sys("golem-config.yml")
+ file = custom_config_path()
) {
config::get(
value = value,
diff --git a/R/app_server.R b/R/app_server.R
index 4fa22be2..d7f24b65 100644
--- a/R/app_server.R
+++ b/R/app_server.R
@@ -19,12 +19,10 @@ app_server <- function(
){
meta <- golem::get_golem_options("meta")
merged_data <- golem::get_golem_options("data")
- if(is.character(merged_data)) merged_data <- readRDS(merged_data)
user_db <- golem::get_golem_options("user_db")
credentials_db <- golem::get_golem_options("credentials_db")
- test_mode <- golem::get_golem_options("test_mode")
- app_data <- get_appdata(merged_data)
+ app_data <- get_appdata(merged_data, meta = meta)
app_vars <- get_meta_vars(data = app_data, meta = meta)
app_tables <- lapply(
setNames(names(app_data), names(app_data)), \(x){
@@ -32,64 +30,34 @@ app_server <- function(
})
check_appdata(app_data, meta)
- if(!file.exists(user_db)){
- warning("no database found. New database will be created")
- db_create(get_review_data(merged_data), db_path = user_db)
- } else{
- if(!test_mode){
- db_update(get_review_data(merged_data), db_path = user_db, data_synched = FALSE)
- }
- }
-
res_auth <- authenticate_server(
- test_mode = test_mode,
- sites = app_vars$Sites$site_code,
+ all_sites = app_vars$Sites$site_code,
credentials_db = credentials_db,
- credentials_pwd = golem::get_golem_options("credentials_pwd")
- )
+ credentials_pwd = golem::get_golem_options("credentials_pwd"),
+ session = session
+ )
- output$user_info <- renderText({
- res_auth[["name"]]
- })
-
- # load tabs in UI:
- common_forms <- with(app_vars$all_forms, form[main_tab == "Common events"])
- lapply(common_forms, \(i){
- bslib::nav_insert(
- id = "common_data_tabs",
- mod_common_forms_ui(id = paste0("cf_", simplify_string(i)), form = i),
- select = (i == common_forms[1])
- )
- })
-
-
- study_forms <- with(app_vars$all_forms, form[main_tab == "Study data"])
- lapply(study_forms, \(i){
- bslib::nav_insert(
- id = "study_data_tabs",
- mod_study_forms_ui(paste0("sf_", simplify_string(i)), i,
- form_items = app_vars$items[[i]]),
- select = (i == study_forms[1])
- )
- })
-
# For query item selector drop-down menus:
available_data <- get_available_data(
data = app_data,
tables = app_tables,
- all_forms = app_vars$all_forms
+ all_forms = app_vars$all_forms,
+ form_repeat_name = with(
+ meta[["table_names"]],
+ table_name[raw_name == "form_repeat"]
+ ) |>
+ tryCatch(error = \(e) "N")
)
-
+
# For summary review data:
static_overview_data <- get_static_overview_data(
data = app_data,
expected_general_columns = unique(
- with(metadata$items_expanded, item_name[item_group == "General"])
- )
+ with(meta$items_expanded, item_name[item_group == "General"])
+ )
)
# think of using the pool package, but functions such as row_update are not yet supported.
r <- reactiveValues(
- user_name = reactive({ res_auth[["name"]] %||% res_auth[["user"]] }),
review_data = db_slice_rows(user_db, db_table = "all_review_data"),
query_data = collect_query_data(user_db),
filtered_subjects = app_vars$subject_id,
@@ -97,24 +65,69 @@ app_server <- function(
filtered_tables = app_tables,
subject_id = app_vars$subject_id[1]
)
-
+
+ user_error <- reactiveVal()
+ observeEvent(res_auth, {
+ if(identical(get_golem_config("user_identification"), "shinymanager")){
+ req(res_auth[["user"]])
+ }
+ r$user_name <- res_auth[["name"]] %||% res_auth[["user"]] %||% ""
+ r$user_roles <- names(get_valid_roles(res_auth[["roles"]])) %||% ""
+ r$user_role <- r$user_roles[1]
+ user_error(NULL)
+ if(r$user_name == ""){
+ user_error("No valid user name provided. ")
+ }
+ if(r$user_role == ""){
+ user_error(paste0(user_error(), "No valid user role provided. "))
+ }
+ if(!is.null(user_error())){
+ user_error(
+ paste0(
+ user_error(),
+ "Functionality is limited. ",
+ "Please contact the administrator to resolve this issue."
+ )
+ )
+ }
+ })
+
+ forms_to_review_data <- app_vars$form_level_data[c("item_group", "review_required")]
+
+ observeEvent(user_error(), {
+ showNotification(
+ user_error(),
+ id = "user_error",
+ type = "error",
+ duration = NULL
+ )
+ })
+
+ output$user_info <- renderText({
+ req(r$user_name)
+ r$user_name
+ })
rev_sites <- reactive({res_auth[["sites"]]})
observeEvent(rev_sites(), {
+ req(!all(rev_sites() %in% app_vars$Sites$site_code))
r <- filter_data(r, rev_sites(), subject_ids = app_vars$subject_id,
appdata = app_data, apptables = app_tables)
})
-
+
navinfo <- reactiveValues(
active_form = app_vars$all_forms$form[1],
active_tab = "Start",
trigger_page_change = 1
)
-
+
rev_data <- reactiveValues(
summary = reactive({
+ req(forms_to_review_data)
r$review_data |>
+ dplyr::left_join(forms_to_review_data, by = "item_group") |>
dplyr::filter(
reviewed != "Yes",
+ review_required,
subject_id %in% r$filtered_subjects
) |>
summarize_review_data() |>
@@ -124,16 +137,16 @@ app_server <- function(
overview = reactive({
static_overview_data |>
dplyr::filter(subject_id %in% r$filtered_subjects) |>
- dplyr::arrange(subject_id) |>
dplyr::mutate(
needs_review = subject_id %in% unique(rev_data$summary()$subject_id)
- )
+ ) |>
+ dplyr::arrange(dplyr::desc(needs_review), subject_id)
}),
subject = app_vars$subject_id[1],
open_modal = 0,
show_all = FALSE
)
-
+
observeEvent(input$main_tabs, {
golem::cat_dev("Changed main tab to", input$main_tabs, "\n")
# This observeEvent should only be triggered by directly clicking on tabs.
@@ -141,7 +154,7 @@ app_server <- function(
# correctly in the designated change tab modules.
req(input$main_tabs != navinfo$active_tab)
navinfo$active_tab <- input$main_tabs
-
+
if(input$main_tabs == "Common events"){
req(input$common_data_tabs)
navinfo$active_form <- input$common_data_tabs
@@ -158,7 +171,7 @@ app_server <- function(
navinfo$active_form <- input$common_data_tabs
cat("Common tab switch --> 'active_form' updated to ", navinfo$active_form, "\n")
})
-
+
observeEvent(input$study_data_tabs, {
if(input$main_tabs == "Study data"){
navinfo$active_form <- input$study_data_tabs
@@ -166,7 +179,7 @@ app_server <- function(
navinfo$active_form, "\n")
}
})
-
+
observeEvent(navinfo$trigger_page_change, {
req(input$common_data_tabs, input$study_data_tabs)
# trigger_page_change prevents circular dependencies.
@@ -181,29 +194,59 @@ app_server <- function(
"Study data" = "study_data_tabs")
bslib::nav_select(id = id_to_change, selected = navinfo$active_form)
})
-
- lapply(with(app_vars$all_forms, form[main_tab == "Common events"]),
- \(x){mod_common_forms_server(
- id = paste0("cf_", simplify_string(x)), r = r, form = x,
- form_items = app_vars$items[[x]], table_names = app_vars$table_names
- ) }) |>
+
+ ###### Load common form tabs in UI and server:
+ common_forms <- with(app_vars$all_forms, form[main_tab == "Common events"])
+ lapply(common_forms, \(i){
+ bslib::nav_insert(
+ id = "common_data_tabs",
+ mod_common_forms_ui(id = paste0("cf_", simplify_string(i)), form = i),
+ select = (i == common_forms[1])
+ )
+ })
+ lapply(common_forms, \(x){
+ mod_common_forms_server(
+ id = paste0("cf_", simplify_string(x)), r = r, form = x,
+ form_items = app_vars$items[[x]], table_names = app_vars$table_names
+ )
+ }) |>
unlist(recursive = FALSE)
-
- lapply(app_vars$groups, \(x){mod_study_forms_server(
- id = paste0("sf_", simplify_string(x)), r = r, form = x,
- form_items = app_vars$items[[x]], table_names = app_vars$table_names
- ) }) |>
+
+ ###### Load study form tabs in UI and server:
+ study_forms <- with(app_vars$all_forms, form[main_tab == "Study data"])
+ lapply(study_forms, \(i){
+ bslib::nav_insert(
+ id = "study_data_tabs",
+ mod_study_forms_ui(paste0("sf_", simplify_string(i)), form = i,
+ form_items = app_vars$items[[i]]),
+ select = (i == study_forms[1])
+ )
+ })
+ lapply(study_forms, \(x){
+ mod_study_forms_server(
+ id = paste0("sf_", simplify_string(x)), r = r, form = x,
+ form_items = app_vars$items[[x]], table_names = app_vars$table_names,
+ item_info = app_vars$form_level_data[app_vars$form_level_data$item_group == x, ]
+ )
+ }) |>
unlist(recursive = FALSE)
-
+
mod_start_page_server("start_page_1", r, rev_data, navinfo, app_vars$all_forms,
app_vars$table_names)
- mod_header_widgets_server("header_widgets_1", r, rev_data, navinfo)
-
+ mod_header_widgets_server(
+ id = "header_widgets_1",
+ r = r,
+ rev_data = rev_data,
+ navinfo = navinfo,
+ events = meta$events
+ )
+
+
# Only initiate the sidebar after successful login, because it contains a
# modal that pops up if data is out of synch. Modals interfere with shinymanager.
- observeEvent(res_auth[["name"]], {
- req(!is.null(res_auth[["name"]]))
- if(!test_mode){
+ observeEvent(r$user_name, {
+ if(isTRUE(get_golem_config("user_identification") == "shinymanager")){
+ req(rlang::is_installed("shinymanager"))
pwd_mngt <- shinymanager::read_db_decrypt(
get_db_connection(credentials_db),
name = "pwd_mngt",
@@ -211,6 +254,7 @@ app_server <- function(
)
req(with(pwd_mngt, must_change[user == res_auth[["user"]]]) == "FALSE")
}
+
mod_main_sidebar_server(
id = "main_sidebar_1",
r = r,
@@ -222,11 +266,10 @@ app_server <- function(
with(rev_data$summary(), Form[subject_id == r$subject_id])
}),
db_path = user_db,
- available_data = available_data,
- test_mode = test_mode
+ available_data = available_data
)
})
-
+
mod_review_config_server(
"review_config_1",
r = r,
@@ -235,7 +278,7 @@ app_server <- function(
sites = app_vars$Sites,
subject_ids = app_vars$subject_id
)
-
+
mod_queries_server(
"queries_1",
r = r,
@@ -246,9 +289,9 @@ app_server <- function(
)
mod_report_server("report_1", r = r, rev_data, db_path = user_db,
table_names = app_vars$table_names)
-
+
mod_navigate_participants_server("navigate_participants_1", r)
-
+
mod_navigate_review_server(
"navigate_review_1",
r,
@@ -257,10 +300,10 @@ app_server <- function(
app_vars$all_forms,
table_names = app_vars$table_names
)
-
shiny::exportTestValues(
user_db = user_db,
active_participant = r$subject_id,
- active_form = navinfo$active_form
+ active_form = navinfo$active_form,
+ user_error = user_error()
)
}
diff --git a/R/app_ui.R b/R/app_ui.R
index ed947c2c..6d452950 100644
--- a/R/app_ui.R
+++ b/R/app_ui.R
@@ -11,9 +11,16 @@ app_ui <- function(request){
bslib::page_navbar(
id = "main_tabs",
window_title = "Interactive Trial Safety Surveillance Tool",
- theme = bslib::bs_theme(bootswatch = "spacelab", version = "5"),
+ theme = bslib::bs_theme(
+ bootswatch = "spacelab",
+ version = "5",
+ # this disables 'compact' value-boxes introduced in bslib 0.6.0
+ # see https://github.com/rstudio/bslib/issues/963
+ "bslib-value-box-horizontal-break-point" = "1px"
+ ),
bg = "#43464c",
title = tags$a(
+ href = "/",
tags$img(src='www/gcp_logo.png', height = '40', width ='180')
),
sidebar = bslib::sidebar(mod_main_sidebar_ui("main_sidebar_1")),
diff --git a/R/clinsight-package.R b/R/clinsight-package.R
index 772e8803..183e8ce5 100644
--- a/R/clinsight-package.R
+++ b/R/clinsight-package.R
@@ -8,6 +8,7 @@
#' @import shiny
#' @importFrom shiny NS tagList shinyApp
#' @importFrom stats na.omit setNames
+#' @importFrom utils modifyList
#' @importFrom golem with_golem_options
#' @importFrom golem add_resource_path activate_js favicon bundle_resources
## usethis namespace: end
diff --git a/R/data.R b/R/data.R
index 789f5b70..5e4bd8bb 100644
--- a/R/data.R
+++ b/R/data.R
@@ -18,12 +18,23 @@
#' and in addition the columns `unit`, `lower_limit`, `uppter_limit`. Used to
#' select and rename the variables of interest in the common forms.
#' - `general`: Contains the same columns as `common_forms`.
-#' - `groups`: Contains the columns `item_group`, `item_type`, `item_scale`,
-#' `use_unscaled_limits`.
+#' - `form_level_data`: For specifying form-level data. When reading in metadata
+#' from the Excel format, this table will created and sanitized if needed,
+#' creating the minimum columns `item_group`, `item_scale`,
+#' `use_unscaled_limits`, and `review_required`. The column `item_group`
+#' contains the name of the forms to which the settings apply. Columns
+#' `item_scale` and `use_unscaled_limits` are used in
+#' [mod_study_forms_server()] to specify the scaling of the figures. It is
+#' recommended to set the required values here; by default, they are both set
+#' to FALSE in [mod_study_forms_server()]. The last column that is expected
+#' here is `review_required`, which can be used to specify whether review is
+#' required for a form. Will default to TRUE for each form it is unset for a
+#' form.
#'
#' @source Can be created with an Excel file. The Excel file format is chosen so
#' that the metadata can be changed easily per study. See
#' `raw-data/metadata.R` for details.
+#'
"metadata"
@@ -42,9 +53,19 @@
#'
"col_palette"
+
#' Clinical Trial test data
#'
-#' A data frame containing randomly created clinical trial data. Used for
-#' testing purposes.
+#' A data.frame containing randomly created clinical trial data. Used for
+#' testing purposes. It will also be used to run the app with example data when
+#' executing `run_app()` with the default configuration settings, or when
+#' running `golem::run_dev()`.
+#'
+#' @format a data.frame with 6,483 rows and 24 variables.
+#'
#' @source Created with `data-raw/create_random_data.R`
"clinsightful_data"
+
+
+
+
diff --git a/R/fct_SQLite.R b/R/fct_SQLite.R
index e9dbb208..6a2d76de 100644
--- a/R/fct_SQLite.R
+++ b/R/fct_SQLite.R
@@ -48,14 +48,13 @@ db_temp_connect <- function(db_path, code, drv = RSQLite::SQLite()){
#' Creates application database. To create a database with all data flagged as
#' 'new', use the default settings of `reviewed`, `reviewer`, and `status`.
#'
-#' @param data Either a data frame with review data (Usually created with
-#' [get_review_data()]), or a character path to the raw data files.
+#' @param data A data frame with review data (Usually created with
+#' [get_review_data()]).
#' @param db_path A character vector with the path to the database to be
#' created.
#' @param reviewed Character vector. Sets the reviewed tag in the review
#' database.
#' @param reviewer Character vector. Sets the reviewer in the review database.
-#' Defaults to `Admin`.
#' @param status Character vector. Sets the status in the review database.
#' Defaults to `new`.
#'
@@ -74,11 +73,15 @@ db_create <- function(
stopifnot(!file.exists(db_path))
stopifnot(reviewed %in% c("Yes", "No", ""))
stopifnot(is.data.frame(data) || is.character(data))
- if(!is.data.frame(data)){
- data <- get_raw_data(data) |>
- merge_meta_with_data() |>
- get_review_data()
+ db_directory <- dirname(db_path)
+ if(tools::file_ext(db_path) == "sqlite" && !dir.exists(db_directory)) {
+ cat("Directory to store user database does not exist. ",
+ "Creating new directory named '", db_directory, "'.\n", sep = "")
+ dir_created <- dir.create(db_directory)
+ if(!dir_created) stop("Could not create directory for user database")
}
+ data_synch_time <- attr(data, "synch_time") %||% ""
+
df <- data |>
dplyr::mutate(
reviewed = reviewed,
@@ -91,7 +94,7 @@ db_create <- function(
new_data <- list(
"all_review_data" = df,
"query_data" = query_data_skeleton,
- "db_synch_time" = data.frame(synch_time = "")
+ "db_synch_time" = data.frame(synch_time = data_synch_time)
)
con <- get_db_connection(db_path)
for(i in names(new_data)){
@@ -111,9 +114,6 @@ db_create <- function(
#' @param common_vars A character vector containing the common key variables.
#' @param edit_time_var A character vector with the column name of the edit-time
#' variable.
-#' @param data_synched Logical. Whether the database was synched or not. If
-#' TRUE, the synchronization date stored in the database will be updated to
-#' the current day.
#'
#' @return Nothing will be returned.
#' @export
@@ -123,36 +123,43 @@ db_update <- function(
db_path,
common_vars = c("subject_id", "event_name", "item_group",
"form_repeat", "item_name"),
- edit_time_var = "edit_date_time",
- data_synched = FALSE
+ edit_time_var = "edit_date_time"
){
stopifnot(file.exists(db_path))
con <- get_db_connection(db_path)
- # check if review_data is still up to date and if not, expand review_data
- review_data <- con |>
- dplyr::tbl("all_review_data") |>
- dplyr::collect()
+ data_synch_time <- attr(data, "synch_time") %||% ""
- edit_time_raw <- get_max_time(data, edit_time_var)
- edit_time_review <- get_max_time(review_data, edit_time_var)
- # update db synch time:
- if(data_synched){
- cat("Raw data renewed. Updating synch date \n")
- DBI::dbWriteTable(con, "db_synch_time", data.frame("synch_time" = time_stamp()), overwrite = TRUE)
+ db_synch_time <- tryCatch({
+ DBI::dbGetQuery(con, "SELECT synch_time FROM db_synch_time") |>
+ unlist(use.names = FALSE)}, error = \(e){""})
+ if(!identical(data_synch_time, "") && identical(data_synch_time, db_synch_time)){
+ return("Database up to date. No update needed")
}
- # update review_data DB if needed:
- if(edit_time_raw == edit_time_review){
- return("Database up to date. No update needed")
+ if(!identical(data_synch_time, "") && db_synch_time > data_synch_time){
+ return({
+ warning("DB synch time is more recent than data synch time. ",
+ "Aborting synchronization.")
+ })
}
+ # Continue in the case data_synch_time is missing and if data_synch_time is
+ # more recent than db_synch_time
+ review_data <- DBI::dbGetQuery(con, "SELECT * FROM all_review_data")
cat("Start adding new rows to database\n")
updated_review_data <- update_review_data(
review_df = review_data,
- latest_review_data = data, #get_review_data(merge_meta_with_data(data), common_vars),
+ latest_review_data = data,
common_vars = common_vars,
- edit_time_var = edit_time_var
- )
+ edit_time_var = edit_time_var,
+ update_time = data_synch_time
+ )
cat("writing updated review data to database...\n")
DBI::dbWriteTable(con, "all_review_data", updated_review_data, append = TRUE)
+ DBI::dbWriteTable(
+ con,
+ "db_synch_time",
+ data.frame("synch_time" = data_synch_time),
+ overwrite = TRUE
+ )
cat("Finished updating review data\n")
}
@@ -205,12 +212,12 @@ db_save_review <- function(
dplyr::collect()
if(nrow(new_review_rows) == 0){return(
warning("Review state unaltered. No review will be saved.")
- )}
+ )}
new_review_rows <- new_review_rows |>
db_slice_rows(slice_vars = c("timestamp", "edit_date_time"), group_vars = common_vars) |>
dplyr::select(-dplyr::all_of(cols_to_change)) |>
# If there are multiple edits, make sure to only select the latest editdatetime for all items:
- # dplyr::slice_max(edit_date_time, by = dplyr::all_of(common_vars)) |>
+ # dplyr::slice_max(edit_date_time, by = dplyr::all_of(common_vars)) |>
dplyr::bind_cols(rv_row[cols_to_change]) # bind_cols does not work in a db connection.
cat("write updated review data to database\n")
lapply(tables, \(x){DBI::dbWriteTable(db_con, x, new_review_rows, append = TRUE)}) |>
@@ -243,63 +250,73 @@ db_save <- function(data, db_path, db_table = "query_data"){
}
-#' Retrieve latest query
+#'Retrieve query from database
#'
-#' Small helper function to retrieve the latest query with the provided query_id
-#' and query follow-up number (n)
+#'Small helper function to retrieve a query from the database. if no follow-up
+#'number is provided, all messages will be collected.
#'
-#' @param db_path Character vector. Needs to be a valid path to a database.
-#' @param query_id Character string with the query identifier to extract from
-#' the database.
-#' @param n Numerical or character string, with the query follow-up number to
-#' extract
-#' @param db_table Character vector with the name of the table to read from.
+#'@param db_path Character vector. Needs to be a valid path to a database.
+#'@param query_id Character string with the query identifier to extract from the
+#' database.
+#'@param n (optional) numerical or character string, with the query follow-up
+#' number to extract
+#'@param db_table Character vector with the name of the table to read from.
#'
-#' @return A data frame
-#' @export
-#' @inheritParams db_slice_rows
+#'@return A data frame
+#'@export
+#'@inheritParams db_slice_rows
#'
-#' @examples
+#' @examples
#'local({
-#' temp_path <- withr::local_tempfile(fileext = ".sqlite")
+#' temp_path <- withr::local_tempfile(fileext = ".sqlite")
#' con <- get_db_connection(temp_path)
-#'
+#'
#' new_query <- dplyr::tibble(
-#' query_id = "ID124234",
+#' query_id = "ID124234",
#' subject_id = "ID1",
#' n = 1,
#' timestamp = "2024-02-05 01:01:01",
#' other_info = "testinfo"
-#' )
+#' )
#' DBI::dbWriteTable(con, "query_data", new_query)
-#' db_get_latest_query(temp_path, query_id = "ID124234", n = 1)
+#' db_get_query(temp_path, query_id = "ID124234", n = 1)
#' })
#'
-db_get_latest_query <- function(
+db_get_query <- function(
db_path,
- query_id = new_query$query_id,
- n = new_query$n,
+ query_id,
+ n = NULL,
db_table = "query_data",
slice_vars = "timestamp",
group_vars = c("query_id", "n")
- ){
+){
stopifnot(file.exists(db_path))
stopifnot(is.character(query_id))
stopifnot(is.character(db_table))
- stopifnot(is.numeric(n) | is.character(n))
+ stopifnot(is.null(n) | is.numeric(n) | is.character(n))
+ filter_n <- ifelse(is.null(n), "", " AND n=?n")
+ sql <- paste0(
+ "SELECT * FROM ?db_table WHERE query_id = ?query_id",
+ filter_n, ";"
+ )
db_temp_connect(db_path, {
- sql <- "SELECT * FROM ?db_table WHERE query_id = ?query_id AND n = ?n;"
- query <- DBI::sqlInterpolate(con, sql, db_table = db_table[1],
- query_id = query_id[1], n = n[1])
+ sql_args <- list(
+ conn = con,
+ sql = sql,
+ db_table = db_table[1],
+ query_id = query_id[1]
+ )
+ sql_args$n <- n[1] #So that this function argument will be conditional.
+ query <- do.call(DBI::sqlInterpolate, sql_args)
DBI::dbGetQuery(con, query) |>
db_slice_rows(slice_vars = slice_vars, group_vars = group_vars) |>
dplyr::as_tibble()
})
}
-#' Retrieve latest review
+#' Retrieve review
#'
-#' Small helper function to retrieve the latest review data from the database
+#' Small helper function to retrieve the (latest) review data from the database
#' with the given subject id (`subject`) and `form`.
#'
#' @param db_path Character vector. Needs to be a valid path to a database.
@@ -328,10 +345,10 @@ db_get_latest_query <- function(
#' ) |>
#' dplyr::as_tibble()
#' DBI::dbWriteTable(con, "all_review_data", review_data)
-#' db_get_latest_review(temp_path, subject = "Test_name", form = "Test_group")
+#' db_get_review(temp_path, subject = "Test_name", form = "Test_group")
#' })
#'
-db_get_latest_review <- function(
+db_get_review <- function(
db_path,
subject = review_row$subject_id,
form = review_row$item_group,
@@ -339,13 +356,14 @@ db_get_latest_review <- function(
slice_vars = c("timestamp", "edit_date_time"),
group_vars = c("subject_id", "event_name", "item_group",
"form_repeat", "item_name")
- ){
+){
stopifnot(file.exists(db_path))
stopifnot(is.character(subject))
stopifnot(is.character(form))
db_temp_connect(db_path, {
sql <- "SELECT * FROM ?db_table WHERE subject_id = ?id AND item_group = ?group;"
- query <- DBI::sqlInterpolate(con, sql, db_table = db_table[1], id = subject[1], group = form[1])
+ query <- DBI::sqlInterpolate(con, sql, db_table = db_table[1],
+ id = subject[1], group = form[1])
DBI::dbGetQuery(con, query) |>
db_slice_rows(slice_vars = slice_vars, group_vars = group_vars) |>
dplyr::as_tibble()
diff --git a/R/fct_app_role_helpers.R b/R/fct_app_role_helpers.R
new file mode 100644
index 00000000..e282a3ae
--- /dev/null
+++ b/R/fct_app_role_helpers.R
@@ -0,0 +1,46 @@
+#' Get roles from config
+#'
+#' Helper function to retrieve all roles from the config file.
+#'
+#' @param config_roles Character string with the name of the config argument to
+#' read from.
+#'
+#' @return A named character vector.
+#' @noRd
+get_roles_from_config <- function(
+ config_roles = "user_roles"
+){
+ stopifnot(is.character(config_roles))
+ all_roles <- unlist(get_golem_config(config_roles))
+ names(all_roles) <- names(all_roles) %||% all_roles
+ all_roles
+}
+
+
+#' Get valid roles
+#'
+#' Helper function to retrieve all roles that are relevant for the application.
+#'
+#' @param roles A character vector. Will be converted to lower case.
+#' @param all_roles A named character vector with all applicable roles.
+#'
+#' @return A named character vector with the roles applicable for the
+#' application and available for the current user.
+#'
+get_valid_roles <- function(
+ roles,
+ all_roles = get_roles_from_config()
+){
+ roles <- roles %||% ""
+ if(length(roles) == 0){
+ roles <- ""
+ }
+ stopifnot(is.character(roles) || is.list(roles), is.character(all_roles))
+ roles <- trimws(unlist(strsplit(tolower(roles), ",")))
+ valid_roles <- all_roles[sort(match(roles, all_roles))]
+ if(length(valid_roles) == 0) {
+ warning("No valid roles found. Is the active configuration correct?")
+ return(setNames(nm = ""))
+ }
+ valid_roles
+}
diff --git a/R/fct_appdata.R b/R/fct_appdata.R
index d88ef1ee..f0ab2b9a 100644
--- a/R/fct_appdata.R
+++ b/R/fct_appdata.R
@@ -1,95 +1,53 @@
-#' Get raw data
-#'
+#' Get raw data from CSV files
#'
#' @param data_path Path to the folder that contains the CSV files with the
#' application data.
-#' @param column_specs A data frame containing at least the columns 'name_raw',
-#' 'name_new', and 'col_type'. Used to set the column specifications, and to
-#' set the column names to the names expected for the application to function.
+#' @param synch_time Time at which the data was extracted from the EDC system.
+#' Defaults to the current date time. Important to set this correctly, since
+#' it will be shown in the application. By default, a warning will be given in
+#' the application if the synchronization time is more than one day old.
+#' @param exclude character vector with regular expressions that identify csv
+#' files that should be excluded from the study data. Useful to exclude files
+#' with different data structures, or files with metadata.
#' @param delim Delimiter to use to read in files.
#' @param skip Number of rows to skip when reading in files.
#'
#' @return A data frame with raw application data.
#' @export
-#'
-get_raw_data <- function(
- data_path,
- column_specs = metadata$column_specs,
+get_raw_csv_data <- function(
+ data_path = Sys.getenv("RAW_DATA_PATH"),
+ synch_time = time_stamp(),
+ exclude = c("README.csv$", "Pending_forms.csv$", "MEDRA.csv$", "WHODrug.csv$", "_Queries.csv$"),
delim = ",",
skip = 1
){
all_files <- list.files(data_path, pattern = ".csv")
if(length(all_files) == 0) stop("No files found. Verify whether the path is correct.")
- all_files <- all_files[!grepl("README.csv$", all_files)]
+ synch_time <- synch_time %||% ""
+ stopifnot(is.character(exclude))
+ stopifnot(is.character(synch_time), length(synch_time) == 1)
- stopifnot(is.data.frame(column_specs))
- stopifnot(c("name_raw", "name_new", "col_type") %in% names(column_specs))
- stopifnot(required_col_names %in% column_specs$name_new)
+ exclude_regex <- paste0(exclude, collapse = "|")
+ all_files <- all_files[!grepl(exclude_regex, all_files)]
- col_specs <- setNames(column_specs$col_type, column_specs$name_raw) |>
- append(list(".default" = vroom::col_skip())) |>
- vroom::as.col_spec()
-
- raw_data <- vroom::vroom(
+ raw_data <- readr::read_delim(
file.path(data_path, all_files),
delim = delim,
skip = skip,
- # Consider to make all character columns character type in the future (more robust:
- # if any is missing, it will be filled with char values using add_missing_cols
- col_types = col_specs,
+ col_types = readr::cols(.default = readr::col_character()),
show_col_types = FALSE
- ) |>
- dplyr::rename(
- setNames(column_specs$name_raw, column_specs$name_new)
- ) |>
- dplyr::mutate(
- db_update_time = max(edit_date_time, na.rm = T),
- region = dplyr::case_when(
- grepl("^AU", site_code) ~ "AUS",
- grepl("^DE", site_code) ~ "GER",
- grepl("^FR", site_code) ~ "FRA",
- TRUE ~ NA_character_
- )
- ) |>
- dplyr::mutate(
- day = event_date - min(event_date, na.rm = TRUE),
- vis_day = ifelse(event_id %in% c("SCR", "VIS", "VISEXT", "VISVAR", "FU1", "FU2"), day, NA),
- vis_num = as.numeric(factor(vis_day))-1,
- event_name = dplyr::case_when(
- event_id == "SCR" ~ "Screening",
- event_id %in% c("VIS", "VISEXT", "VISVAR") ~ paste0("Visit ", vis_num),
- grepl("^FU[[:digit:]]+", event_id) ~ paste0("Visit ", vis_num, "(FU)"),
- event_id == "UN" ~ paste0("Unscheduled visit ", event_repeat),
- event_id == "EOT" ~ "EoT",
- event_id == "EXIT" ~ "Exit",
- form_id %in% c("AE", "CM", "CP", "MH", "MH", "MHTR", "PR") ~ "Any visit",
- TRUE ~ paste0("Other (", event_name, ")")
- ),
- event_label = dplyr::case_when(
- !is.na(vis_num) ~ paste0("V", vis_num),
- event_id == "UN" ~ paste0("UV", event_repeat),
- TRUE ~ event_name
- ),
- .by = subject_id
- ) |>
- # Add a fix for MC in raw dataset.
- # Otherwise, we have to repeat this calculation multiple times when creating
- # other datasets from the raw data
- fix_multiple_choice_vars() |>
- dplyr::arrange(
- factor(site_code, levels = order_string(site_code)),
- factor(subject_id, levels = order_string(subject_id))
- )
- if(any(grepl("^Other ", raw_data$event_name))) warning(
- "Undefined Events detected. Please verify data before proceeding."
)
+ if(identical(synch_time, "")){warning("No synch time provided")}
+ cat("Adding synch time '", synch_time, "' as the attribute 'synch_time'",
+ "to the data set.\n")
+ attr(raw_data, "synch_time") <- "synch_time"
raw_data
}
#' Merge metadata with raw data
#'
#' Study-specific function that will combine raw data gathered with
-#' [get_raw_data()] with study-specific metadata. It also fixes the metadata
+#' [get_raw_csv_data()] with study-specific metadata. It also fixes the metadata
#' suffix if needed, and renames the limits and significance values to the app
#' standard names. Some study-specific variables need to be created with this
#' step.
@@ -104,13 +62,23 @@ get_raw_data <- function(
#' @export
#'
merge_meta_with_data <- function(
- data = raw_data,
- meta = metadata,
+ data,
+ meta,
expected_columns = c("LBORNR_Lower", "LBORNR_Upper", "LBORRESU",
"LBORRESUOTH", "LBREASND", "unit",
"lower_limit", "upper_limit", "LBCLSIG")
){
+ stopifnot(is.data.frame(data))
+ stopifnot(inherits(meta, "list"))
+ stopifnot(is.character(expected_columns))
+ # Preserve synch time manually since pivot functions do not preserve attributes
+ synch_time <- attr(data, "synch_time") %||% ""
merged_data <- data |>
+ rename_raw_data(column_names = meta$column_names) |>
+ readr::type_convert(clinsight_col_specs) |>
+ add_timevars_to_data() |>
+ # fix MC values before merging:
+ fix_multiple_choice_vars(expected_vars = meta$items_expanded$var) |>
dplyr::right_join(meta$items_expanded, by = "var") |>
dplyr::filter(!is.na(item_value)) |>
dplyr::mutate(
@@ -135,7 +103,6 @@ merge_meta_with_data <- function(
LBORRESU = ifelse(LBORRESU == "Other", LBORRESUOTH, LBORRESU),
LBORRESU = ifelse(is.na(LBORRESU), "(unit missing)", LBORRESU)
) |>
- dplyr::mutate(day = event_date - min(event_date, na.rm = TRUE), .by = subject_id) |>
dplyr::select(-c(lower_limit, upper_limit, unit, LBORRESUOTH)) |>
dplyr::rename(
"lower_lim" = LBORNR_Lower,
@@ -144,8 +111,10 @@ merge_meta_with_data <- function(
"significance" = LBCLSIG,
"item_value" = VAL,
"reason_notdone" = LBREASND
- )
- apply_study_specific_fixes(merged_data)
+ ) |>
+ apply_study_specific_fixes()
+ attr(merged_data, "synch_time") <- synch_time
+ merged_data
}
@@ -161,7 +130,7 @@ merge_meta_with_data <- function(
apply_study_specific_fixes <- function(
data,
form_id_vars = c("subject_id", "event_name", "item_group")
- ){
+){
## apply study-specific fixes:
# fix significance in ECG before proceeding (stored in its own separate variable):
ECG_significance <- data |>
@@ -204,7 +173,17 @@ apply_study_specific_fixes <- function(
),
.by = c(subject_id, form_repeat)
)
- data
+
+ # Add regions:
+ data |>
+ dplyr::mutate(
+ region = dplyr::case_when(
+ grepl("^AU", site_code) ~ "AUS",
+ grepl("^DE", site_code) ~ "GER",
+ grepl("^FR", site_code) ~ "FRA",
+ TRUE ~ NA_character_
+ )
+ )
}
#' Get appdata
diff --git a/R/fct_appdata_summary_tables.R b/R/fct_appdata_summary_tables.R
index cf5038d5..a9954d8e 100644
--- a/R/fct_appdata_summary_tables.R
+++ b/R/fct_appdata_summary_tables.R
@@ -109,27 +109,37 @@ get_timeline_data <- function(
df
}
-#' Get available data
-#'
-#' Creates a data frame containing info about available data per individual,
-#' such as visits, adverse events, etc. Will be used in module [mod_queries_server()],
-#' to select available items to create a query for per individual and per form.
-#' Required columns are the ones distinctively identifying an item.
-#' For now that are site_code, event_name, subject_id, event_label, item_group, item_name.
-#'
-#' @param data list of data frames to be used. Will be used for extracting the
-#' variables of interest from the study-specific forms.
-#' @param tables list of tables to be used. Will be used for extracting the
-#' variables of interest from the common forms.
-#' @param all_forms A data frame containing all forms.
-#' Mandatory columns are "form" (containing the form names), and "main_tab"
-#' (containing the tab name where the form should be located).
+#' Get available data
+#'
+#' Creates a data frame containing info about available data per individual,
+#' such as visits, adverse events, etc. Will be used in module
+#' [mod_queries_server()], to select available items to create a query for per
+#' individual and per form. Required columns are the ones distinctively
+#' identifying an item. For now that are site_code, event_name, subject_id,
+#' event_label, item_group, item_name.
+#'
+#' @param data list of data frames to be used. Will be used for extracting the
+#' variables of interest from the study-specific forms.
+#' @param tables list of tables to be used. Will be used for extracting the
+#' variables of interest from the common forms.
+#' @param all_forms A data frame containing all forms. Mandatory columns are
+#' "form" (containing the form names), and "main_tab" (containing the tab name
+#' where the form should be located).
+#' @param form_repeat_name A character string with the name of the `form_repeat`
+#' variable. This variable (with this name) will be added to the item name if
+#' duplicate names exist for each participant.
#'
#' @return A data frame with available data points per form.
#' @export
-#'
-get_available_data <- function(data, tables, all_forms){
- stopifnot(is.list(data), is.list(tables))
+#'
+get_available_data <- function(
+ data,
+ tables,
+ all_forms,
+ form_repeat_name = "N"
+ ){
+ stopifnot(is.list(data), is.list(tables), is.character(form_repeat_name))
+ if(identical(form_repeat_name, character(0))){form_repeat_name <- "N"}
study_event_selectors <- lapply(
all_forms$form,
\(x){
@@ -138,12 +148,12 @@ get_available_data <- function(data, tables, all_forms){
df_x <- data[[x]] |>
dplyr::select(
dplyr::all_of(c("subject_id", "event_name", "event_label",
- "item_group", "item_name"))
+ "item_group", "item_name", "form_repeat"))
)
} else {
if(is.null(tables[[x]])) return(NULL)
df_x <- tables[[x]] |>
- dplyr::select(subject_id, "item_name" = Name) |>
+ dplyr::select(subject_id, "item_name" = Name, form_repeat) |>
dplyr::mutate(item_group = x, event_name = "Any visit",
event_label = "Any visit")
}
@@ -155,7 +165,20 @@ get_available_data <- function(data, tables, all_forms){
)
}) |>
dplyr::bind_rows()
- study_event_selectors
+ # To uniquely identify events with the same name (mostly in common_forms):
+ study_event_selectors |>
+ dplyr::mutate(
+ n = dplyr::n(),
+ .by = c("subject_id", "item_group", "event_name", "item_name")
+ ) |>
+ dplyr::mutate(
+ item_name = ifelse(
+ n > 1,
+ sprintf("%s (%s: %s)", item_name, form_repeat_name, form_repeat),
+ item_name
+ )
+ ) |>
+ dplyr::select(-n)
}
diff --git a/R/fct_data_helpers.R b/R/fct_data_helpers.R
index 0fe00f1c..09cb6e54 100644
--- a/R/fct_data_helpers.R
+++ b/R/fct_data_helpers.R
@@ -7,33 +7,32 @@
#' @param expand_tab_items Character vector with the names of the tabs of which
#' the items need to be expanded. If not empty, a new data frame will be
#' created named 'expanded_items', containing all items in the tabs of
-#' `expand_tab_items`.
+#' `expand_tab_items`. Will abort if a tab name is provided that does not
+#' exist in the metadata.
#' @param expand_cols Column names containing the columns for expansion. Will be
#' ignored if the variable `expand_tab_items` is left empty.
#'
#' @return A list with data frames.
+#' @export
#'
get_metadata <- function(
filepath,
expand_tab_items = c("common_forms", "study_forms", "general"),
expand_cols = "suffix"
-
){
stopifnot(is.character(filepath))
if(!grepl(".xlsx$", filepath)) stop(
"currently only .xlsx files are supported as metadata input"
- )
+ )
sheets <- readxl::excel_sheets(filepath)
sheets <- setNames(sheets, sheets)
meta <- lapply(sheets, function(x){
- readxl::read_excel(filepath, sheet = x)
+ readxl::read_excel(filepath, sheet = x, col_types = "text")
})
if(length(expand_tab_items[nchar(expand_tab_items) > 0 ] ) == 0) return(meta)
- if("items_expanded" %in% names(meta)) return({
- message("'items_expanded' already present. Expanding items aborted.")
- meta
+ if("items_expanded" %in% names(meta)) warning({
+ "Table 'items_expanded' already present. The old table will be overwritten."
})
-
missing_tab_items <- expand_tab_items[!expand_tab_items %in% names(meta)]
if(length(missing_tab_items) > 0) {
stop_message <- paste0(
@@ -52,9 +51,27 @@ get_metadata <- function(
separator = ",",
unite_with = "var",
remove_cols = FALSE
+ )
+
+ # Verify and clean form-level data:
+ meta[["form_level_data"]] <- get_form_level_data(
+ meta[["form_level_data"]],
+ all_forms = unique(meta$items_expanded$item_group)
+ )
+
+ # verify if all required columns are available and if not create them:
+ missing_cols <- required_meta_cols[!required_meta_cols %in% names(meta$items_expanded)]
+ if(length(missing_cols) != 0){
+ warning(
+ sprintf(
+ "Required column '%s' will be created since it is missing in the metadata\n",
+ missing_cols
+ )
)
+ meta$items_expanded <- add_missing_columns(meta$items_expanded, missing_cols)
+ }
- lapply(setNames(names(meta), names(meta)), \(x){
+ lapply(setNames(nm = names(meta)), \(x){
if(!x %in% expand_tab_items) return(meta[[x]])
meta[[x]] |>
dplyr::select(-var, -suffix) |>
@@ -62,33 +79,158 @@ get_metadata <- function(
})
}
+#' Rename raw data
+#'
+#' Helper function to rename raw data
+#'
+#' @param data A data frame with raw study data.
+#' @param column_names A data frame with column names. Should have at
+#' least the columns `name_raw`, containing the current column names, and
+#' `name_new`, containing the new column names. `name_new` should contain all
+#' names that are required for ClinSight to function properly
+#' (`required_col_names`).
+#'
+#' @return A data frame
+#'
+rename_raw_data <- function(
+ data,
+ column_names = metadata$column_names
+){
+ stopifnot("[data] should be a data frame" = is.data.frame(data))
+ stopifnot("[column_names] should be a data frame" = is.data.frame(column_names))
+ if(!all(c("name_raw", "name_new") %in% names(column_names))){
+ stop("Expecting the columns 'name_raw' and 'name_new' in [column_names]")
+ }
+ missing_colnames <- with(column_names, name_raw[!name_raw %in% names(data)]) |>
+ paste0(collapse = ", ")
+ if(nchar(missing_colnames) > 0) stop(
+ paste0("The following columns are missing in the raw data while they are ",
+ "defined in 'name_raw' of column_names:\n",
+ missing_colnames, ".")
+ )
+ missing_new_cols <- required_col_names[!required_col_names %in% column_names$name_new] |>
+ paste0(collapse = ", ")
+ if(nchar(missing_new_cols) > 0) stop(
+ paste0("The following columns are missing in 'name_new' of column_names while they ",
+ "are required for ClinSight to run:\n",
+ missing_new_cols, ".")
+ )
+ # Remove unneeded colums, and rename them:
+ df <- data[column_names$name_raw] |>
+ setNames(column_names$name_new)
+ # Remove rows without subject_id and return results:
+ df[!is.na(df$subject_id), ]
+}
+
+#' Add time vars to raw data
+#'
+#' @param data A data frame
+#'
+#' @return A data frame, with derivative time and event variables, needed for
+#' ClinSight to function properly.
+#'
+add_timevars_to_data <- function(
+ data
+){
+ stopifnot("[data] should be a data frame" = is.data.frame(data))
+ missing_new_cols <- required_col_names[!required_col_names %in% names(data)] |>
+ paste0(collapse = ", ")
+ if(nchar(missing_new_cols) > 0) stop(
+ paste0("The following columns are missing while they are required:\n",
+ missing_new_cols, ".")
+ )
+
+ df <- data |>
+ dplyr::mutate(
+ edit_date_time = as.POSIXct(edit_date_time, tz = "UTC"),
+ event_date = as.Date(event_date),
+ day = event_date - min(event_date, na.rm = TRUE),
+ vis_day = ifelse(event_id %in% c("SCR", "VIS", "VISEXT", "VISVAR", "FU1", "FU2"), day, NA),
+ vis_num = as.numeric(factor(vis_day))-1,
+ event_name = dplyr::case_when(
+ event_id == "SCR" ~ "Screening",
+ event_id %in% c("VIS", "VISEXT", "VISVAR") ~ paste0("Visit ", vis_num),
+ grepl("^FU[[:digit:]]+", event_id) ~ paste0("Visit ", vis_num, "(FU)"),
+ event_id == "UN" ~ paste0("Unscheduled visit ", event_repeat),
+ event_id == "EOT" ~ "EoT",
+ event_id == "EXIT" ~ "Exit",
+ form_id %in% c("AE", "CM", "CP", "MH", "MH", "MHTR", "PR", "ST", "CMTR", "CMHMA") ~ "Any visit",
+ TRUE ~ paste0("Other (", event_name, ")")
+ ),
+ event_label = dplyr::case_when(
+ !is.na(vis_num) ~ paste0("V", vis_num),
+ event_id == "UN" ~ paste0("UV", event_repeat),
+ TRUE ~ event_name
+ ),
+ .by = subject_id
+ ) |>
+ dplyr::arrange(
+ factor(site_code, levels = order_string(site_code)),
+ factor(subject_id, levels = order_string(subject_id))
+ )
+ if(any(grepl("^Other ", df$event_name))) warning(
+ "Undefined Events detected. Please verify data before proceeding."
+ )
+ df
+}
+
+
+
#' Correct multiple choice variables
-#'
-#' Function to correct multiple choice variables in the data.
#'
-#' @param data data frame (typically the raw data)
-#' @param meta metadata, list of data frames.
+#' In some EDC systems, if there is a multiple choice variable in which multiple
+#' answers are possible, the variable will be renamed with a suffix with the
+#' multiple answers in it. For example var1, var2, for answers 1 and 2. This
+#' function cleans this specific output so that the variable name remains
+#' consistent.
+#'
+#' @param data A data frame.
+#' @param expected_vars Character vector containing the expected names of the
+#' variables.
#' @param var_column column name in which the variable names are stored
-#' @param value_column column name in which the values of the variables are stored
+#' @param value_column column name in which the values of the variables are
+#' stored
#' @param suffix Multiple choice suffix. Used to define multiple choice values
#' @param common_vars variables used for identifying unique rows in the dataset.
-#' @param collapse_with character value to collapse the multiple choice options with.
-#' If this value is NULL, the rows will be left as is.
+#' @param collapse_with character value to collapse the multiple choice options
+#' with. If this value is NULL, the rows will be left as is.
#'
#' @return data frame with corrected multiple choice variables
+#' @examples
+#' df <- data.frame(
+#' ID = "Subj1",
+#' var = c("Age", paste0("MH_TRT", 1:4)),
+#' item_value = as.character(c(95, 67, 58, 83, 34))
+#' )
+#' fix_multiple_choice_vars(df, common_vars = "ID")
#' @export
+#'
fix_multiple_choice_vars <- function(
- data = raw_data,
- meta = metadata,
+ data,
+ expected_vars = metadata$items_expanded$var,
var_column = "var",
value_column = "item_value",
suffix = "[[:digit:]]+$",
common_vars = c("subject_id", "event_repeat", "event_date", "form_repeat"),
collapse_with = "; "
){
+ stopifnot(is.data.frame(data))
+ stopifnot(is.character(expected_vars))
+ stopifnot("var_column should be a vector of length 1" = {
+ is.character(var_column) & length(var_column) == 1
+ })
+ stopifnot("suffix should be a character vector of length 1" = {
+ is.character(suffix) & length(suffix) == 1
+ })
+ stopifnot(is.character(common_vars))
+ if(!is.null(collapse_with)){
+ stopifnot("collapse_with should be a character vector of length 1" = {
+ is.character(collapse_with) & length(collapse_with) == 1
+ })
+ }
all_vars <- unique(data[[var_column]])
- expected_vars <- meta$items_expanded$var
+
missing_vars <- expected_vars[!expected_vars %in% all_vars]
if(length(missing_vars) == 0) return(data)
@@ -137,7 +279,7 @@ fix_multiple_choice_vars <- function(
#'
get_meta_vars <- function(data = appdata, meta = metadata){
stopifnot(inherits(data, "list"))
- stopifnot(inherits(metadata, "list"))
+ stopifnot(inherits(meta, "list"))
if(length(data) == 0) stop("Empty list with data provided")
vars <- list()
# add metadata variables:
@@ -147,24 +289,88 @@ get_meta_vars <- function(data = appdata, meta = metadata){
dplyr::distinct(item_name, item_group) |>
split(~item_group) |>
lapply(\(x){setNames(simplify_string(x$item_name), x$item_name)})
- vars$groups <- meta$groups$item_group
- common_forms <- c("Adverse events", "Medical History", "Medication", "Conc. Procedures")
+ study_forms <- unique(meta$study_forms$item_group)
+ common_forms <- unique(meta$common_forms$item_group)
vars$all_forms <- data.frame(
"main_tab" = c(
rep("Common events", times = length(common_forms)),
- rep("Study data", times = length(vars$groups))
+ rep("Study data", times = length(study_forms))
),
- "form" = c(common_forms, vars$groups)
+ "form" = c(common_forms, study_forms)
)
# add variables dependent on dataset:
vars$subject_id <- order_string(get_unique_vars(data, "subject_id")[[1]])
vars$Sites <- get_unique_vars(data, c("site_code", "region")) |>
dplyr::arrange(factor(site_code, levels = order_string(site_code)))
- vars$table_names <- setNames(metadata$table_names$raw_name, metadata$table_names$table_name)
+ vars$table_names <- setNames(meta$table_names$raw_name, meta$table_names$table_name)
+ # adding form-level data here since it meta vars are already passed through in
+ # the modules that need this information (e.g. mod_main_sidebar):
+ vars$form_level_data <- meta$form_level_data
vars
}
+#' Get form-level data.
+#'
+#' Internal function to clean form-level data and return a data frame with all
+#' forms that should be specified, and include form-level data for all of them.
+#' Will also set default values (as defined in the package) if the value is not
+#' set and/or is missing.
+#'
+#' @param data A data frame with form-level data. Should at least contain the
+#' `form_column`.
+#' @param all_forms A character vector containing the names of all forms for
+#' which form-level data should be specified.
+#' @param form_column Character string with the column in which the form names
+#' are stored in `data`.
+#'
+#' @return A cleaned data frame with form-level data.
+#'
+get_form_level_data <- function(
+ data,
+ all_forms,
+ form_column = "item_group"
+){
+ stopifnot(is.character(form_column))
+ stopifnot(is.character(all_forms))
+ all_forms_df <- setNames(data.frame(all_forms), form_column)
+ default_data <- data.frame(all_forms_df, form_level_defaults)
+
+ if(is.null(data) || !is.data.frame(data) ){
+ warning("No valid update table found. Falling back to defaults.")
+ return(default_data)
+ }
+
+ if(!form_column %in% names(data)){
+ stop(sprintf("'%s' missing in 'form_level_data' table.", form_column))
+ }
+
+ missing_forms <- data[!data[[form_column]] %in% all_forms, ][[form_column]]
+ if(length(missing_forms) != 0){
+ warning(
+ "Ignoring vars defined in 'form_level_data' but not in metadata:\n",
+ sprintf("'%s' ", missing_forms)
+ )
+ data <- data[!data[[form_column]] %in% missing_forms, ]
+ }
+
+ if(nrow(data) == 0){
+ warning("No forms with form-level data found. Returning defaults.")
+ return(default_data)
+ }
+ # Return data in two steps to preserve the order as in `all_forms`
+
+ # Add missing columns
+ data <- data |>
+ add_missing_columns(names(form_level_defaults)) |>
+ readr::type_convert(col_types = form_level_default_specs)
+
+ # Use default only if value is missing after type conversion:
+ all_forms_df |>
+ dplyr::left_join(data, by = form_column) |>
+ tidyr::replace_na(as.list(form_level_defaults))
+}
+
#' Get base value
#'
#' Adds base value to a long-format data frame.
@@ -301,7 +507,23 @@ add_missing_columns <- function(
#' rename any column names found in this vector to the provided name.
#' @param title Optional. Character string with the title of the table.
#' @param selection See [DT::datatable()]. Default set to 'single'.
-#' @param ... Other optional arguments that will be parsed to [DT::datatable()].
+#' @param extensions See [DT::datatable()]. Default set to 'Scroller'.
+#' @param plugins See [DT::datatable()]. Default set to 'scrollResize'.
+#' @param dom See \url{https://datatables.net/reference/option/dom}. A div
+#' element will be inserted before the table for the table title. Default set
+#' to 'fti' resulting in 'f<"header h5">ti'.
+#' @param options See [DT::datatable()]. Must be a list.
+#' * Modifiable defaults:
+#' * `scrollY = '400px'`
+#' * `scrollX = TRUE`
+#' * `scroller = TRUE`
+#' * `deferREnder = TRUE`
+#' * `scrollResize = TRUE`
+#' * `scrollCollapse = TRUE`
+#' * Non-modifiable defaults:
+#' * `dom`: Defined by the `dom` parameter.
+#' * `initComplete`: Defaults to a function to insert table title into dataTable container.
+#' @param ... Other optional arguments that will be passed to [DT::datatable()].
#'
#' @return A `DT::datatable` object.
#' @export
@@ -312,6 +534,10 @@ datatable_custom <- function(
rename_vars = NULL,
title = NULL,
selection = "single",
+ extensions = "Scroller",
+ plugins = "scrollResize",
+ dom = "fti",
+ options = list(),
...
){
stopifnot(is.data.frame(data))
@@ -319,17 +545,40 @@ datatable_custom <- function(
stopifnot(is.character(rename_vars))
data <- dplyr::rename(data, dplyr::any_of(rename_vars))
}
- if(!is.null(title)){
- stopifnot(is.character(title))
- title <- tags$caption(
- style = 'caption-side: top; text-align: center;',
- tags$h5(tags$b(title))
- )
- }
+ stopifnot(is.null(title) | is.character(title))
+ stopifnot(grepl("t", dom, fixed = TRUE))
+ stopifnot(is.list(options))
+
+ default_opts <- list(
+ scrollY = 400,
+ scrollX = TRUE,
+ scroller = TRUE,
+ deferRender = TRUE,
+ scrollResize = TRUE,
+ scrollCollapse = TRUE
+ )
+ fixed_opts <- list(
+ initComplete = DT::JS(
+ "function() {",
+ paste0(
+ "$(this.api().table().container()).find('.header').html(",
+ htmltools::htmlEscape(deparse(title %||% "")),
+ ")"
+ ),
+ "}"
+ ),
+ dom = gsub(pattern = "(t)", replacement = '<"header h5">\\1', dom)
+ )
+ opts <- default_opts |>
+ modifyList(options) |>
+ modifyList(fixed_opts)
+
DT::datatable(
data,
- selection = "single",
- caption = title,
+ selection = selection,
+ options = opts,
+ extensions = extensions,
+ plugins = plugins,
...
)
}
diff --git a/R/fct_data_tests.R b/R/fct_data_tests.R
index 7a859a2c..c30d751c 100644
--- a/R/fct_data_tests.R
+++ b/R/fct_data_tests.R
@@ -53,33 +53,3 @@ check_appdata <- function(
cat("data check completed.\n")
}
-
-#' Check available data
-#'
-#' Checks if data is loaded in memory and if not, provides an informative error
-#' message.
-#'
-#' @param required_data A character vector with objects that are required.
-#' @param env The environment to check in.
-#'
-#' @return Nothing if the checks are passed. If not, will throw an error.
-#' @export
-#'
-#' @examples
-#' # check_available_data("missing_data_frame")
-#' # Error in check_available_data("missing_data_frame") :
-#' # The following data objects are required to run the app properly,
-#' # but are missing: missing_data_frame
-#'
-check_available_data <- function(
- required_data = c("appdata", "apptables", "vars", "db_path"),
- env = globalenv()
-){
- stopifnot(is.character(required_data))
- missing_dfs <- required_data[!required_data %in% ls(envir = env)]
- if(!length(missing_dfs) == 0) stop(
- "The following data objects are required to run the app properly, but are missing: ",
- paste0(missing_dfs, collapse = ", ")
- )
-}
-
diff --git a/R/fct_figures.R b/R/fct_figures.R
index f86c4daf..50f0ed6a 100644
--- a/R/fct_figures.R
+++ b/R/fct_figures.R
@@ -80,32 +80,32 @@ fig_boxplots <- function(
}
#' Create timeline
-#'
-#' Function to create a simple timeline figure using `ggplot2`.
+#'
+#' Function to create a simple timeline figure using `ggplot2`.
#'
#' @param data Data frame to use.
-#' @param meta_data Metadata file with all possible time points.
+#' @param events Data frame containing information about all events. Used
+#' to create the right labels in the timeline figure.
#'
#' @return A ggplot2 object.
#' @export
-#'
+#'
fig_timeline <- function(
data,
- meta_data = metadata
+ events
){
stopifnot(is.data.frame(data))
- stopifnot(is.list(meta_data))
+ stopifnot(is.data.frame(events))
completed_events <- data |>
dplyr::filter(!is.na(event_name),
- event_label %in% meta_data$events$event_label) |>
+ event_label %in% events$event_label) |>
dplyr::slice_head(n = 1, by = c(event_name, item_name)) |> # 051022 LSA ensures only one item per event
dplyr::count(event_name, event_label) |>
dplyr::mutate(
- all_data = factor(as.numeric(n == length(meta_data$items$item_name))),
- event_label = factor(event_label, levels = meta_data$events$event_label)
+ event_label = factor(event_label, levels = events$event_label)
)
- all_events <- meta_data$events |>
+ all_events <- events |>
dplyr::mutate(event_name = factor(event_name, levels = event_name),
event_label = factor(event_label, levels = event_label))
uneven_events <- all_events[1:length(all_events$event_name) %% 2 == 0, ]
@@ -137,23 +137,20 @@ fig_timeline <- function(
)
# by showing these layers conditionally, no error will occur when no subject
# is yet selected
- if(nrow(data) == 0) fig else {
+ if(nrow(data) == 0 || nrow(completed_events) == 0) fig else {
fig +
- ggplot2::geom_segment(
- data = completed_events,
- ggplot2::aes(
- x = dplyr::first(event_label),
- xend = dplyr::last(event_label),
- y = 1,
- yend = 1
- )
+ ggplot2::annotate(
+ geom = "segment",
+ x = dplyr::first(completed_events$event_label),
+ xend = dplyr::last(completed_events$event_label),
+ y = 1,
+ yend = 1
) +
ggplot2::geom_point(
data = completed_events,
- ggplot2::aes(fill = all_data),
+ fill = "grey80",
size = 6, pch = 21
- ) +
- ggplot2::scale_fill_manual(values = c("0" = "grey80", "1" = "black"))
+ )
}
}
diff --git a/R/fct_tables.R b/R/fct_tables.R
index 5e0716c4..dc2efa86 100644
--- a/R/fct_tables.R
+++ b/R/fct_tables.R
@@ -57,7 +57,8 @@ create_table.default <- function(
values_from = {{value_column}},
values_fn = ~paste0(., collapse = "; ")
)
- if(is.null(expected_columns)) return(df)
+ expected_columns <- na.omit(expected_columns) %||% character(0)
+ if(length(expected_columns) == 0) return(df)
add_missing_columns(df, expected_columns)[
unique(c(keep_vars, expected_columns))
]
@@ -128,6 +129,7 @@ create_table.general <- function(
expected_columns = NULL,
...
){
+ expected_columns <- na.omit(expected_columns) %||% character(0)
df_names <- c(keep_vars, name_column, value_column, expected_columns)
if(is.null(data)) {
data <- data.frame(matrix(ncol = length(df_names))) |>
diff --git a/R/fct_utils.R b/R/fct_utils.R
index 1cb9a4ca..bac5e9ab 100644
--- a/R/fct_utils.R
+++ b/R/fct_utils.R
@@ -23,9 +23,9 @@ time_stamp <- function(
# propagate errors from internal base R as.Date() function to check for valid
# function options:
check_valid_date_format <- try(as.Date(ts), silent = TRUE)
- if(inherits(check_valid_date_format, "try-error")){
- stop(check_valid_date_format)
- }
+ if(inherits(check_valid_date_format, "try-error")){
+ stop(check_valid_date_format)
+ }
ts
}
@@ -175,7 +175,7 @@ title_case <- function(x) {
toupper(substring(x, 1, 1)),
tolower(substring(x, 2)),
collapse = " "
- ) }) |>
+ ) }) |>
unlist()
}
@@ -410,7 +410,7 @@ is_date <- function(x) {
stopifnot(is.atomic(x))
inherits(x, c("Date", "POSIXt"))
}
-
+
#' Convert non-numeric columns to character
#'
#' @param data A data frame with columns that need to be converted.
@@ -453,7 +453,7 @@ date_cols_to_char <- function(data){
list_data <- lapply(data, \(x){
if(is_date(x)) as.character(x) else x
})
- dplyr::bind_rows(list_data)
+ dplyr::bind_rows(list_data)
}
@@ -481,14 +481,14 @@ clean_dates <- function(
x,
unknown_pattern = "NK",
unknown_replacement = "01"
- ){
+){
stopifnot(is.character(x) | is_date(x))
if(is_date(x)) return(x)
gsub(
paste0("-", unknown_pattern[1]),
paste0("-", unknown_replacement[1]),
x
- ) |>
+ ) |>
as.Date()
}
@@ -571,28 +571,138 @@ get_test_results <- function(
reporter = reporter,
stop_on_failure = FALSE,
stop_on_warning = FALSE
- )
+ )
+ cat("\n\n----------------------------\n\nFinished unit testing. Results: \n")
+ test_results <- format_test_results(test_results_raw)
+ if(is.null(outfile)) return(test_results)
+ saveRDS(test_results, outfile)
+ if(file.exists(outfile)){
+ cat("Output created in ", outfile, "\n")
+ }
+ cat("\n----------------------------\n\n")
+}
+
+#' Format testthat results
+#'
+#' Helper function to reshape original testthat output into a list format with
+#' the testthat tests output, and some metadata to make it easier to
+#' interpretate the results.
+#'
+#' @param results An object of class `testthat_results`, created with one of the
+#' `testthat::test_*` functions.
+#'
+#' @return A list with test results and metadata containing information such as
+#' a summary of the tests and their outcome, a timestamp, and the results of
+#' utils::sessionInfo() of the environment in which the tests ran.
+#' @noRd
+#'
+format_test_results <- function(
+ results
+){
+ if(isFALSE(inherits(results, "testthat_results"))){
+ stop("Expecting an object of class 'testthat_results'")
+ }
test_results <- list(
- "results" = test_results_raw,
+ "results" = results,
"time" = time_stamp(form = "%Y-%m-%d %H:%M:%S %Z", timezone = "UTC"),
- "session" = utils::sessionInfo()
+ "session" = utils::sessionInfo(),
+ "sum_results" = "",
+ "test_outcome" = ""
)
- if(is.null(outfile)) return(test_results)
- cat("Finished unit testing. Results: \n")
# Summary is nice to have but should not give a fatal error:
tryCatch({
# TODO: maybe import testthat:::as.data.frame.testthat_results?
test_df <- as.data.frame(test_results$results)
- print(
- sapply(test_df[c("failed", "skipped", "error", "warning", "passed")], sum)
- )
+ sum_results <- sapply(test_df[c("failed", "skipped", "error", "warning", "passed")], sum)
+ print(sum_results)
+ test_results[["sum_results"]] <- sum_results
+ test_outcome <- ifelse(isTRUE(all_tests_passed(test_results)), "pass", "fail")
+ test_results[["test_outcome"]] <- test_outcome
},
error = function(x) "Could not summarize results. Verify results manually"
)
- saveRDS(test_results, outfile)
- if(file.exists(outfile)){
- cat("Output created successfully in ", outfile, "\n")
+ tryCatch({
+ if(identical(test_outcome, "pass")) {
+ cat("All tests passed successfully\n")
+ } else{
+ warning("Not all tests passed successfully. Verify the outcome.")
+ failed_tests <- with(test_df, file[failed != 0])
+ if(length(failed_tests) != 0){
+ cat(
+ "There was a failure in the following tests: \n",
+ paste0(failed_tests, collapse = "\n"),
+ "\n",
+ sep = ""
+ )
+ cat("Failure messages: \n\n")
+ res <- unlist(with(test_df, result[file %in% failed_tests]), recursive = FALSE)
+ lapply(res, \(x){if(expectation_type(x, "failure")) x[]}) |>
+ unlist() |>
+ cat(sep = "\n\n")
+ }
+ }
+ },
+ error = function(x) "Could not print problematic results. Verify results manually"
+ )
+ test_results
+}
+
+#' All tests passed
+#'
+#' Helper function to determine whether all tests passed. Designed to be used
+#' together with get_test_results.
+#'
+#' @param results A list with test results. Should contain `var`
+#' @param var A character vector with the name of the list element that contains
+#' the summary results.
+#' @param include_skipped Boolean. Whether to check if no tests were skipped.
+#'
+#' @return A boolean.
+#' @noRd
+#'
+all_tests_passed <- function(results, var = "sum_results", include_skipped = TRUE){
+ stopifnot("results needs to be a list" = inherits(results, "list"))
+ if(!var %in% names(results)){
+ warning(paste0(var, " is missing from the results. Cannot determine if all tests passed"))
+ return(NA)
}
+ res <- results[[var]]
+ cols_to_verify <- c("failed", "error", "warning")
+ if(include_skipped) cols_to_verify <- c(cols_to_verify, "skipped")
+ (sum(res[cols_to_verify]) == 0 ) && res[["passed"]] != 0
}
+#' Verify expectation type
+#'
+#' Helper function to verify expectation type.
+#'
+#' @param exp The expection to verify
+#' @param type Character string with the expected type
+#'
+#' @return A boolean
+#' @noRd
+expectation_type <- function(
+ exp,
+ type = c("failure", "error", "skip", "warning", "success")
+) {
+ stopifnot(testthat::is.expectation(exp))
+ type <- match.arg(type)
+ identical(gsub("^expectation_", "", class(exp)[[1]]), type)
+}
+
+
+#' Custom config path
+#'
+#' Note: this is a temporary solution, to circumvent the issue described here:
+#' https://github.com/ThinkR-open/golem/issues/1178#issue-2513219365. It ensures
+#' that a flexible path to the config file can be set by the user. Works with
+#' golem version 0.5.1.
+#'
+#' @return A path to the active config file to use for the application.
+#' @noRd
+#'
+custom_config_path <- function(
+){
+ Sys.getenv("CONFIG_PATH", app_sys("golem-config.yml"))
+}
diff --git a/R/global.R b/R/global.R
index 23fcd42a..777d21a2 100644
--- a/R/global.R
+++ b/R/global.R
@@ -2,39 +2,22 @@
# use script below for development purposes, to load data global environment
# with eval(global)
global <- quote({
- data_local <- file.path(Sys.getenv("DATA_FOLDER", app_sys()), "merged_data.rds")
+ data_folder <- Sys.getenv("DATA_FOLDER", app_sys())
+ data_local <- file.path(data_folder, "study_data.rds")
raw_data_remote <- Sys.getenv("RAW_DATA_PATH")
- db_path <- file.path(Sys.getenv("DATA_FOLDER", app_sys()), "user_db.sqlite")
- data_synched <- FALSE
-
+ meta_data <- get_metadata(file.path(data_folder, "metadata.xlsx"))
+
if(!file.exists(data_local)){
- warning("No data found. Trying to rebuild raw data from remote source")
- merged_data <- merge_meta_with_data(get_raw_data(
- data_path = raw_data_remote, column_specs = metadata$column_specs))
- cat("saving raw data locally\n")
- saveRDS(merged_data, data_local)
+ warning("No data found. Trying to rebuild data from remote source")
+ study_data <- raw_data_remote |>
+ get_raw_csv_data() |>
+ merge_meta_with_data(meta = meta_data)
+ cat("saving data locally\n")
+ saveRDS(study_data, data_local)
if(!file.exists(data_local)) stop("Could not save data set locally.")
- data_synched <- TRUE
}
- merged_data <- readRDS(data_local)
-
- if(!file.exists(db_path)){
- warning("no database found. New database will be created")
- # If needed, load older data here and use settings such as below in
- # for testing purposes:
- # reviewed = "Yes", reviewer = "Medical Monitor 1", status = "old"
- db_create(get_review_data(merged_data), db_path = db_path)
- } else{
- db_update(get_review_data(merged_data), db_path, data_synched = data_synched)
- }
-
- appdata <- get_appdata(merged_data)
- vars <- get_meta_vars(data = appdata, meta = metadata)
- apptables <- lapply(
- setNames(names(appdata), names(appdata)), \(x){
- create_table(appdata[[x]], expected_columns = names(vars$items[[x]]))
- })
- check_appdata(appdata, metadata)
+ Sys.setenv("GOLEM_CONFIG_ACTIVE" = "shinymanager")
+ run_app(data_folder = data_folder)
})
@@ -55,6 +38,7 @@ utils::globalVariables(
"item_group",
"item_name",
"item_value",
+ "ID",
"site_code",
"reviewed",
"DiscontinuationDate",
@@ -73,6 +57,7 @@ utils::globalVariables(
"query_id",
"needs_review",
"reviewed",
+ "review_required",
"Sex",
"var",
"in_use",
@@ -83,6 +68,7 @@ utils::globalVariables(
"out_of_lim",
"n",
"query",
+ "type",
"resolved",
"reviewer",
"CTCAE severity worsening",
diff --git a/R/mod_common_forms.R b/R/mod_common_forms.R
index 1a81ee40..09f0f833 100644
--- a/R/mod_common_forms.R
+++ b/R/mod_common_forms.R
@@ -7,20 +7,26 @@ mod_common_forms_ui <- function(id, form){
ns <- NS(id)
bslib::nav_panel(
title = form,
- bslib::card(
- mod_timeline_ui(ns("timeline_fig")),
- bslib::layout_columns(
- col_widths = c(3, 9, 12, 12),
- fillable = FALSE,
+ mod_timeline_ui(ns("timeline_fig")),
+ bslib::layout_sidebar(
+ fillable = FALSE,
+ if(form == "Adverse events"){
+ DT::dataTableOutput(ns("SAE_table"))
+ },
+ DT::dataTableOutput(ns("common_form_table")),
+ sidebar = bslib::sidebar(
+ bg = "white",
+ position = "right",
shinyWidgets::materialSwitch(
inputId = ns("show_all_data"),
label = "Show all participants",
status = "primary",
right = TRUE
),
- HTML("Bold*: New/updated data"),
- DT::dataTableOutput(ns("SAE_table")),
- DT::dataTableOutput(ns("common_form_table"))
+ bslib::card_body(
+ HTML("Bold*: New/updated data"),
+ fillable = FALSE
+ )
)
)
)
@@ -106,7 +112,6 @@ mod_common_forms_server <- function(
)
) |>
create_table(expected_columns = names(form_items))
- df[["form_repeat"]] <- NULL
if(!input$show_all_data){
df <- with(df, df[subject_id == r$subject_id, ])
}
@@ -115,22 +120,19 @@ mod_common_forms_server <- function(
mod_timeline_server("timeline_fig", r = r, form = form)
- if(form != "Adverse events"){
- shinyjs::hide("SAE_table")
- }
output[["SAE_table"]] <- DT::renderDT({
req(form == "Adverse events")
SAE_data <- data_active() |>
dplyr::filter(grepl("Yes", `Serious Adverse Event`)) |>
dplyr::select(dplyr::any_of(
- c("subject_id", "Name", "AESI", "SAE Start date",
+ c("subject_id","form_repeat", "Name", "AESI", "SAE Start date",
"SAE End date", "CTCAE severity", "Treatment related",
"Treatment action", "Other action", "SAE Category",
"SAE Awareness date", "SAE Date of death", "SAE Death reason")
)) |>
adjust_colnames("^SAE ")
if(!input$show_all_data) SAE_data$subject_id <- NULL
- datatable_custom(SAE_data, rename_vars = table_names,
+ datatable_custom(SAE_data, rename_vars = table_names, rownames= FALSE,
title = "Serious Adverse Events", escape = FALSE)
})
@@ -143,7 +145,7 @@ mod_common_forms_server <- function(
dplyr::select(-dplyr::starts_with("SAE"))
}
if(!input$show_all_data) df$subject_id <- NULL
- datatable_custom(df, rename_vars = table_names,
+ datatable_custom(df, rename_vars = table_names, rownames= FALSE,
title = form, escape = FALSE)
})
diff --git a/R/mod_db_synch_info.R b/R/mod_db_synch_info.R
index 7ec7a041..39f62a08 100644
--- a/R/mod_db_synch_info.R
+++ b/R/mod_db_synch_info.R
@@ -31,23 +31,28 @@ mod_db_synch_info_ui <- function(id){
#' @param db_path Character vector with the path to the app database. Required
#' to retrieve the latest database synch date that is stored in the data frame
#' "db_synch_time".
-#' @param test_mode Logical. If TRUE, a fixed date (2024-01-10) will be chosen
-#' as current date, This way, the module can be tested consistently. Can be
-#' replaced and removed as soon as mocking is available within `shinytest2`.
-#' @param show_warning Logical. Whether to show a pop-up message with a warning
-#' if database synchronization did not happen on the current day. Useful to
-#' be able to turn off the message for testing purposes.
+#' @param current_date Current date. Standard `Sys.Date()`. Can be useful to set
+#' for testing purposes.
+#' @param show_synch_warning Logical. Whether to show a pop-up message with a
+#' warning if database synchronization did not happen on the current day. Will
+#' normally be shown if in the configuration the app is set to production.
#'
#' @seealso [mod_db_synch_info_ui()]
-mod_db_synch_info_server <- function(id, app_data, db_path, test_mode, show_warning = TRUE){
+mod_db_synch_info_server <- function(
+ id,
+ app_data,
+ db_path,
+ current_date = Sys.Date(),
+ show_synch_warning = isTRUE(get_golem_config("app_prod"))
+ ){
stopifnot(is.list(app_data))
stopifnot(is.character(db_path))
+ stopifnot(is_date(current_date))
+ stopifnot(is.logical(show_synch_warning))
+
moduleServer( id, function(input, output, session){
ns <- session$ns
- # below allows consistent snapshot testing with a fixed current date:
- current_date <- if (test_mode) as.Date("2024-01-10") else Sys.Date()
-
synch_time <- reactive({
tryCatch({
if(!file.exists(db_path)) dbt <- NULL else{
@@ -72,7 +77,7 @@ mod_db_synch_info_server <- function(id, app_data, db_path, test_mode, show_warn
# hack to be able to test the db_synch date:
synch_warning <- reactive({
- req(synch_time(), show_warning)
+ req(synch_time(), show_synch_warning)
if(synch_time() == "Unknown") return({
paste0(
"The latest database synchronization date is Unknown.
",
diff --git a/R/mod_header_widgets.R b/R/mod_header_widgets.R
index d3012d2f..4c7faceb 100644
--- a/R/mod_header_widgets.R
+++ b/R/mod_header_widgets.R
@@ -6,19 +6,21 @@
mod_header_widgets_ui <- function(id){
ns <- NS(id)
tagList(
- bslib::layout_columns(
- fill = FALSE,
- col_widths = c(2,2,2, 6),
+ bslib::layout_column_wrap(
+ width = NULL,
+ fixed_width = FALSE,
+ style = bslib::css(grid_template_columns = "1fr 1fr 1fr 3fr"),
mod_navigate_participants_ui("navigate_participants_1"),
shiny::uiOutput(ns("ae_box"), class = "top-widgets-ui"),
mod_navigate_review_ui("navigate_review_1"),
bslib::card(
- plotOutput(ns("visit_figure"), height = "auto"),
- # to change the padding with css:
- class = "timeline-fig-basic"
- ),
- class = "top-widgets-custom"
- )
+ max_height = "75px",
+ plotOutput(ns("visit_figure"), height = "auto"),
+ # to change the padding with css:
+ class = "timeline-fig-basic"
+ ),
+ class = "top-widgets-custom"
+ )
)
}
@@ -34,9 +36,9 @@ mod_header_widgets_ui <- function(id){
#' timeline figure showing the number of visits that the patient performed. The
#' value box with adverse events also serves as a link to the adverse events
#' form. Furthermore, clicking on the box with forms to review will trigger
-#' [mod_navigate_review_server()], opening a modal that shows the forms that need
-#' review and the queries that are open of the active participant, to which you
-#' can directly navigate to.
+#' [mod_navigate_review_server()], opening a modal that shows the forms that
+#' need review and the queries that are open of the active participant, to which
+#' you can directly navigate to.
#'
#' @param id Character string, used to connect the module UI with the module
#' Server.
@@ -45,12 +47,16 @@ mod_header_widgets_ui <- function(id){
#' @param navinfo Reactive values created with [shiny::reactiveValues()]. Used
#' to send back information about the page change to the server, when clicking
#' on the adverse event box.
+#' @param events Data frame containing all events. Used to extract the right
+#' labels for the visits in the compact timeline in the header_widgets. See
+#' [fig_timeline()].
#'
#' @seealso [mod_header_widgets_ui()]
-mod_header_widgets_server <- function(id, r, rev_data, navinfo){
+mod_header_widgets_server <- function(id, r, rev_data, navinfo, events){
stopifnot(is.reactivevalues(r))
stopifnot(is.reactivevalues(navinfo))
stopifnot(is.reactivevalues(rev_data))
+ stopifnot(is.data.frame(events))
moduleServer( id, function(input, output, session){
ns <- session$ns
@@ -116,7 +122,7 @@ mod_header_widgets_server <- function(id, r, rev_data, navinfo){
title = paste0("SAEs: ", SAEvalue.individual()),
value = paste0("AEs: ", AEvalue.individual()),
showcase = icon("house-medical", class = 'fa-2x'),
- theme_color = if(all_AEs_reviewed()) "primary" else "warning"
+ theme = if(all_AEs_reviewed()) "primary" else "warning"
)
})
output[["visit_figure"]] <- renderPlot(
@@ -124,7 +130,7 @@ mod_header_widgets_server <- function(id, r, rev_data, navinfo){
golem::cat_dev("plot datapoints figure\n")
fig_timeline(
data = selected_individual_data(),
- meta_data = metadata
+ events = events
)
},
height = 60
diff --git a/R/mod_main_sidebar.R b/R/mod_main_sidebar.R
index 7db409e8..2bec83b3 100644
--- a/R/mod_main_sidebar.R
+++ b/R/mod_main_sidebar.R
@@ -67,7 +67,6 @@ mod_main_sidebar_ui <- function(id){
#' created with the function [get_available_data()]. The data frame will be
#' passed on to the module [mod_query_add_server()], which requires this data
#' frame and is embedded in `mod_main_sidebar_server()`.
-#' @param test_mode Logical. Required for testing [mod_db_synch_info_server()].
#'
#' @seealso [mod_main_sidebar_ui()], [mod_query_add_server()]
#'
@@ -80,8 +79,7 @@ mod_main_sidebar_server <- function(
app_vars,
db_path,
forms_to_review,
- available_data,
- test_mode
+ available_data
){
stopifnot(is.reactivevalues(r))
@@ -114,6 +112,7 @@ mod_main_sidebar_server <- function(
mod_review_forms_server(
id = "review_forms_1",
r = r,
+ review_required_data = app_vars$form_level_data[c("item_group", "review_required")],
active_form = reactive(navinfo$active_form),
active_tab = reactive(navinfo$active_tab),
db_path = db_path
@@ -137,9 +136,7 @@ mod_main_sidebar_server <- function(
mod_db_synch_info_server(
id = "synch_info",
app_data = app_data,
- db_path = db_path,
- test_mode = test_mode,
- show_warning = !test_mode
+ db_path = db_path
)
})
}
diff --git a/R/mod_navigate_participants.R b/R/mod_navigate_participants.R
index 30d232eb..2d36fab1 100644
--- a/R/mod_navigate_participants.R
+++ b/R/mod_navigate_participants.R
@@ -155,8 +155,9 @@ mod_navigate_participants_server <- function(id, r){
bslib::value_box(
title = gsub("IME-", "", as.character(unique(r$subject_id)[1])),
value = subject_info()$pt_info,
- showcase = subject_info()$status_icon,
- theme_color = "primary"
+ showcase = subject_info()$status_icon,
+ max_height = "100px",
+ theme = "primary"
)
})
diff --git a/R/mod_navigate_review.R b/R/mod_navigate_review.R
index 9636186d..5e14bf03 100644
--- a/R/mod_navigate_review.R
+++ b/R/mod_navigate_review.R
@@ -11,7 +11,7 @@ mod_navigate_review_ui <- function(id){
bslib::value_box(
id = ns("review_value_box"),
title = "To review:",
- theme_color = "primary",
+ theme = "primary",
value = uiOutput(ns("forms_to_review")),
showcase = icon("clipboard-list", class = 'fa-2x')
)
@@ -134,16 +134,28 @@ mod_navigate_review_server <- function(
queries_table_data <- reactive({
# Select the initial query for every query id with slice_min:
+ #TODO: try to use the tables of mod_queries instead to remove duplication
df <- dplyr::slice_min(r$query_data, timestamp, by = query_id) |>
dplyr::filter(resolved == "No") |>
- dplyr::select(tidyr::all_of(c("subject_id", "item_group", "event_label", "query", "resolved")))
- if(input$show_all_data) df else { dplyr::filter(df, subject_id == r$subject_id) |>
+ dplyr::mutate(
+ ID = paste0(item, " (", item_group, ", ", event_label, ")"),
+ ID = ifelse(type == "Major", paste0(ID, " Major query"), ID)
+ ) |>
+ dplyr::select(tidyr::all_of(c("subject_id", "ID", "query")))
+ if(input$show_all_data) df else {
+ dplyr::filter(df, subject_id == r$subject_id) |>
dplyr::select(-subject_id)
}
})
output[["queries_table"]] <- DT::renderDT({
- datatable_custom(queries_table_data(), table_names)
+ datatable_custom(
+ queries_table_data(),
+ rename_vars = table_names,
+ options = list(scroller = FALSE),
+ rownames = FALSE,
+ selection = "none"
+ )
})
mod_go_to_form_server(
diff --git a/R/mod_queries.R b/R/mod_queries.R
index 30406889..4160a406 100644
--- a/R/mod_queries.R
+++ b/R/mod_queries.R
@@ -10,6 +10,15 @@ mod_queries_ui <- function(id){
bslib::layout_columns(
col_widths = c(8,4),
bslib::card(
+ bslib::card_body(
+ shinyWidgets::materialSwitch(
+ inputId = ns("show_resolved"),
+ label = "Show resolved queries",
+ status = "primary",
+ right = TRUE
+ ),
+ fill = FALSE
+ ),
bslib::card_body(
shinycssloaders::withSpinner(
DT::DTOutput(ns("queries")),
@@ -26,11 +35,12 @@ mod_queries_ui <- function(id){
col_widths = c(12,12),
bslib::card(
id = ns("details_panel"),
- bslib::page_fluid(
+ bslib::card_body(
htmlOutput(ns("selected_query_title")),
DT::DTOutput(ns("selected_query")),
HTML("
")
- )
+ ),
+ full_screen = TRUE
),
mod_query_follow_up_ui(ns("query_follow_up_1"))
)
@@ -76,6 +86,7 @@ mod_queries_server <- function(id, r, navinfo, all_forms, db_path, table_names){
selected_query <- reactive({
req(nrow(initial_queries())>0)
req(input$queries_rows_selected)
+ req(input$queries_rows_selected <= nrow(initial_queries()))
with(initial_queries(), query_id[input$queries_rows_selected])
})
@@ -83,19 +94,34 @@ mod_queries_server <- function(id, r, navinfo, all_forms, db_path, table_names){
req(nrow(r$query_data)>0)
req(selected_query())
req(selected_query() %in% unique(r$query_data$query_id))
- with(r$query_data, r$query_data[query_id == selected_query(), ])
+ with(r$query_data, r$query_data[query_id == selected_query(), ]) |>
+ dplyr::mutate(reviewer = paste0(reviewer, " ", timestamp))
})
mod_query_follow_up_server("query_follow_up_1", r = r,
selected_query = selected_query, db_path = db_path)
initial_queries <- reactive({
- df <- r$query_data |>
- dplyr::filter(n == 1)
- if(nrow(df) == 0) return(df)
- df |>
+ df <- with(r$query_data, r$query_data[n == 1, ] )
+ if(identical(nrow(df),0)) return(df)
+ df <- df |>
dplyr::slice_min(timestamp, by = c(subject_id, event_label, query_id)) |>
- dplyr::arrange(.data[["resolved"]])
+ dplyr::arrange(.data[["resolved"]], .data[["type"]]) |>
+ # Only show part of a long message for better display in table, since
+ # the entire message will already be shown when clicking on the row.
+ dplyr::mutate(
+ query = ifelse(
+ nchar(query)>40,
+ paste0(trimws(substr(query, 1, 40)), "..."),
+ query
+ )
+ )
+ if(isTRUE(input$show_resolved)) return(df)
+ with(df, df[resolved == "No", ] )
+ })
+
+ observeEvent(input$queries_rows_selected, {
+ input$queries_rows_selected
})
mod_go_to_form_server(
@@ -111,36 +137,42 @@ mod_queries_server <- function(id, r, navinfo, all_forms, db_path, table_names){
output[["queries"]] <- DT::renderDT({
req(initial_queries())
+ query_cols <- c("subject_id", "type", "event_label",
+ "item_group", "query", "timestamp")
+ table_title <- "Open queries"
+ if(input$show_resolved){
+ query_cols <- c("resolved", query_cols)
+ table_title <- "All queries"
+ }
datatable_custom(
- initial_queries()[c("subject_id", "event_label", "item_group", "timestamp", "query", "resolved")],
+ initial_queries()[query_cols],
table_names,
- title = "All queries"
- )
+ title = table_title
+ )
})
output[["selected_query_title"]] <- renderText({
req(selected_query_data())
df <- selected_query_data()[1,]
- query_title <- paste0(
- "",
- tags$h5(htmlEscape(df$subject_id)),
- "
",
- htmlEscape(df$item), " (",
- htmlEscape(df$item_group), "); ",
- df$event_label,
- "
resolved: ",
- tags$i(df$resolved),
- "",
- tags$line()
+ paste0(
+ "",
+ htmlEscape(df$subject_id), ": ",
+ htmlEscape(df$item),
+ ifelse(identical(df$type, "Major"), " - Major query", ""),
+ "
",
+ htmlEscape(df$item_group), ", ",
+ df$event_label,
+ ifelse(identical(df$resolved, "Yes"), " (resolved)", "")
)
})
output[["selected_query"]] <- DT::renderDT({
req(selected_query_data())
datatable_custom(
- selected_query_data()[c("reviewer", "timestamp", "query")],
- table_names,
- options = list(dom = 't', ordering = FALSE, pageLength = 100, scrollY = "200px"),
+ selected_query_data()[c("query", "reviewer")],
+ rename_vars = table_names,
+ dom = 't',
+ options = list(scroller = FALSE),
class = "row-border hover",
rownames = FALSE,
selection = "none"
diff --git a/R/mod_query_add.R b/R/mod_query_add.R
index 08d72468..ae3a6a6c 100644
--- a/R/mod_query_add.R
+++ b/R/mod_query_add.R
@@ -73,7 +73,7 @@ mod_query_add_server <- function(
bslib::card(
bslib::layout_sidebar(
sidebar = bslib::sidebar(
- id = ns("query.sidebar"),
+ id = ns("query_sidebar"),
open = "always",
HTML(paste0("", unique(sel_data$item_group), "")),
shiny::selectizeInput(
@@ -83,7 +83,7 @@ mod_query_add_server <- function(
options = list(
placeholder = 'Select a visit',
onInitialize = if(length(unique(sel_data$event_name)) == 1) NULL else {
- I('function() { this.setValue(""); }')
+ I('function() { this.setValue(""); }')
}
)
),
@@ -105,9 +105,28 @@ mod_query_add_server <- function(
width = "100%",
placeholder = "add query text here"
),
+ bslib::card_body(
+ shinyWidgets::materialSwitch(
+ inputId = ns("query_major"),
+ label = "Major query",
+ status = "danger",
+ inline = TRUE,
+ right = TRUE
+ ),
+ bslib::popover(
+ icon("circle-info"),
+ title = "Major queries",
+ id = ns("query_major_info"),
+ markdown("Only use for issues that could have a major impact
+ on either the patient safety or the study outcomes.")
+ ),
+ class = "d-flex flex-row",
+ fillable = FALSE,
+ gap = 0
+ ),
verbatimTextOutput(ns("reviewer"))
),
- shiny::verbatimTextOutput(ns("query_error"))
+ verbatimTextOutput(ns("query_error"))
),
min_height = "500px"
),
@@ -135,18 +154,19 @@ mod_query_add_server <- function(
query_save_error <- reactiveVal(FALSE)
observeEvent(input$query_add_input, {
- req(input$query_select_visit, input$query_text, r$user_name())
+ req(input$query_select_visit, input$query_text, r$user_name, r$user_role)
query_save_error(FALSE)
golem::cat_dev("Query text to add: ", input$query_text, "\n")
new_query <- dplyr::tibble(
"query_id" = paste0(r$subject_id, create_unique_id(5)),
- "subject_id" = r$subject_id,
+ "type" = ifelse(input$query_major, "Major", "Normal"),
+ "subject_id" = r$subject_id,
"event_label" = input$query_select_visit,
"item_group" = active_form(),
"item" = input$query_select_item,
"timestamp" = time_stamp(),
"n" = 1,
- "reviewer" = r$user_name(),
+ "reviewer" = paste0(r$user_name," (", r$user_role, ")"),
"query" = input$query_text,
"resolved" = "No",
"resolved_date" = NA_character_,
@@ -155,7 +175,7 @@ mod_query_add_server <- function(
golem::print_dev(new_query)
db_save(data = new_query, db_path = db_path, db_table = "query_data")
- query_in_db <- db_get_latest_query(
+ query_in_db <- db_get_query(
db_path, query_id = new_query$query_id, n = new_query$n
)
query_in_db <- unique(query_in_db[names(new_query)])
@@ -196,7 +216,7 @@ mod_query_add_server <- function(
"Form: ", htmlEscape(query_in_db$item_group), "
",
"Item: ", htmlEscape(query_in_db$item), "
",
"Query: ", htmlEscape(query_in_db$event_label), "
",
- "Author: ", htmlEscape(query_in_db$reviewer), "
"
+ "Author: ", htmlEscape(query_in_db$reviewer)
)),
footer = modalButton("Close")
)
@@ -206,23 +226,23 @@ mod_query_add_server <- function(
output[["query_error"]] <- renderPrint({
req(input$query_add_input)
validate(
+ need(r$user_name, "User name missing. Cannot save query anonymously."),
+ need(r$user_role, "User role missing. Cannot save query without user role."),
need(input$query_select_visit, "Please select a visit"),
- need(input$query_text, "Please add a query message"),
- need(r$user_name(), "User name missing. Cannot save query anonymously.")
+ need(input$query_text, "Please add a query message")
)
})
output[["reviewer"]] <- renderPrint({
- req(r$user_name())
- cat("Author:", r$user_name(), "\n")
+ req(r$user_name)
+ cat("Author: ", r$user_name, " (", r$user_role, ")\n", sep = "")
})
-
})
}
-
+
## To be copied in the UI
# mod_write_queries_ui("write_queries_1")
-
+
## To be copied in the server
# mod_write_queries_server("write_queries_1")
diff --git a/R/mod_query_follow_up.R b/R/mod_query_follow_up.R
index edfdcf77..e41a3ba0 100644
--- a/R/mod_query_follow_up.R
+++ b/R/mod_query_follow_up.R
@@ -14,7 +14,7 @@ mod_query_follow_up_ui <- function(id){
inputId = ns("query_follow_up_text"),
label = NULL,
width = "100%",
- height = "200px",
+ height = "20%",
placeholder = "add response here"
),
checkboxInput(
@@ -47,24 +47,41 @@ mod_query_follow_up_server <- function(id, r, selected_query, db_path){
moduleServer( id, function(input, output, session){
ns <- session$ns
+ observeEvent(selected_query(), {
+ is_resolved <- any(
+ with(r$query_data, resolved[query_id == selected_query()]) == "Yes"
+ )
+ shiny::updateCheckboxInput(inputId = "resolved", value = is_resolved)
+ shiny::updateTextAreaInput(
+ inputId = "query_follow_up_text",
+ placeholder = ifelse(
+ is_resolved,
+ "query is resolved",
+ "add response here"
+ )
+ )
+ if(is_resolved){
+ shinyjs::disable("query_follow_up")
+ } else{
+ shinyjs::enable("query_follow_up")
+ }
+ })
query_save_error <- reactiveVal(FALSE)
observeEvent(input$query_add_follow_up, {
- req(input$query_follow_up_text, r$user_name(), selected_query())
+ req(input$query_follow_up_text, r$user_name, r$user_role, selected_query())
req(selected_query() %in% r$query_data$query_id)
query_save_error(FALSE)
golem::cat_dev("Query FU text to add: ", input$query_follow_up_text, "\n")
ts <- time_stamp()
- updated_query <- r$query_data |>
- dplyr::as_tibble() |>
- dplyr::filter(query_id == selected_query()) |>
- dplyr::distinct(query_id, subject_id, item_group, item, event_label, n) |>
- dplyr::slice_max(n, with_ties = FALSE)
+ updated_query <- db_get_query(db_path, selected_query()) |>
+ db_slice_rows(slice_vars = "timestamp", group_vars = "query_id") |>
+ dplyr::distinct(query_id, type, subject_id, item_group, item, event_label, n)
updated_query <- updated_query |>
dplyr::mutate(
"timestamp" = ts,
"n" = n + 1,
- "reviewer" = r$user_name(),
+ "reviewer" = paste0(r$user_name," (", r$user_role, ")"),
"query" = input$query_follow_up_text,
"resolved" = ifelse(input$resolved, "Yes", "No"),
`resolved_date` = if(input$resolved) ts else NA_character_,
@@ -75,7 +92,7 @@ mod_query_follow_up_server <- function(id, r, selected_query, db_path){
# Update queries and selected queries data:
db_save(data = updated_query, db_path = db_path, db_table = "query_data")
#verify if query update was successful:
- query_in_db <- db_get_latest_query(
+ query_in_db <- db_get_query(
db_path, query_id = updated_query$query_id, n = updated_query$n
)
query_in_db <- unique(query_in_db[names(updated_query)])
@@ -96,7 +113,7 @@ mod_query_follow_up_server <- function(id, r, selected_query, db_path){
!identical(updated_query, query_in_db),
!identical(query_in_db, query_in_memory)
))
-
+
if(query_save_error()){
return({
showNotification(
@@ -111,7 +128,7 @@ mod_query_follow_up_server <- function(id, r, selected_query, db_path){
r$query_data <- collect_query_data(db_path)
})
}
-
+
updateTextInput(inputId = "query_follow_up_text", value = "")
shiny::updateCheckboxInput(
@@ -124,11 +141,12 @@ mod_query_follow_up_server <- function(id, r, selected_query, db_path){
output[["query_error"]] <- renderText({
req(input$query_add_follow_up)
validate(
+ need(r$user_name, "User name missing. Cannot save query anonymously."),
+ need(r$user_role, "User role missing. Cannot save query without user role."),
need(selected_query(), "Select a query to follow-up"),
need(selected_query() %in% r$query_data$query_id,
"Query ID unknown. Verify the database"),
- need(input$query_follow_up_text, "Follow-up message missing"),
- need(r$user_name(), "User name missing. Cannot save query anonymously.")
+ need(input$query_follow_up_text, "Follow-up message missing")
)
})
})
diff --git a/R/mod_report.R b/R/mod_report.R
index e64e987f..68ea2c21 100644
--- a/R/mod_report.R
+++ b/R/mod_report.R
@@ -61,7 +61,7 @@ mod_report_server <- function(id, r, rev_data, db_path, table_names){
)
}
- report_modal <- function(user_name = r$user_name()){
+ report_modal <- function(user_name = r$user_name){
modalDialog(
size = "xl",
bslib::card(
@@ -121,7 +121,10 @@ mod_report_server <- function(id, r, rev_data, db_path, table_names){
output[["user_name"]] <- renderText({
- paste0("Include activity from:\n ", tags$b(r$user_name()))
+ paste0(
+ "Include activity from:\n ",
+ tags$b(paste0(r$user_name, " (", r$user_role, ")"))
+ )
})
observeEvent(input$create_report, {
req(forms_missing_review())
@@ -165,13 +168,15 @@ mod_report_server <- function(id, r, rev_data, db_path, table_names){
req(review_data())
req(input$report_type)
select_report_data(review_data(), "review_data", input$report_type,
- r$user_name(), input$include_from_date)
+ paste0(r$user_name, " (", r$user_role, ")"),
+ input$include_from_date)
})
selected_query_data <- reactive({
req(query_data())
select_report_data(query_data(), "query_data", input$report_type,
- r$user_name(), input$include_from_date)
+ paste0(r$user_name, " (", r$user_role, ")"),
+ input$include_from_date)
})
@@ -194,7 +199,7 @@ mod_report_server <- function(id, r, rev_data, db_path, table_names){
filename = "report.pdf",
content = function(file){ create_report(
file,
- reviewer = r$user_name(),
+ reviewer = r$user_name,
study_sites = unique(bind_rows_custom(r$filtered_data)$site_code),
review_df = selected_review_data(),
query_df = selected_query_data()
diff --git a/R/mod_report_fct_helpers.R b/R/mod_report_fct_helpers.R
index a1c0d84b..85bc7823 100644
--- a/R/mod_report_fct_helpers.R
+++ b/R/mod_report_fct_helpers.R
@@ -58,6 +58,7 @@ select_report_data <- function(
dplyr::select(
query_id,
"ID" = subject_id,
+ "Type" = type,
"Form" = item_group,
"Item" = item,
"Event" = event_label,
@@ -99,6 +100,9 @@ create_report <- function(
tempReport, overwrite = TRUE
)
+ # Remove line breaks since they cause issues with simple kable() PDF tables:
+ query_df$Query <- gsub("\n", " ", query_df$Query)
+
# Set up parameters to pass to Rmd document
params <- list(
author = reviewer,
@@ -110,7 +114,7 @@ create_report <- function(
# Knit the document, passing in the `params` list, and eval it in a
# child of the global environment (this isolates the code in the document
# from the code in this app).
- rmarkdown::render(tempReport, output_file = fileinput,
+ rmarkdown::render(tempReport, output_file = basename(fileinput),
params = params,
envir = new.env(parent = globalenv())
)
diff --git a/R/mod_review_config.R b/R/mod_review_config.R
index ed64d9f4..aad734e4 100644
--- a/R/mod_review_config.R
+++ b/R/mod_review_config.R
@@ -52,7 +52,7 @@ mod_review_config_server <- function(
app_tables,
sites,
subject_ids
- ){
+){
moduleServer( id, function(input, output, session){
stopifnot(is.reactivevalues(r))
stopifnot(is.data.frame(sites))
@@ -62,7 +62,7 @@ mod_review_config_server <- function(
if(!all(sites$site_code %in% sites_in_appdata)){
warning("Not all sites are found in the appdata.
This might produce unexpected results")
- }
+ }
# These values need to be stored so that the modal will remember the
# settings when opened again:
@@ -73,7 +73,7 @@ mod_review_config_server <- function(
)
review_modal <- function(){
modalDialog(
- title = "Select regions and sites to review",
+ title = "Review configuration",
fade = FALSE,
footer = bslib::layout_columns(
col_widths = c(6,6),
@@ -86,7 +86,7 @@ mod_review_config_server <- function(
),
shiny::checkboxGroupInput(
ns("region_selection"),
- label = "Regions and sites",
+ label = "Select regions and sites to review",
choices = unique(sites$region),
selected = modvars$region_selection,
inline = TRUE
@@ -105,15 +105,26 @@ mod_review_config_server <- function(
),
multiple = TRUE
),
- shiny::verbatimTextOutput(ns("review_config_feedback")),
+ htmltools::HTML("
"),
+ textOutput(ns("user_name")),
+ selectizeInput(
+ ns("active_role"),
+ label = "Active role:",
+ choices = r$user_roles,
+ selected = r$user_role
+ ),
+ verbatimTextOutput(ns("review_config_feedback")),
easyClose = TRUE
)
}
+ output[["user_name"]] <- shiny::renderText({
+ paste0("Reviewer: ", r$user_name)
+ })
+
observeEvent(input$config_review, showModal(review_modal()))
observeEvent(input$region_selection, {
- req(input$region_selection, input$site_selection)
selected_sites <- with(sites, site_code[region %in% input$region_selection])
golem::cat_dev("update region selection to ", selected_sites, "\n")
shinyWidgets::updatePickerInput(
@@ -122,6 +133,11 @@ mod_review_config_server <- function(
choices = selected_sites,
selected = selected_sites
)
+ }, ignoreNULL = FALSE, ignoreInit = TRUE)
+
+ output$review_config_feedback <- renderText({
+ req(!isTruthy(input$region_selection) | !isTruthy(input$site_selection))
+ "You must select at least one site/region to review."
})
observeEvent(input$save_review_config, {
@@ -134,14 +150,15 @@ mod_review_config_server <- function(
aborted. To resolve this, verify sites provided to the module
with sites in the appdata ")
)
-
+
modvars$site_selection <- input$site_selection
+ modvars$region_selection <- input$region_selection
golem::cat_dev("Selected sites:", modvars$site_selection, "\n")
-
r <- filter_data(r, sites = input$site_selection, subject_ids = subject_ids,
appdata = app_data, apptables = app_tables)
-
+ r$user_role <- input$active_role
+
shiny::showModal(
modalDialog(
footer = modalButton("Close"),
@@ -155,8 +172,3 @@ mod_review_config_server <- function(
})
}
-## To be copied in the UI
-# mod_review_config_ui("review_config_1")
-
-## To be copied in the server
-# mod_review_config_server("review_config_1", r)
diff --git a/R/mod_review_config_fct_helpers.R b/R/mod_review_config_fct_helpers.R
index 4c25f858..eb92dd28 100644
--- a/R/mod_review_config_fct_helpers.R
+++ b/R/mod_review_config_fct_helpers.R
@@ -1,7 +1,7 @@
#' Filter app data
#'
-#' @param data A `Reactivevalues` object. filtered data will be written into this
-#' object.
+#' @param data A `Reactivevalues` object. filtered data will be written into
+#' this object.
#' @param sites Character vector with sites to filter on.
#' @param subject_ids Character vector with all subject IDs. Used to keep the
#' correct order of subject IDs.
@@ -11,7 +11,6 @@
#' List contains data frames named per form.
#'
#' @return A `reactivevalues` object.
-#' @export
#'
filter_data <- function(
data,
diff --git a/R/mod_review_data_fct_helpers.R b/R/mod_review_data_fct_helpers.R
index 288ee3a6..72ddc565 100644
--- a/R/mod_review_data_fct_helpers.R
+++ b/R/mod_review_data_fct_helpers.R
@@ -49,6 +49,8 @@ get_review_data <- function(
#' @param common_vars A character vector containing the common key variables.
#' @param edit_time_var A character vector with the column name of the edit-time
#' variable.
+#' @param update_time Time stamp given to rows with new rows that are added.
+#' Defaults to [time_stamp()].
#'
#' @return A data frame containing only the rows with updated review data.
#' @export
@@ -58,15 +60,14 @@ update_review_data <- function(
latest_review_data,
common_vars = c("subject_id", "event_name", "item_group",
"form_repeat", "item_name"),
- edit_time_var = "edit_date_time"
+ edit_time_var = "edit_date_time",
+ update_time = time_stamp()
){
stopifnot(is.data.frame(latest_review_data), nrow(latest_review_data) > 0 )
stopifnot(is.data.frame(review_df), nrow(review_df) > 0 )
stopifnot(is.character(common_vars))
stopifnot(is.character(edit_time_var))
- ts <- time_stamp()
-
deleted_data <- dplyr::anti_join(review_df, latest_review_data, by = common_vars)
n_deleted <- nrow(deleted_data)
if(n_deleted != 0){
@@ -95,7 +96,7 @@ update_review_data <- function(
add_missing_columns(c("timestamp", "reviewed", "comment", "status"))
df <- df |>
- tidyr::replace_na(list(timestamp = ts, reviewed = "No", comment = "")) |>
+ tidyr::replace_na(list(timestamp = update_time, reviewed = "No", comment = "")) |>
# now add status labels to the new rows:
dplyr::mutate(
status = ifelse(
@@ -109,7 +110,7 @@ update_review_data <- function(
.by = dplyr::all_of(c(common_vars))
)
updated_data <- dplyr::anti_join(df, review_df,
- by = c(common_vars, "edit_date_time"))
+ by = c(common_vars, edit_time_var))
if(nrow(updated_data) == 0){
warning("No new data in the updated dataset. Returning empty data frame.")
diff --git a/R/mod_review_forms.R b/R/mod_review_forms.R
index e0c2830d..cca0d237 100644
--- a/R/mod_review_forms.R
+++ b/R/mod_review_forms.R
@@ -70,8 +70,8 @@ mod_review_forms_ui <- function(id){
#' updated since the last review session. In addition, if a page contains new
#' data, the user can mark all data in the form as being reviewed and can
#' (optionally) add a comment to this review action. The data will be saved in
-#' a database. All review activity is stored with an audit-trail, with date/time
-#' stamps and with the reviewer's name.
+#' a database. All review activity is stored with an audit-trail, with
+#' date/time stamps and with the reviewer's name.
#'
#' @param id Character string, used to connect the module UI with the module
#' Server.
@@ -83,6 +83,9 @@ mod_review_forms_ui <- function(id){
#' @param active_tab Reactive value containing the active tab. Needed to hide
#' the review controls if non-relevant tabs are selected (tabs that do not
#' contain common forms or study forms).
+#' @param review_required_data a data frame with information about whether
+#' review is mandatory for each form. Should contain the columns `item_group`
+#' and `review_required`.
#' @param db_path Character string with the file path to the database.
#'
#' @seealso [mod_review_forms_ui()]
@@ -92,11 +95,17 @@ mod_review_forms_server <- function(
r,
active_form,
active_tab,
+ review_required_data,
db_path
){
stopifnot(is.reactivevalues(r))
stopifnot(is.reactive(active_form))
stopifnot(is.reactive(active_tab))
+ stopifnot(is.data.frame(review_required_data))
+ if(!all(c("item_group", "review_required") %in% names(review_required_data))){
+ stop("Either the 'study_forms or 'review_required' column is missing ",
+ "from the review_required data frame")
+ }
moduleServer( id, function(input, output, session){
ns <- session$ns
@@ -135,13 +144,13 @@ mod_review_forms_server <- function(
updateCheckboxInput(
inputId = "form_reviewed",
- value = (review_status == "Yes")
+ value = identical(review_status, "Yes")
)
shinyWidgets::updatePrettySwitch(
session = session,
inputId = "add_comment",
- value = (review_comment != "")
+ value = !identical(review_comment, "")
)
updateTextAreaInput(
inputId = "review_comment",
@@ -149,22 +158,55 @@ mod_review_forms_server <- function(
)
})
+ user_allowed_to_review <- reactive({
+ isFALSE(is.null(r$user_name) || r$user_name == "")
+ })
+
+ role_allowed_to_review <- reactive({
+ get_roles_from_config()[r$user_role] %in% get_golem_config("allow_to_review")
+ })
+
+ review_required <- reactive({
+ req(active_form(), review_required_data)
+ with(
+ review_required_data,
+ review_required[item_group == active_form()]
+ ) %||% TRUE
+ })
+
+ enable_any_review <- reactive({
+ all(c(
+ review_required(),
+ user_allowed_to_review(),
+ role_allowed_to_review(),
+ nrow(review_data_active()) != 0
+ ))
+ })
+
enable_save_review <- reactive({
- req(review_data_active())
- req(!is.null(input$form_reviewed))
- if(nrow(review_data_active()) == 0) return(FALSE)
+ req(
+ review_data_active(),
+ is.logical(input$form_reviewed),
+ is.logical(enable_any_review())
+ )
+ if(!enable_any_review()) return(FALSE)
any(c(
unique(review_data_active()$reviewed) == "No" & input$form_reviewed,
- unique(review_data_active()$reviewed) == "Yes" & !input$form_reviewed,
- input$review_comment != unique(review_data_active()$comment)
+ unique(review_data_active()$reviewed) == "Yes" & !input$form_reviewed
))
})
- observeEvent(enable_save_review(), {
+ observeEvent(c(enable_any_review(), enable_save_review()), {
+ req(is.logical(enable_any_review()), is.logical(enable_save_review()))
+ shinyjs::toggleState("form_reviewed", enable_any_review())
if(enable_save_review()){
shinyjs::enable("save_review")
- } else {
- shinyjs::disable(id = "save_review")
+ shinyjs::enable("add_comment")
+ shinyjs::enable("review_comment")
+ } else{
+ shinyjs::disable("save_review")
+ shinyjs::disable("add_comment")
+ shinyjs::disable("review_comment")
}
})
@@ -185,12 +227,8 @@ mod_review_forms_server <- function(
review_save_error <- reactiveVal(FALSE)
observeEvent(input$save_review, {
req(is.logical(input$form_reviewed), review_data_active())
- req(nrow(review_data_active()) != 0)
+ req(enable_save_review())
review_save_error(FALSE)
-
- if(is.null(r$user_name()) || r$user_name() == "" ) return({
- showNotification("No user name found. Cannot save review", duration = 1, type = "error")
- })
golem::cat_dev("Save review status reviewed:", input$form_reviewed, "\n")
review_row <- review_data_active() |>
@@ -198,7 +236,7 @@ mod_review_forms_server <- function(
dplyr::mutate(
reviewed = if(input$form_reviewed) "Yes" else "No",
comment = ifelse(is.null(input$review_comment), "", input$review_comment),
- reviewer = r$user_name(),
+ reviewer = paste0(r$user_name, " (", r$user_role, ")"),
timestamp = time_stamp(),
status = if(input$form_reviewed) "old" else "new"
)
@@ -215,7 +253,7 @@ mod_review_forms_server <- function(
tables = "all_review_data"
)
- review_row_db <- db_get_latest_review(
+ review_row_db <- db_get_review(
db_path, subject = review_row$subject_id, form = review_row$item_group
)
review_row_db <- unique(review_row_db[names(review_row)])
@@ -254,10 +292,22 @@ mod_review_forms_server <- function(
output[["review_header"]] <- renderText({active_form()})
output[["save_review_error"]] <- renderPrint({
+ validate(need(
+ role_allowed_to_review(),
+ paste0("Review not allowed for a '", r$user_role, "'.")
+ ))
+ validate(need(
+ review_required(),
+ "Review not required"
+ ))
validate(need(
nrow(review_data_active()) != 0,
"Nothing to review"
))
+ validate(need(
+ user_allowed_to_review(),
+ "No user name found. Cannot save review"
+ ))
validate(need(
!review_data_active()$reviewed == "Yes",
"Form already reviewed"
diff --git a/R/mod_study_forms.R b/R/mod_study_forms.R
index 26720c38..bbf45905 100644
--- a/R/mod_study_forms.R
+++ b/R/mod_study_forms.R
@@ -9,45 +9,51 @@ mod_study_forms_ui <- function(id, form, form_items){
bslib::nav_panel(
title = form,
bslib::card(
- full_screen = T,
- bslib::layout_columns(
- col_widths = c(2, -4, 2, -4, 12, 12),
- shinyWidgets::radioGroupButtons(
- inputId = ns("switch_view"),
- choiceNames = list(icon("line-chart"), icon("table-list")),
- choiceValues = list("graph", "table"),
- selected = "graph"
- ),
+ full_screen = T,
+ bslib::layout_sidebar(
conditionalPanel(
condition = "input.switch_view === 'graph'",
ns = NS(id),
- shinyWidgets::pickerInput(
- inputId = ns("filter"),
- label = NULL,
- choices = form_items,
- selected = form_items,
- options = shinyWidgets::pickerOptions(
- actionsBox = TRUE,
- size = 10,
- selectedTextFormat = "count > 3",
- style = "btn-outline-primary"
- ),
- multiple = TRUE
+ shinycssloaders::withSpinner(
+ plotly::plotlyOutput(ns("figure"), height = "100%"),
+ type = 5
)
),
conditionalPanel(
- condition = "input.switch_view === 'graph'",
+ condition = "input.switch_view === 'table'",
ns = NS(id),
- bslib::layout_columns(
- col_widths = c(8,4),
- shinycssloaders::withSpinner(
- plotly::plotlyOutput(ns("figure"), height = "100%"),
- type = 5
- ),
- img(src="www/figure_legend.png", width = 200, height = 233)
- )
+ DT::dataTableOutput(ns("table"), width = "auto")
),
- bslib::card_body(
+ sidebar = bslib::sidebar(
+ position = "right",
+ bg = "white",
+ shinyWidgets::radioGroupButtons(
+ inputId = ns("switch_view"),
+ choiceNames = list(icon("line-chart"), icon("table-list")),
+ choiceValues = list("graph", "table"),
+ selected = "graph"
+ ),
+ conditionalPanel(
+ condition = "input.switch_view === 'graph'",
+ ns = NS(id),
+ shinyWidgets::pickerInput(
+ inputId = ns("filter"),
+ label = NULL,
+ choices = form_items,
+ selected = form_items,
+ options = shinyWidgets::pickerOptions(
+ actionsBox = TRUE,
+ size = 10,
+ selectedTextFormat = "count > 3",
+ style = "btn-outline-primary"
+ ),
+ multiple = TRUE
+ ),
+ bslib::popover(
+ tags$a("Legend", tags$sup(icon("circle-info")), class = "link"),
+ bslib::card_body(img(src="www/figure_legend.png"))
+ )
+ ),
conditionalPanel(
condition = "input.switch_view === 'table'",
ns = NS(id),
@@ -56,8 +62,7 @@ mod_study_forms_ui <- function(id, form, form_items){
label = "Show all participants",
status = "primary",
right = TRUE
- ),
- DT::dataTableOutput(ns("table"), width = "auto")
+ )
)
)
)
@@ -104,6 +109,9 @@ mod_study_forms_ui <- function(id, form, form_items){
#' interactive tables.
#' @param id_item Character vector containing the column names of the columns
#' that can uniquely identify one item/row.
+#' @param item_info A data frame containing the names of the study forms (in the
+#' column `item_group`), and the columns `item_scale` `use_unscaled_limits`,
+#' which are used to customize the way the figures are shown in the page.
#'
#' @seealso [mod_study_forms_ui()]
#'
@@ -114,12 +122,15 @@ mod_study_forms_server <- function(
form_items,
id_item = c("subject_id", "event_name", "item_group",
"form_repeat", "item_name"),
- table_names = NULL
+ table_names = NULL,
+ item_info
){
stopifnot(is.reactivevalues(r))
stopifnot(is.character(form), length(form) == 1)
stopifnot(is.character(form_items))
stopifnot(is.character(id_item))
+ stopifnot(is.data.frame(item_info))
+
names(form_items) <- names(form_items) %||% form_items
moduleServer(id, function(input, output, session){
ns <- session$ns
@@ -141,7 +152,7 @@ mod_study_forms_server <- function(
paste0("Warning: no data found in the database for the form '", form, "'.")
))
df <- r$filtered_data[[form]]
- if(is.null(df)) return(NULL)
+
status_df <- r$review_data |>
dplyr::filter(item_group == form) |>
dplyr::select(dplyr::all_of(c(id_item, "edit_date_time", "status", "reviewed"))) |>
@@ -176,10 +187,16 @@ mod_study_forms_server <- function(
dplyr::select(-dplyr::all_of("subject_id"))
})
+ scaling_data <- reactive({
+ cols <- c("item_scale", "use_unscaled_limits")
+ # Ensure no errors even if cols are missing, with FALSE as default:
+ lapply(add_missing_columns(item_info, cols)[1, cols], isTRUE)
+ })
+
############################### Outputs: ###################################
dynamic_figure <- reactive({
- req(nrow(fig_data()) > 0)
- scale_yval <- as.logical(with(metadata$groups, item_scale[item_group == form]))
+ req(nrow(fig_data()) > 0, scaling_data())
+ scale_yval <- scaling_data()$item_scale
yval <- ifelse(scale_yval, "value_scaled", "item_value")
validate(need(
fig_data()[[yval]],
@@ -194,11 +211,9 @@ mod_study_forms_server <- function(
id = "subject_id",
id_to_highlight = r$subject_id,
point_size = "reviewed",
- height = ceiling(0.5*length(unique(fig_data()$item_name))*125+150),
- scale = as.logical(with(metadata$groups, item_scale[item_group == form])),
- use_unscaled_limits = as.logical(
- with(metadata$groups, use_unscaled_limits[item_group == form])
- )
+ height = ceiling(0.5*length(unique(fig_data()$item_name))*125+175),
+ scale = scale_yval,
+ use_unscaled_limits = scaling_data()$use_unscaled_limits
)
})
@@ -211,7 +226,7 @@ mod_study_forms_server <- function(
datatable_custom(table_data_active(), table_names, escape = FALSE)
})
- if(form == "Vital signs"){
+ if(form %in% c("Vital signs", "Vitals adjusted")){
shiny::exportTestValues(
table_data = table_data_active(),
fig_data = fig_data()
diff --git a/R/run_app.R b/R/run_app.R
index 30206164..3cadbe2d 100644
--- a/R/run_app.R
+++ b/R/run_app.R
@@ -1,18 +1,15 @@
#' Run the Shiny Application
-#'
-#' @param meta A data frame containing metadata.
-#' @param data Either a data frame or a character string with the path to the
-#' app data in .rds format.
-#' @param user_db Character string. Path to the app database. If not existing,
-#' will be created based on app data and metadata, with all data labeled as
-#' 'new'/not yet reviewed.
-#' @param credentials_db Character string. Path to the credentials database.
+#'
+#' @param data_folder Character string. The folder in which all data resides is
+#' usually set in the config.yml file. However, this can be overwritten if a
+#' path is set in this argument. Useful for testing purposes.
#' @param credentials_pwd Character string with the credentials' database
#' password.
-#' @param test_mode Logical, whether to run the application in test mode.
#' @param ... arguments to pass to golem_opts. See `?golem::get_golem_options`
#' for more details.
#' @inheritParams shiny::shinyApp
+#'
+#'
#'
#' @export
#'
@@ -21,45 +18,86 @@ run_app <- function(
options = list(),
enableBookmarking = NULL,
uiPattern = "/",
- meta = metadata,
- data = clinsightful_data,
- user_db = "user_db.sqlite",
- credentials_db = "credentials_db.sqlite",
+ data_folder = NULL,
credentials_pwd = Sys.getenv("DB_SECRET"),
- test_mode = FALSE,
...
) {
+
+ data <- get_golem_config("study_data")
+ meta <- get_golem_config("meta_data")
+ user_db <- get_golem_config("user_db")
+ use_shinymanager <- isTRUE(get_golem_config("user_identification") == "shinymanager")
+ credentials_db <- get_golem_config("credentials_db")
+
+ if(!is.null(data_folder)){
+ if(!dir.exists(data_folder)) dir.create(data_folder)
+ if(!dir.exists(data_folder)){
+ stop("Folder path '", data_folder, "' specified but cannot be created\n")
+ }
+ if(is.character(data)) data <- file.path(data_folder, data)
+ if(is.character(meta)) meta <- file.path(data_folder, meta)
+ user_db <- file.path(data_folder, user_db)
+ credentials_db <- file.path(data_folder, credentials_db)
+ }
+
+ ## Verify study data
if(is.character(data)){
- stopifnot("Data file does not exist." = file.exists(data))
- stopifnot(
- "Invalid data format. Expecting a file .rds format" = grepl("rds$", tolower(basename(data)))
- )
- } else{
- stopifnot("Invalid data format. Expecting a data frame." = is.data.frame(data) )
+ if(!file.exists(data)) stop(paste0("Cannot find '", data, "'."))
+ if(tolower(tools::file_ext(data)) != "rds"){
+ stop("Invalid data format. Expecting a file .rds format")
+ }
+ data <- readRDS(data)
+ }
+ stopifnot("Expecting study data to be in data frame format." = is.data.frame(data))
+
+ ## Verify metadata
+ if(is.character(meta)){
+ if(!file.exists(meta)) stop(paste0("Cannot find metadata ('", meta, "')."))
+ if(tolower(tools::file_ext(meta)) != "rds") {
+ stop("Only metadata files of type '.rds' are allowed.")
+ }
+ meta <- readRDS(meta)
}
- stopifnot("User database directory does not exist" = dir.exists(dirname(user_db)))
- stopifnot("metadata should be provided in list format" = inherits(meta, "list"))
+ stopifnot("Expecting metadata to be in a list format" = inherits(meta, "list"))
- shinymanager::set_labels(
- language = "en",
- "Please authenticate" = "Login to continue"
- )
- options("shinymanager.pwd_validity" = 90)
- options("shinymanager.pwd_failure_limit" = 5)
+ ## Verify user database
+ stopifnot("user_db should be a character vector with a file path" =
+ is.character(user_db))
+ if(!file.exists(user_db)){
+ warning("No user database found. New database will be created")
+ db_create(get_review_data(data), db_path = user_db)
+ } else{
+ # Skip if not needed for faster testing:
+ if(isTRUE(get_golem_config("app_prod"))){
+ db_update(get_review_data(data), db_path = user_db)
+ }
+ }
- if(!test_mode){
- stopifnot("Credentials database directory does not exist" = dir.exists(dirname(credentials_db)))
+ ## Verify credentials database, if applicable
+ if(use_shinymanager){
+ rlang::check_installed(
+ "shinymanager",
+ reason = "to use it for authentication management in ClinSight."
+ )
+ stopifnot("credentials_db should be a character vector with a file path" =
+ is.character(credentials_db))
stopifnot("No valid credentials database pwd provided" = is.character(credentials_pwd))
- if(nchar(credentials_pwd) == 0 ) stop("credentials_pwd cannot be blank it test_mode is FALSE")
+ if(nchar(credentials_pwd) == 0 ) stop("credentials_pwd cannot be blank when using shinymanager")
initialize_credentials(
credentials_db = credentials_db,
credentials_pwd = credentials_pwd
)
+ shinymanager::set_labels(
+ language = "en",
+ "Please authenticate" = "Login to continue"
+ )
+ options("shinymanager.pwd_validity" = 90)
+ options("shinymanager.pwd_failure_limit" = 5)
}
with_golem_options(
app = shinyApp(
- ui = authenticate_ui(test_mode = test_mode),
+ ui = if(use_shinymanager) authenticate_ui() else app_ui,
server = app_server,
onStart = onStart,
options = options,
@@ -70,9 +108,8 @@ run_app <- function(
meta = meta,
data = data,
user_db = user_db,
- credentials_db = credentials_db,
+ credentials_db = credentials_db,
credentials_pwd = credentials_pwd,
- test_mode = test_mode,
...
)
)
diff --git a/R/sysdata.rda b/R/sysdata.rda
index ce992061..0e2f6218 100644
Binary files a/R/sysdata.rda and b/R/sysdata.rda differ
diff --git a/README.md b/README.md
index 6406e225..152e97f9 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-# ClinSight
+# ClinSight
[![R-CMD-check](https://github.com/openpharma/clinsight/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/openpharma/clinsight/actions/workflows/R-CMD-check.yaml)
diff --git a/app.R b/app.R
new file mode 100644
index 00000000..b4c4f029
--- /dev/null
+++ b/app.R
@@ -0,0 +1,19 @@
+# Launch the ShinyApp (Do not remove this comment)
+
+# This file and the manifest.json are needed for Posit Connect deployments.
+# To deploy, run: rsconnect::deployApp()
+# Or use the blue button on top of this file
+
+pkgload::load_all(export_all = FALSE,helpers = FALSE,attach_testthat = FALSE)
+options( "golem.app.prod" = TRUE)
+# update manifest file
+# if absolute path is needed for renv profile
+# Sys.setenv(RENV_PROFILE = "full")
+# renv::paths$lockfile() # test
+# assignInNamespace(
+# "renvLockFile",
+# \(...) renv::paths$lockfile(),
+# "rsconnect"
+# )
+# rsconnect::writeManifest() # run if needed
+clinsight::run_app() # add parameters here (if any)
diff --git a/data-raw/create_random_data.R b/data-raw/create_random_data.R
index 675d0e54..18d3a047 100644
--- a/data-raw/create_random_data.R
+++ b/data-raw/create_random_data.R
@@ -3,7 +3,7 @@ library(dplyr)
#library(clinsight)
set.seed(2023)
-raw_data <- get_raw_data(data_path, column_specs = metadata$column_specs)
+raw_data <- get_raw_csv_data(data_path)
length(unique(raw_data$subject_id))
@@ -21,7 +21,7 @@ randomized_raw_data <- raw_data |>
subject_id = new_id,
dplyr::everything(), -subject_id, -site_code
)
-merged_data <- merge_meta_with_data(randomized_raw_data)
+merged_data <- merge_meta_with_data(randomized_raw_data, metadata)
####################### Randomize continuous data #######################
random_continuous <- merged_data |>
diff --git a/data-raw/internal_data.R b/data-raw/internal_data.R
index f1682024..a388f16d 100644
--- a/data-raw/internal_data.R
+++ b/data-raw/internal_data.R
@@ -12,7 +12,8 @@ names(col_palette) <- c("within limits",
# Empty data frame used to reset query data frame if needed.
query_data_skeleton <- dplyr::tibble(
"query_id" = character(),
- "subject_id" = character(),
+ "type" = character(),
+ "subject_id" = character(),
"event_label" = character(),
"item_group" = character(),
"item" = character(),
@@ -25,23 +26,55 @@ query_data_skeleton <- dplyr::tibble(
"edit_reason" = character()
)
-# columns names that are required for the application to function.
-# Used to test whether these are all available in the column_specs when reading
-# in data with get_raw_data().
-required_col_names <- c(
- "site_code",
- "subject_id",
- "event_id",
- "event_date",
- "event_name",
- "event_repeat",
- "form_id",
- "form_repeat",
+# columns specifications required for the application to function properly.
+# Used to convert columns to the right format, and to test whether all the required
+# columns are available when merging raw data with metadata.
+clinsight_col_specs <- c(
+ "site_code" = "c",
+ "subject_id" = "c",
+ "event_id" = "c",
+ "event_date" = "D",
+ "event_name" = "c",
+ "event_repeat" = "i",
+ "form_id" = "c",
+ "form_repeat" = "i",
+ "var" = "c",
+ "item_value" = "c",
+ "edit_date_time" = "T",
+ ".default" = "c"
+ ) |>
+ readr::as.col_spec()
+
+# Required columns needed in study data for the application to function.
+required_col_names <- names(clinsight_col_specs$cols)
+
+required_meta_cols <- c(
"var",
- "item_value",
- "edit_date_time"
+ "suffix",
+ "item_name",
+ "item_group",
+ "unit",
+ "lower_limit",
+ "upper_limit",
+ "item_type"
)
+# Used in get_form_level_data(). Set a default if ClinSight needs the columns
+# to function properly.
+# Choosing NA for vars like item_scale, because setting these variables by
+# default for forms like 'Adverse events' does not make so much sense.
+form_level_defaults <- data.frame(
+ "item_scale" = as.logical(NA),
+ "use_unscaled_limits" = as.logical(NA),
+ "review_required" = TRUE
+)
+
+# Converting column types, and do not guess default:
+form_level_default_specs <- c(form_level_defaults, ".default" = "c") |>
+ sapply(class) |>
+ readr::as.col_spec()
-usethis::use_data(col_palette, query_data_skeleton, required_col_names,
+usethis::use_data(col_palette, query_data_skeleton, required_col_names,
+ required_meta_cols, clinsight_col_specs,
+ form_level_defaults, form_level_default_specs,
overwrite = TRUE, internal = TRUE)
diff --git a/data-raw/metadata.R b/data-raw/metadata.R
index df171a99..e19f3ec3 100644
--- a/data-raw/metadata.R
+++ b/data-raw/metadata.R
@@ -1,6 +1,6 @@
## code to prepare metadata. Raw data is expected to be in Excel format.
-library(here)
+devtools::load_all(".")
-metadata <- get_metadata(filepath = here::here("data-raw/metadata.xlsx"))
+metadata <- get_metadata(filepath = app_sys("data-raw/metadata.xlsx"))
-usethis::use_data(metadata, overwrite = TRUE)
\ No newline at end of file
+usethis::use_data(metadata, overwrite = TRUE)
diff --git a/data-raw/metadata.xlsx b/data-raw/metadata.xlsx
index 7c6068a3..182428f7 100644
Binary files a/data-raw/metadata.xlsx and b/data-raw/metadata.xlsx differ
diff --git a/data-raw/query_data_skeleton.R b/data-raw/query_data_skeleton.R
deleted file mode 100644
index 30dd0719..00000000
--- a/data-raw/query_data_skeleton.R
+++ /dev/null
@@ -1,16 +0,0 @@
-
-query_data_skeleton <- data.frame(
- "subject_id" = character(),
- "event_label" = character(),
- "item_group" = character(),
- "item" = character(),
- "timestamp" = character(),
- "query_id" = character(),
- "n" = numeric(),
- "reviewer" = character(),
- "query" = character(),
- "resolved" = character(),
- "resolved_date" = character(),
- "edit_reason" = character()
-)
-
diff --git a/data/clinsightful_data.rda b/data/clinsightful_data.rda
index 1dd6ec55..7088138a 100644
Binary files a/data/clinsightful_data.rda and b/data/clinsightful_data.rda differ
diff --git a/data/metadata.rda b/data/metadata.rda
index 27f838dc..c26affad 100644
Binary files a/data/metadata.rda and b/data/metadata.rda differ
diff --git a/dev/02_dev.R b/dev/02_dev.R
index c44dfc1f..3ce58d31 100644
--- a/dev/02_dev.R
+++ b/dev/02_dev.R
@@ -11,6 +11,81 @@
#### CURRENT FILE: DEV SCRIPT #####
###################################
+# Exploring for insights on data spec
+unique(clinsightful_data[,c("site_code","region")]) |> arrange(site_code)
+unique(clinsightful_data[,c("event_id","event_name")])
+unique(clinsightful_data[,c("form_id","form_repeat")])
+unique(clinsightful_data[,c("event_repeat","event_id","event_name")])
+unique(clinsightful_data[,c("event_repeat","event_id","event_name","form_id","form_repeat")])
+unique(clinsightful_data[,c("event_repeat","event_id","event_name", "day")])
+unique(clinsightful_data[,c("event_repeat","event_id","event_name", "event_label")])
+
+# form exploration
+unique(clinsightful_data[,c("form_id")])
+unique(clinsightful_data[,c("form_id","item_group", "item_type")])
+
+# other
+unique(clinsightful_data[,c("item_group","item_type")])
+other <- clinsightful_data |>
+ filter(item_type == "other")
+unique(other[,c("item_group","item_type","item_name")]) |>
+ print(n=40)
+
+# bds
+unique(clinsightful_data[,c("item_group","item_type")])
+bds <- clinsightful_data |>
+ filter(item_type != "other")
+unique(bds[,c("item_group","item_type","item_name")]) |>
+ print(n=40)
+
+
+unique(clinsightful_data[,c("item_group","item_type")])
+other <- clinsightful_data |>
+ filter(item_group == "Vital signs")
+unique(other[,c("item_group","item_type","item_name")]) |>
+ print(n=40)
+
+# dirty?
+library(clinsight)
+data("clinsightful_data")
+dirty <- clinsightful_data |>
+ filter(item_value %in% c("µg/h","µg/ml"))
+
+str(clinsightful_data$item_value)
+
+# day
+class(clinsightful_data$day)
+
+# exploring events
+data("clinsightful_data")
+d_1pat <- clinsightful_data |>
+ filter(subject_id == "BEL_04_772") |>
+ filter(event_id == "COMMON_CM")
+
+# exploring event_repeat & event_date
+library(dplyr)
+clinsightful_data |>
+ filter(subject_id == "BEL_04_772") |>
+ group_by(subject_id, event_id, event_repeat, event_date) |>
+ summarize(n = n()) |>
+ # filter(event_repeat != form_repeat) |>
+ print(n = 36)
+
+d_1pat <- clinsightful_data |>
+ filter(subject_id == "BEL_04_772") |>
+ filter(event_id == "COMMON_AE")
+
+clinsightful_data |>
+ filter(subject_id == "BEL_04_772") |>
+ group_by(subject_id, event_id, event_repeat, event_date, form_repeat) |>
+ summarize(n = n()) |>
+ filter(event_repeat != form_repeat) |>
+ print(n = 36)
+
+
+# metadata
+
+
# Engineering
## Dependencies ----
@@ -47,6 +122,7 @@ usethis::use_test("app")
## Vignette ----
usethis::use_vignette("testgolem")
+usethis::use_vignette(name = "data_spec", title = "Input Data Specification")
#devtools::build_vignettes()
## Code Coverage----
diff --git a/dev/03_deploy.R b/dev/03_deploy.R
index a8e7aba2..ddcf6b8a 100644
--- a/dev/03_deploy.R
+++ b/dev/03_deploy.R
@@ -25,10 +25,11 @@
## sent to CRAN, or to a package manager
#pkgbuild::build()
-# ignore certain packages, and only add them for development environment:
+# ignore certain packages in the 'minimal' renv environment:
renv::settings$ignored.packages(c("pak", "pkgdown", "stringr", "kableExtra", "usethis", "cowplot"))
-renv::activate(profile = "dev")
-renv::activate(profile = "production")
+renv::activate(profile = "full")
+# Use this to create a production-ready Docker image, with minimal number of dependencies:
+renv::activate(profile = "minimal")
## RStudio ----
## If you want to deploy on RStudio related platforms
golem::add_rstudioconnect_file()
diff --git a/dev/app.R b/dev/app.R
new file mode 100644
index 00000000..c1ebc1e5
--- /dev/null
+++ b/dev/app.R
@@ -0,0 +1,39 @@
+
+devtools::load_all()
+# pkg_name <- "clinsight"
+# library(pkg_name, character.only = TRUE)
+
+
+# datapath <- "data1pt"
+datapath <- app_sys("tests/testthat/fixtures/csvtestdata") # For interactive use
+
+metadata <- get_metadata(filepath = app_sys("data-raw/metadata.xlsx"))
+my_raw_data <- get_raw_csv_data(data_path = datapath, synch_time = "2024-01-01 00:00:00 UTC")
+ # fix_multiple_choice_vars() - metadata not found
+
+merged_data <- merge_meta_with_data(
+ data = my_raw_data,
+ meta = metadata
+ )
+# tempdir not useful for production mode
+data_folder <- "."
+data_path <- file.path(data_folder,
+ "merged_data.rds")
+saveRDS(merged_data, data_path)
+db_path <- file.path(data_folder, "user_db.sqlite")
+
+# if test_mode == FALSE, you'll need to setup...
+# DB_SECRET env var to setup credentials db
+usethis::edit_r_environ()
+Sys.getenv("DB_SECRET")
+
+# initiate the user db
+db_create(get_review_data(merged_data),
+ db_path = db_path
+ )
+
+run_app(
+ data = data_path, #merged_data, # or db_path works too
+ # user_db = db_path, # defaults to "user_db.sqlite"
+ # onStart = \(){onStop(\(){unlink(data_folder, recursive = TRUE)})} # be careful here
+)
diff --git a/dev/improve_figures.qmd b/dev/improve_figures.qmd
index fd6c63dd..f18f02b1 100644
--- a/dev/improve_figures.qmd
+++ b/dev/improve_figures.qmd
@@ -17,8 +17,7 @@ library(ggplot2)
library(plotly)
pkgname <- "clinsight"
library(pkgname, character.only = TRUE)
-merged_data <- merge_meta_with_data(clinsightful_data)
-appdata <- get_appdata(merged_data)
+appdata <- get_appdata(clinsightful_data)
vars <- get_meta_vars(data = appdata, meta = metadata)
apptables <- lapply(
setNames(names(appdata), names(appdata)), \(x){
@@ -69,19 +68,36 @@ create_legend()
```
-```{r , fig.width=2.5, fig.height=2.75}
+```{r , fig.width=2.25, fig.height=4.5}
sizes <- c("old", "new/updated")
-df <- data.frame(col = factor(names(col_palette), levels = names(col_palette)))
-df$status <- factor(sample(sizes, nrow(df), replace = TRUE), levels = sizes)
+lims <- gsub(", ", ",\n", names(col_palette))
+palette <- setNames(col_palette, lims)
+
+df <- data.frame(col = factor(lims, levels = lims))
+df$status <- factor(rep_len(sizes, length.out = nrow(df)), levels = sizes)
fig <- ggplot(df) +
- scale_fill_manual(values = col_palette) +
+ scale_fill_manual(values = palette) +
theme(legend.key = element_rect(fill = "white", colour = NA)) +
geom_point(aes(fill = col, x = 1, y = 1, size = status), shape = 21) +
labs(legend.title = "Legend") +
- theme(legend.position = "right", legend.title = element_text(face = "bold")) +
+ theme(
+ legend.position = "right",
+ legend.title = element_text(face = "bold", size = 16),
+ legend.text = element_text(size = 14),
+ legend.key = element_blank(),
+ legend.background = element_blank()
+ ) +
guides(
- size=guide_legend(title = "Status", override.aes = list(fill = "grey", size = c(2L,6L))),
- fill=guide_legend(title = "Limits", override.aes = list(size = 6L))
+ size=guide_legend(
+ title = "Status",
+ override.aes = list(fill = "grey", size = c(2L,6L)),
+ keyheight = 1.75
+ ),
+ fill=guide_legend(
+ title = "Limits",
+ override.aes = list(size = 6L),
+ keyheight = 2.75
+ )
)
suppressWarnings(cowplot::ggdraw(cowplot::get_legend(fig)))
ggsave("figure_legend.png")
diff --git a/dev/run_dev.R b/dev/run_dev.R
index 68af0ec3..bf2fecd3 100644
--- a/dev/run_dev.R
+++ b/dev/run_dev.R
@@ -9,22 +9,24 @@ golem::detach_all_attached()
# rm(list=ls(all.names = TRUE))
# Document and reload your package
-golem::document_and_reload(export_all = TRUE)
+# Using golem::pkg_path() is needed here, see:
+# https://github.com/openpharma/clinsight/issues/69#issue-2504462187
+golem::document_and_reload(pkg = golem::pkg_path(), export_all = TRUE)
# Run the application
load_and_run_app <- function(){
- # withr call here does not work since the tempfile gets deleted during app initialization.
- # different option below, using onStop() within the run_app() function to clean up.
- temp_folder <- tempdir()
- db_path <- file.path(temp_folder, "testdb.sqlite")
+ temp_folder <- tempfile(tmpdir = tempdir())
+ dir.create(temp_folder)
+ old_golem_config <- Sys.getenv("GOLEM_CONFIG_ACTIVE")
+ Sys.setenv("GOLEM_CONFIG_ACTIVE" = "dev")
run_app(
- meta = metadata,
- data = clinsightful_data,
- user_db = db_path,
- test_mode = TRUE,
- onStart = \(){onStop(\(){unlink(temp_folder, recursive = TRUE)})}
+ data_folder = temp_folder,
+ onStart = \(){onStop(\(){
+ unlink(temp_folder, recursive = TRUE);
+ Sys.setenv("GOLEM_CONFIG_ACTIVE" = old_golem_config)
+ })}
)
}
-load_and_run_app()
\ No newline at end of file
+load_and_run_app()
diff --git a/inst/_pkgdown.yml b/inst/_pkgdown.yml
index 5618ccc7..c2003205 100644
--- a/inst/_pkgdown.yml
+++ b/inst/_pkgdown.yml
@@ -1,3 +1,6 @@
+template:
+ bootstrap: 5
+ bootswatch: spacelab
reference:
- title: Main application
desc: Top-level functions to run the Shiny application
@@ -40,7 +43,7 @@ reference:
- title: Data frame functions
desc: Create data for use in the application.
- contents:
- - get_raw_data
+ - get_raw_csv_data
- merge_meta_with_data
- apply_study_specific_fixes
- get_appdata
@@ -62,8 +65,8 @@ reference:
- db_slice_rows
- update_review_data
- collect_query_data
- - db_get_latest_review
- - db_get_latest_query
+ - db_get_review
+ - db_get_query
- title: Internal dataset
desc: Create or describe internal data.
- contents:
@@ -92,7 +95,6 @@ reference:
- adjust_colnames
- bind_rows_custom
- check_appdata
- - check_available_data
- filter_data
- clean_dates
- collapse_column_vals
diff --git a/inst/app/test_results_raw.rds b/inst/app/test_results_raw.rds
deleted file mode 100644
index 94e4a6bc..00000000
Binary files a/inst/app/test_results_raw.rds and /dev/null differ
diff --git a/inst/app/www/custom.css b/inst/app/www/custom.css
index 7c01a958..5232a222 100644
--- a/inst/app/www/custom.css
+++ b/inst/app/www/custom.css
@@ -1,29 +1,25 @@
+.bslib-value-box .value-box-area {
+ padding: 0.1rem 0rem 0.1rem 1rem;
+}
+
.bslib-value-box .value-box-area > :nth-child(2) {
content: '';
- font-size: 0.9vw;
+ font-size: calc(4px + .6vw);
}
-.bslib-value-box .value-box-area {
- padding: 0.1rem 1rem 0rem 1rem;
- font-size: 0.5vw;
-}
.bslib-value-box .value-box-area > :first-child {
- font-size: 0.9vw;
+ font-size: calc(4px + .6vw);
}
.bslib-value-box .value-box-showcase {
- padding: 0.1rem 1rem
+ padding: 0.5rem 0.5rem 0.5rem 2rem;
}
-/* padding of main application
-.bslib-sidebar-layout > .main {
- padding-top: 1rem;
- padding-right: 4rem;
- padding-bottom: 1.5rem;
- padding-left: 4rem;
+.bslib-value-box .value-box-showcase .fas {
+ font-size: 2rem;
}
-*/
+
/* Remove unneeded padding around the timeline figure */
.timeline-fig-basic > .card-body {
@@ -33,11 +29,6 @@
padding-left: 0rem;
}
-.timeline-fig-basic {
- overflow-x: scroll;
- min-width: 250px;
-}
-
/* below is needed for good alignment of the top-widgets */
.bslib-card {
height:100%;
@@ -65,3 +56,8 @@
left: 0;
}
+div.datatables div.header {
+ text-align: center;
+ font-weight: bold;
+}
+
diff --git a/inst/app/www/figure_legend.png b/inst/app/www/figure_legend.png
index aea8da36..f7fd2ee4 100644
Binary files a/inst/app/www/figure_legend.png and b/inst/app/www/figure_legend.png differ
diff --git a/inst/app/www/logo.png b/inst/app/www/logo.png
new file mode 100644
index 00000000..8681b273
Binary files /dev/null and b/inst/app/www/logo.png differ
diff --git a/inst/app/www/report.Rmd b/inst/app/www/report.Rmd
index 85fc8b32..a78a33c0 100644
--- a/inst/app/www/report.Rmd
+++ b/inst/app/www/report.Rmd
@@ -47,9 +47,16 @@ invisible(
unlist(lapply(unique(df$query_id), \(x){
df <- dplyr::filter(df, query_id == x)
id_x <- unique(df$ID); form_x <- unique(df$Form); event_x <- unique(df$Event)
- df <- df |>
- dplyr::select(-ID, -query_id, -Form, -Item, -Event)
- print(knitr::kable(df, caption = paste0("Query for: ", id_x, ", Form: ", form_x, ", Event: ", event_x)))
+ item_x <- unique(df$Item); type_x <- unique(df[["Type"]]) %||% ""
+ header <- sprintf("%s query for: %s; %s (%s, %s)", df$Type, id_x, item_x, form_x, event_x)
+ if(any(df$resolved == "Yes")){
+ header <- paste0(header, "; Resolved")
+ }
+ df |>
+ dplyr::mutate(Author = paste0(Author, " ", Time)) |>
+ dplyr::select(Query, Author) |>
+ knitr::kable(caption = header) |>
+ print()
}))
)
```
diff --git a/inst/golem-config.yml b/inst/golem-config.yml
index a20c78a0..d489d7c7 100644
--- a/inst/golem-config.yml
+++ b/inst/golem-config.yml
@@ -1,8 +1,37 @@
default:
golem_name: clinsight
- golem_version: 0.0.0.9000
+ golem_version: 0.1.0
app_prod: no
-production:
- app_prod: yes
+ user_identification: test_user
+ study_data: !expr clinsight::clinsightful_data
+ meta_data: !expr clinsight::metadata
+ user_db: user_db.sqlite
+ user_roles:
+ Administrator: admin
+ Medical Monitor: medical_monitor
+ Data Manager: data_manager
+ allow_to_review: [admin, medical_monitor]
dev:
golem_wd: !expr golem::pkg_path()
+test:
+ study_data: study_data.rds
+ meta_data: metadata.rds
+shinymanager:
+ app_prod: yes
+ user_identification: shinymanager
+ study_data: study_data.rds
+ meta_data: metadata.rds
+ credentials_db: credentials_db.sqlite
+shinyproxy:
+ app_prod: yes
+ user_identification: http_headers
+ study_data: study_data/study_data.rds
+ meta_data: study_data/metadata.rds
+ user_db: study_data/user_db.sqlite
+shiny_connect:
+ app_prod: yes
+ user_identification: shiny_session
+ study_data: study_data.rds
+ meta_data: metadata.rds
+ user_db: user_db.sqlite
+ allow_to_review: [admin, medical_monitor, data_manager]
diff --git a/man/add_timevars_to_data.Rd b/man/add_timevars_to_data.Rd
new file mode 100644
index 00000000..70969645
--- /dev/null
+++ b/man/add_timevars_to_data.Rd
@@ -0,0 +1,18 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fct_data_helpers.R
+\name{add_timevars_to_data}
+\alias{add_timevars_to_data}
+\title{Add time vars to raw data}
+\usage{
+add_timevars_to_data(data)
+}
+\arguments{
+\item{data}{A data frame}
+}
+\value{
+A data frame, with derivative time and event variables, needed for
+ClinSight to function properly.
+}
+\description{
+Add time vars to raw data
+}
diff --git a/man/authenticate_server.Rd b/man/authenticate_server.Rd
index 42e11994..7ccdc569 100644
--- a/man/authenticate_server.Rd
+++ b/man/authenticate_server.Rd
@@ -5,25 +5,35 @@
\title{Authenticate server}
\usage{
authenticate_server(
- test_mode = FALSE,
- sites = app_vars$Sites$site_code,
- roles = c("Medical Monitor", "Data Manager", "Administrator", "Investigator"),
- credentials_db = app_sys("app/www/credentials_db.sqlite"),
- credentials_pwd = Sys.getenv("DB_SECRET")
+ user_identification = get_golem_config("user_identification"),
+ all_sites = NULL,
+ all_roles = get_roles_from_config(),
+ credentials_db = get_golem_config("credentials_db"),
+ credentials_pwd = Sys.getenv("DB_SECRET"),
+ session
)
}
\arguments{
-\item{test_mode}{Logical, whether to start the application in test mode.}
+\item{user_identification}{Character vector showing the user identification.
+Is by default set by the \code{user_identification} option in the \code{golem-config}
+file.}
-\item{sites}{Character vector. Study sites that can be allocated to a user.}
+\item{all_sites}{Character vector with all sites. Will be passed on to
+shinymanager configuration so that data can be restricted to specific sites
+per user.}
-\item{roles}{Character vector. Roles that can be allocated to a user.}
+\item{all_roles}{Named character vector. Used to show all roles that are
+valid to use in the application. Also used to show all applicable roles
+in \code{shinymanager} admin mode.}
-\item{credentials_db}{Character vector. Path to the credentials
-database.}
+\item{credentials_db}{Character vector. Path to the credentials database. By
+default, set by the \code{data_folder} and \code{credentials_db} options in the
+\code{golem-config_file}.}
-\item{credentials_pwd}{Character vector, containing the database
-password.}
+\item{credentials_pwd}{Character vector, containing the database password.}
+
+\item{session}{Shiny session. Needed to access user information in case of
+login methods alternative to \code{shinymanager} are used.}
}
\description{
Function to authenticate the main server.
diff --git a/man/authenticate_ui.Rd b/man/authenticate_ui.Rd
index 992db868..d6798def 100644
--- a/man/authenticate_ui.Rd
+++ b/man/authenticate_ui.Rd
@@ -4,12 +4,8 @@
\alias{authenticate_ui}
\title{Authenticate UI}
\usage{
-authenticate_ui(test_mode = FALSE)
-}
-\arguments{
-\item{test_mode}{Logical. Whether the app should be started in test mode or
-not.}
+authenticate_ui()
}
\description{
-Authentication implementation in the UI.
+Authentication implementation in the UI, using \code{shinymanager}.
}
diff --git a/man/check_available_data.Rd b/man/check_available_data.Rd
deleted file mode 100644
index d7306de7..00000000
--- a/man/check_available_data.Rd
+++ /dev/null
@@ -1,30 +0,0 @@
-% Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/fct_data_tests.R
-\name{check_available_data}
-\alias{check_available_data}
-\title{Check available data}
-\usage{
-check_available_data(
- required_data = c("appdata", "apptables", "vars", "db_path"),
- env = globalenv()
-)
-}
-\arguments{
-\item{required_data}{A character vector with objects that are required.}
-
-\item{env}{The environment to check in.}
-}
-\value{
-Nothing if the checks are passed. If not, will throw an error.
-}
-\description{
-Checks if data is loaded in memory and if not, provides an informative error
-message.
-}
-\examples{
-# check_available_data("missing_data_frame")
-# Error in check_available_data("missing_data_frame") :
-# The following data objects are required to run the app properly,
-# but are missing: missing_data_frame
-
-}
diff --git a/man/clinsight-package.Rd b/man/clinsight-package.Rd
index 5f64416a..1d0e721d 100644
--- a/man/clinsight-package.Rd
+++ b/man/clinsight-package.Rd
@@ -6,21 +6,25 @@
\alias{clinsight-package}
\title{clinsight: ClinSight}
\description{
+\if{html}{\figure{logo.png}{options: style='float: right' alt='logo' width='120'}}
+
Interactive application to monitor patient safety during clinical trials. Goal is to provide an interactive overview of a patients' data, highlighting not yet reviewed data, and to improve assessments of the patients' safety. Secondary goal is to improve data quality by identifying suspicious outliers.
}
\seealso{
Useful links:
\itemize{
- \item \url{https://github.com/LDSamson/clinsight}
- \item Report bugs at \url{https://github.com/LDSamson/clinsight/issues}
+ \item \url{https://github.com/openpharma/clinsight}
+ \item Report bugs at \url{https://github.com/openpharma/clinsight/issues}
}
}
\author{
-\strong{Maintainer}: Leonard Daniël Samson \email{lsamson@gcp-service.com}
+\strong{Maintainer}: Leonard Daniël Samson \email{lsamson@gcp-service.com} (\href{https://orcid.org/0000-0002-6252-7639}{ORCID})
Other contributors:
\itemize{
+ \item Aaron Clark \email{aclark02@arcusbio.com} (\href{https://orcid.org/0000-0002-0123-0970}{ORCID}) [contributor]
+ \item Jeff Thompson \email{jthompson@arcusbio.com} (\href{https://orcid.org/0009-0007-3640-1075}{ORCID}) [contributor]
\item GCP-Service International Ltd.& Co. KG [funder]
}
diff --git a/man/clinsightful_data.Rd b/man/clinsightful_data.Rd
index dd8d3844..a310f4b9 100644
--- a/man/clinsightful_data.Rd
+++ b/man/clinsightful_data.Rd
@@ -5,7 +5,7 @@
\alias{clinsightful_data}
\title{Clinical Trial test data}
\format{
-An object of class \code{tbl_df} (inherits from \code{tbl}, \code{data.frame}) with 6483 rows and 24 columns.
+a data.frame with 6,483 rows and 24 variables.
}
\source{
Created with \code{data-raw/create_random_data.R}
@@ -14,7 +14,9 @@ Created with \code{data-raw/create_random_data.R}
clinsightful_data
}
\description{
-A data frame containing randomly created clinical trial data. Used for
-testing purposes.
+A data.frame containing randomly created clinical trial data. Used for
+testing purposes. It will also be used to run the app with example data when
+executing \code{run_app()} with the default configuration settings, or when
+running \code{golem::run_dev()}.
}
\keyword{datasets}
diff --git a/man/datatable_custom.Rd b/man/datatable_custom.Rd
index 5b56612c..181fad89 100644
--- a/man/datatable_custom.Rd
+++ b/man/datatable_custom.Rd
@@ -9,6 +9,10 @@ datatable_custom(
rename_vars = NULL,
title = NULL,
selection = "single",
+ extensions = "Scroller",
+ plugins = "scrollResize",
+ dom = "fti",
+ options = list(),
...
)
}
@@ -22,7 +26,33 @@ rename any column names found in this vector to the provided name.}
\item{selection}{See \code{\link[DT:datatable]{DT::datatable()}}. Default set to 'single'.}
-\item{...}{Other optional arguments that will be parsed to \code{\link[DT:datatable]{DT::datatable()}}.}
+\item{extensions}{See \code{\link[DT:datatable]{DT::datatable()}}. Default set to 'Scroller'.}
+
+\item{plugins}{See \code{\link[DT:datatable]{DT::datatable()}}. Default set to 'scrollResize'.}
+
+\item{dom}{See \url{https://datatables.net/reference/option/dom}. A div
+element will be inserted before the table for the table title. Default set
+to 'fti' resulting in 'f<"header h5">ti'.}
+
+\item{options}{See \code{\link[DT:datatable]{DT::datatable()}}. Must be a list.
+\itemize{
+\item Modifiable defaults:
+\itemize{
+\item \code{scrollY = '400px'}
+\item \code{scrollX = TRUE}
+\item \code{scroller = TRUE}
+\item \code{deferREnder = TRUE}
+\item \code{scrollResize = TRUE}
+\item \code{scrollCollapse = TRUE}
+}
+\item Non-modifiable defaults:
+\itemize{
+\item \code{dom}: Defined by the \code{dom} parameter.
+\item \code{initComplete}: Defaults to a function to insert table title into dataTable container.
+}
+}}
+
+\item{...}{Other optional arguments that will be passed to \code{\link[DT:datatable]{DT::datatable()}}.}
}
\value{
A \code{DT::datatable} object.
diff --git a/man/db_create.Rd b/man/db_create.Rd
index bb99d7fd..ec16e934 100644
--- a/man/db_create.Rd
+++ b/man/db_create.Rd
@@ -7,8 +7,8 @@
db_create(data, db_path, reviewed = "No", reviewer = "", status = "new")
}
\arguments{
-\item{data}{Either a data frame with review data (Usually created with
-\code{\link[=get_review_data]{get_review_data()}}), or a character path to the raw data files.}
+\item{data}{A data frame with review data (Usually created with
+\code{\link[=get_review_data]{get_review_data()}}).}
\item{db_path}{A character vector with the path to the database to be
created.}
@@ -16,8 +16,7 @@ created.}
\item{reviewed}{Character vector. Sets the reviewed tag in the review
database.}
-\item{reviewer}{Character vector. Sets the reviewer in the review database.
-Defaults to \code{Admin}.}
+\item{reviewer}{Character vector. Sets the reviewer in the review database.}
\item{status}{Character vector. Sets the status in the review database.
Defaults to \code{new}.}
diff --git a/man/db_get_latest_query.Rd b/man/db_get_query.Rd
similarity index 65%
rename from man/db_get_latest_query.Rd
rename to man/db_get_query.Rd
index 7b0fbeb0..06824235 100644
--- a/man/db_get_latest_query.Rd
+++ b/man/db_get_query.Rd
@@ -1,13 +1,13 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/fct_SQLite.R
-\name{db_get_latest_query}
-\alias{db_get_latest_query}
-\title{Retrieve latest query}
+\name{db_get_query}
+\alias{db_get_query}
+\title{Retrieve query from database}
\usage{
-db_get_latest_query(
+db_get_query(
db_path,
- query_id = new_query$query_id,
- n = new_query$n,
+ query_id,
+ n = NULL,
db_table = "query_data",
slice_vars = "timestamp",
group_vars = c("query_id", "n")
@@ -16,11 +16,11 @@ db_get_latest_query(
\arguments{
\item{db_path}{Character vector. Needs to be a valid path to a database.}
-\item{query_id}{Character string with the query identifier to extract from
-the database.}
+\item{query_id}{Character string with the query identifier to extract from the
+database.}
-\item{n}{Numerical or character string, with the query follow-up number to
-extract}
+\item{n}{(optional) numerical or character string, with the query follow-up
+number to extract}
\item{db_table}{Character vector with the name of the table to read from.}
@@ -35,23 +35,23 @@ perform the grouping on.}
A data frame
}
\description{
-Small helper function to retrieve the latest query with the provided query_id
-and query follow-up number (n)
+Small helper function to retrieve a query from the database. if no follow-up
+number is provided, all messages will be collected.
}
\examples{
local({
-temp_path <- withr::local_tempfile(fileext = ".sqlite")
+temp_path <- withr::local_tempfile(fileext = ".sqlite")
con <- get_db_connection(temp_path)
new_query <- dplyr::tibble(
- query_id = "ID124234",
+ query_id = "ID124234",
subject_id = "ID1",
n = 1,
timestamp = "2024-02-05 01:01:01",
other_info = "testinfo"
-)
+)
DBI::dbWriteTable(con, "query_data", new_query)
-db_get_latest_query(temp_path, query_id = "ID124234", n = 1)
+db_get_query(temp_path, query_id = "ID124234", n = 1)
})
}
diff --git a/man/db_get_latest_review.Rd b/man/db_get_review.Rd
similarity index 85%
rename from man/db_get_latest_review.Rd
rename to man/db_get_review.Rd
index 87dee122..a36d15ec 100644
--- a/man/db_get_latest_review.Rd
+++ b/man/db_get_review.Rd
@@ -1,10 +1,10 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/fct_SQLite.R
-\name{db_get_latest_review}
-\alias{db_get_latest_review}
-\title{Retrieve latest review}
+\name{db_get_review}
+\alias{db_get_review}
+\title{Retrieve review}
\usage{
-db_get_latest_review(
+db_get_review(
db_path,
subject = review_row$subject_id,
form = review_row$item_group,
@@ -36,7 +36,7 @@ perform the grouping on.}
A data frame.
}
\description{
-Small helper function to retrieve the latest review data from the database
+Small helper function to retrieve the (latest) review data from the database
with the given subject id (\code{subject}) and \code{form}.
}
\examples{
@@ -55,7 +55,7 @@ local({
) |>
dplyr::as_tibble()
DBI::dbWriteTable(con, "all_review_data", review_data)
- db_get_latest_review(temp_path, subject = "Test_name", form = "Test_group")
+ db_get_review(temp_path, subject = "Test_name", form = "Test_group")
})
}
diff --git a/man/db_update.Rd b/man/db_update.Rd
index c73810bf..3236b601 100644
--- a/man/db_update.Rd
+++ b/man/db_update.Rd
@@ -8,8 +8,7 @@ db_update(
data,
db_path,
common_vars = c("subject_id", "event_name", "item_group", "form_repeat", "item_name"),
- edit_time_var = "edit_date_time",
- data_synched = FALSE
+ edit_time_var = "edit_date_time"
)
}
\arguments{
@@ -21,10 +20,6 @@ db_update(
\item{edit_time_var}{A character vector with the column name of the edit-time
variable.}
-
-\item{data_synched}{Logical. Whether the database was synched or not. If
-TRUE, the synchronization date stored in the database will be updated to
-the current day.}
}
\value{
Nothing will be returned.
diff --git a/man/fig_timeline.Rd b/man/fig_timeline.Rd
index 73cff9f1..b7a6d193 100644
--- a/man/fig_timeline.Rd
+++ b/man/fig_timeline.Rd
@@ -4,12 +4,13 @@
\alias{fig_timeline}
\title{Create timeline}
\usage{
-fig_timeline(data, meta_data = metadata)
+fig_timeline(data, events)
}
\arguments{
\item{data}{Data frame to use.}
-\item{meta_data}{Metadata file with all possible time points.}
+\item{events}{Data frame containing information about all events. Used
+to create the right labels in the timeline figure.}
}
\value{
A ggplot2 object.
diff --git a/man/figures/logo.png b/man/figures/logo.png
new file mode 100644
index 00000000..8681b273
Binary files /dev/null and b/man/figures/logo.png differ
diff --git a/man/filter_data.Rd b/man/filter_data.Rd
index b5f8a06a..16792128 100644
--- a/man/filter_data.Rd
+++ b/man/filter_data.Rd
@@ -7,8 +7,8 @@
filter_data(data, sites, subject_ids, appdata, apptables)
}
\arguments{
-\item{data}{A \code{Reactivevalues} object. filtered data will be written into this
-object.}
+\item{data}{A \code{Reactivevalues} object. filtered data will be written into
+this object.}
\item{sites}{Character vector with sites to filter on.}
diff --git a/man/fix_multiple_choice_vars.Rd b/man/fix_multiple_choice_vars.Rd
index 3f215815..c5a5aeec 100644
--- a/man/fix_multiple_choice_vars.Rd
+++ b/man/fix_multiple_choice_vars.Rd
@@ -5,8 +5,8 @@
\title{Correct multiple choice variables}
\usage{
fix_multiple_choice_vars(
- data = raw_data,
- meta = metadata,
+ data,
+ expected_vars = metadata$items_expanded$var,
var_column = "var",
value_column = "item_value",
suffix = "[[:digit:]]+$",
@@ -15,24 +15,38 @@ fix_multiple_choice_vars(
)
}
\arguments{
-\item{data}{data frame (typically the raw data)}
+\item{data}{A data frame.}
-\item{meta}{metadata, list of data frames.}
+\item{expected_vars}{Character vector containing the expected names of the
+variables.}
\item{var_column}{column name in which the variable names are stored}
-\item{value_column}{column name in which the values of the variables are stored}
+\item{value_column}{column name in which the values of the variables are
+stored}
\item{suffix}{Multiple choice suffix. Used to define multiple choice values}
\item{common_vars}{variables used for identifying unique rows in the dataset.}
-\item{collapse_with}{character value to collapse the multiple choice options with.
-If this value is NULL, the rows will be left as is.}
+\item{collapse_with}{character value to collapse the multiple choice options
+with. If this value is NULL, the rows will be left as is.}
}
\value{
data frame with corrected multiple choice variables
}
\description{
-Function to correct multiple choice variables in the data.
+In some EDC systems, if there is a multiple choice variable in which multiple
+answers are possible, the variable will be renamed with a suffix with the
+multiple answers in it. For example var1, var2, for answers 1 and 2. This
+function cleans this specific output so that the variable name remains
+consistent.
+}
+\examples{
+ df <- data.frame(
+ ID = "Subj1",
+ var = c("Age", paste0("MH_TRT", 1:4)),
+ item_value = as.character(c(95, 67, 58, 83, 34))
+ )
+ fix_multiple_choice_vars(df, common_vars = "ID")
}
diff --git a/man/get_available_data.Rd b/man/get_available_data.Rd
index 996e79ca..44e71354 100644
--- a/man/get_available_data.Rd
+++ b/man/get_available_data.Rd
@@ -4,7 +4,7 @@
\alias{get_available_data}
\title{Get available data}
\usage{
-get_available_data(data, tables, all_forms)
+get_available_data(data, tables, all_forms, form_repeat_name = "N")
}
\arguments{
\item{data}{list of data frames to be used. Will be used for extracting the
@@ -13,17 +13,22 @@ variables of interest from the study-specific forms.}
\item{tables}{list of tables to be used. Will be used for extracting the
variables of interest from the common forms.}
-\item{all_forms}{A data frame containing all forms.
-Mandatory columns are "form" (containing the form names), and "main_tab"
-(containing the tab name where the form should be located).}
+\item{all_forms}{A data frame containing all forms. Mandatory columns are
+"form" (containing the form names), and "main_tab" (containing the tab name
+where the form should be located).}
+
+\item{form_repeat_name}{A character string with the name of the \code{form_repeat}
+variable. This variable (with this name) will be added to the item name if
+duplicate names exist for each participant.}
}
\value{
A data frame with available data points per form.
}
\description{
Creates a data frame containing info about available data per individual,
-such as visits, adverse events, etc. Will be used in module \code{\link[=mod_queries_server]{mod_queries_server()}},
-to select available items to create a query for per individual and per form.
-Required columns are the ones distinctively identifying an item.
-For now that are site_code, event_name, subject_id, event_label, item_group, item_name.
+such as visits, adverse events, etc. Will be used in module
+\code{\link[=mod_queries_server]{mod_queries_server()}}, to select available items to create a query for per
+individual and per form. Required columns are the ones distinctively
+identifying an item. For now that are site_code, event_name, subject_id,
+event_label, item_group, item_name.
}
diff --git a/man/get_form_level_data.Rd b/man/get_form_level_data.Rd
new file mode 100644
index 00000000..0ad438a3
--- /dev/null
+++ b/man/get_form_level_data.Rd
@@ -0,0 +1,27 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fct_data_helpers.R
+\name{get_form_level_data}
+\alias{get_form_level_data}
+\title{Get form-level data.}
+\usage{
+get_form_level_data(data, all_forms, form_column = "item_group")
+}
+\arguments{
+\item{data}{A data frame with form-level data. Should at least contain the
+\code{form_column}.}
+
+\item{all_forms}{A character vector containing the names of all forms for
+which form-level data should be specified.}
+
+\item{form_column}{Character string with the column in which the form names
+are stored in \code{data}.}
+}
+\value{
+A cleaned data frame with form-level data.
+}
+\description{
+Internal function to clean form-level data and return a data frame with all
+forms that should be specified, and include form-level data for all of them.
+Will also set default values (as defined in the package) if the value is not
+set and/or is missing.
+}
diff --git a/man/get_metadata.Rd b/man/get_metadata.Rd
index fdfb5f87..471edefa 100644
--- a/man/get_metadata.Rd
+++ b/man/get_metadata.Rd
@@ -16,7 +16,8 @@ get_metadata(
\item{expand_tab_items}{Character vector with the names of the tabs of which
the items need to be expanded. If not empty, a new data frame will be
created named 'expanded_items', containing all items in the tabs of
-\code{expand_tab_items}.}
+\code{expand_tab_items}. Will abort if a tab name is provided that does not
+exist in the metadata.}
\item{expand_cols}{Column names containing the columns for expansion. Will be
ignored if the variable \code{expand_tab_items} is left empty.}
diff --git a/man/get_raw_csv_data.Rd b/man/get_raw_csv_data.Rd
new file mode 100644
index 00000000..854e8de8
--- /dev/null
+++ b/man/get_raw_csv_data.Rd
@@ -0,0 +1,38 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fct_appdata.R
+\name{get_raw_csv_data}
+\alias{get_raw_csv_data}
+\title{Get raw data from CSV files}
+\usage{
+get_raw_csv_data(
+ data_path = Sys.getenv("RAW_DATA_PATH"),
+ synch_time = time_stamp(),
+ exclude = c("README.csv$", "Pending_forms.csv$", "MEDRA.csv$", "WHODrug.csv$",
+ "_Queries.csv$"),
+ delim = ",",
+ skip = 1
+)
+}
+\arguments{
+\item{data_path}{Path to the folder that contains the CSV files with the
+application data.}
+
+\item{synch_time}{Time at which the data was extracted from the EDC system.
+Defaults to the current date time. Important to set this correctly, since
+it will be shown in the application. By default, a warning will be given in
+the application if the synchronization time is more than one day old.}
+
+\item{exclude}{character vector with regular expressions that identify csv
+files that should be excluded from the study data. Useful to exclude files
+with different data structures, or files with metadata.}
+
+\item{delim}{Delimiter to use to read in files.}
+
+\item{skip}{Number of rows to skip when reading in files.}
+}
+\value{
+A data frame with raw application data.
+}
+\description{
+Get raw data from CSV files
+}
diff --git a/man/get_raw_data.Rd b/man/get_raw_data.Rd
deleted file mode 100644
index e86054eb..00000000
--- a/man/get_raw_data.Rd
+++ /dev/null
@@ -1,31 +0,0 @@
-% Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/fct_appdata.R
-\name{get_raw_data}
-\alias{get_raw_data}
-\title{Get raw data}
-\usage{
-get_raw_data(
- data_path,
- column_specs = metadata$column_specs,
- delim = ",",
- skip = 1
-)
-}
-\arguments{
-\item{data_path}{Path to the folder that contains the CSV files with the
-application data.}
-
-\item{column_specs}{A data frame containing at least the columns 'name_raw',
-'name_new', and 'col_type'. Used to set the column specifications, and to
-set the column names to the names expected for the application to function.}
-
-\item{delim}{Delimiter to use to read in files.}
-
-\item{skip}{Number of rows to skip when reading in files.}
-}
-\value{
-A data frame with raw application data.
-}
-\description{
-Get raw data
-}
diff --git a/man/get_valid_roles.Rd b/man/get_valid_roles.Rd
new file mode 100644
index 00000000..2ab5ad46
--- /dev/null
+++ b/man/get_valid_roles.Rd
@@ -0,0 +1,20 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fct_app_role_helpers.R
+\name{get_valid_roles}
+\alias{get_valid_roles}
+\title{Get valid roles}
+\usage{
+get_valid_roles(roles, all_roles = get_roles_from_config())
+}
+\arguments{
+\item{roles}{A character vector. Will be converted to lower case.}
+
+\item{all_roles}{A named character vector with all applicable roles.}
+}
+\value{
+A named character vector with the roles applicable for the
+application and available for the current user.
+}
+\description{
+Helper function to retrieve all roles that are relevant for the application.
+}
diff --git a/man/merge_meta_with_data.Rd b/man/merge_meta_with_data.Rd
index 2f5e531a..de890352 100644
--- a/man/merge_meta_with_data.Rd
+++ b/man/merge_meta_with_data.Rd
@@ -5,8 +5,8 @@
\title{Merge metadata with raw data}
\usage{
merge_meta_with_data(
- data = raw_data,
- meta = metadata,
+ data,
+ meta,
expected_columns = c("LBORNR_Lower", "LBORNR_Upper", "LBORRESU", "LBORRESUOTH",
"LBREASND", "unit", "lower_limit", "upper_limit", "LBCLSIG")
)
@@ -25,7 +25,7 @@ A data frame.
}
\description{
Study-specific function that will combine raw data gathered with
-\code{\link[=get_raw_data]{get_raw_data()}} with study-specific metadata. It also fixes the metadata
+\code{\link[=get_raw_csv_data]{get_raw_csv_data()}} with study-specific metadata. It also fixes the metadata
suffix if needed, and renames the limits and significance values to the app
standard names. Some study-specific variables need to be created with this
step.
diff --git a/man/metadata.Rd b/man/metadata.Rd
index 9074b6ec..36d1c56e 100644
--- a/man/metadata.Rd
+++ b/man/metadata.Rd
@@ -17,8 +17,18 @@ interest in the common forms.
and in addition the columns \code{unit}, \code{lower_limit}, \code{uppter_limit}. Used to
select and rename the variables of interest in the common forms.
\item \code{general}: Contains the same columns as \code{common_forms}.
-\item \code{groups}: Contains the columns \code{item_group}, \code{item_type}, \code{item_scale},
-\code{use_unscaled_limits}.
+\item \code{form_level_data}: For specifying form-level data. When reading in metadata
+from the Excel format, this table will created and sanitized if needed,
+creating the minimum columns \code{item_group}, \code{item_scale},
+\code{use_unscaled_limits}, and \code{review_required}. The column \code{item_group}
+contains the name of the forms to which the settings apply. Columns
+\code{item_scale} and \code{use_unscaled_limits} are used in
+\code{\link[=mod_study_forms_server]{mod_study_forms_server()}} to specify the scaling of the figures. It is
+recommended to set the required values here; by default, they are both set
+to FALSE in \code{\link[=mod_study_forms_server]{mod_study_forms_server()}}. The last column that is expected
+here is \code{review_required}, which can be used to specify whether review is
+required for a form. Will default to TRUE for each form it is unset for a
+form.
}
}
}
diff --git a/man/mod_db_synch_info_server.Rd b/man/mod_db_synch_info_server.Rd
index 611645cb..824c25ca 100644
--- a/man/mod_db_synch_info_server.Rd
+++ b/man/mod_db_synch_info_server.Rd
@@ -4,7 +4,13 @@
\alias{mod_db_synch_info_server}
\title{Database Synchronization information - Shiny module Server}
\usage{
-mod_db_synch_info_server(id, app_data, db_path, test_mode, show_warning = TRUE)
+mod_db_synch_info_server(
+ id,
+ app_data,
+ db_path,
+ current_date = Sys.Date(),
+ show_synch_warning = isTRUE(get_golem_config("app_prod"))
+)
}
\arguments{
\item{id}{Character string, used to connect the module UI with the module
@@ -18,13 +24,12 @@ date.}
to retrieve the latest database synch date that is stored in the data frame
"db_synch_time".}
-\item{test_mode}{Logical. If TRUE, a fixed date (2024-01-10) will be chosen
-as current date, This way, the module can be tested consistently. Can be
-replaced and removed as soon as mocking is available within \code{shinytest2}.}
+\item{current_date}{Current date. Standard \code{Sys.Date()}. Can be useful to set
+for testing purposes.}
-\item{show_warning}{Logical. Whether to show a pop-up message with a warning
-if database synchronization did not happen on the current day. Useful to
-be able to turn off the message for testing purposes.}
+\item{show_synch_warning}{Logical. Whether to show a pop-up message with a
+warning if database synchronization did not happen on the current day. Will
+normally be shown if in the configuration the app is set to production.}
}
\description{
A shiny module. Used to display database synchronization information/
diff --git a/man/mod_header_widgets_server.Rd b/man/mod_header_widgets_server.Rd
index 043fee88..38fc7f57 100644
--- a/man/mod_header_widgets_server.Rd
+++ b/man/mod_header_widgets_server.Rd
@@ -4,7 +4,7 @@
\alias{mod_header_widgets_server}
\title{Header widgets - Shiny module Server}
\usage{
-mod_header_widgets_server(id, r, rev_data, navinfo)
+mod_header_widgets_server(id, r, rev_data, navinfo, events)
}
\arguments{
\item{id}{Character string, used to connect the module UI with the module
@@ -17,6 +17,10 @@ Server.}
\item{navinfo}{Reactive values created with \code{\link[shiny:reactiveValues]{shiny::reactiveValues()}}. Used
to send back information about the page change to the server, when clicking
on the adverse event box.}
+
+\item{events}{Data frame containing all events. Used to extract the right
+labels for the visits in the compact timeline in the header_widgets. See
+\code{\link[=fig_timeline]{fig_timeline()}}.}
}
\description{
A shiny module. Used to show user information of the active user in value
@@ -30,9 +34,9 @@ updated data is available), the number of forms that need a review, and a
timeline figure showing the number of visits that the patient performed. The
value box with adverse events also serves as a link to the adverse events
form. Furthermore, clicking on the box with forms to review will trigger
-\code{\link[=mod_navigate_review_server]{mod_navigate_review_server()}}, opening a modal that shows the forms that need
-review and the queries that are open of the active participant, to which you
-can directly navigate to.
+\code{\link[=mod_navigate_review_server]{mod_navigate_review_server()}}, opening a modal that shows the forms that
+need review and the queries that are open of the active participant, to which
+you can directly navigate to.
}
\seealso{
\code{\link[=mod_header_widgets_ui]{mod_header_widgets_ui()}}
diff --git a/man/mod_header_widgets_ui.Rd b/man/mod_header_widgets_ui.Rd
index 7a10c9fe..a74c79eb 100644
--- a/man/mod_header_widgets_ui.Rd
+++ b/man/mod_header_widgets_ui.Rd
@@ -22,9 +22,9 @@ updated data is available), the number of forms that need a review, and a
timeline figure showing the number of visits that the patient performed. The
value box with adverse events also serves as a link to the adverse events
form. Furthermore, clicking on the box with forms to review will trigger
-\code{\link[=mod_navigate_review_server]{mod_navigate_review_server()}}, opening a modal that shows the forms that need
-review and the queries that are open of the active participant, to which you
-can directly navigate to.
+\code{\link[=mod_navigate_review_server]{mod_navigate_review_server()}}, opening a modal that shows the forms that
+need review and the queries that are open of the active participant, to which
+you can directly navigate to.
}
\seealso{
\code{\link[=mod_header_widgets_server]{mod_header_widgets_server()}}
diff --git a/man/mod_main_sidebar_server.Rd b/man/mod_main_sidebar_server.Rd
index d8a1b043..c279c361 100644
--- a/man/mod_main_sidebar_server.Rd
+++ b/man/mod_main_sidebar_server.Rd
@@ -13,8 +13,7 @@ mod_main_sidebar_server(
app_vars,
db_path,
forms_to_review,
- available_data,
- test_mode
+ available_data
)
}
\arguments{
@@ -56,8 +55,6 @@ the forms that need review of the active participant.}
created with the function \code{\link[=get_available_data]{get_available_data()}}. The data frame will be
passed on to the module \code{\link[=mod_query_add_server]{mod_query_add_server()}}, which requires this data
frame and is embedded in \code{mod_main_sidebar_server()}.}
-
-\item{test_mode}{Logical. Required for testing \code{\link[=mod_db_synch_info_server]{mod_db_synch_info_server()}}.}
}
\description{
A shiny module. Used to create the sidebar in the main application.
diff --git a/man/mod_review_forms_server.Rd b/man/mod_review_forms_server.Rd
index 856ad682..181514ae 100644
--- a/man/mod_review_forms_server.Rd
+++ b/man/mod_review_forms_server.Rd
@@ -4,7 +4,14 @@
\alias{mod_review_forms_server}
\title{Review form - Shiny module Server}
\usage{
-mod_review_forms_server(id, r, active_form, active_tab, db_path)
+mod_review_forms_server(
+ id,
+ r,
+ active_form,
+ active_tab,
+ review_required_data,
+ db_path
+)
}
\arguments{
\item{id}{Character string, used to connect the module UI with the module
@@ -21,6 +28,10 @@ whether that form needs review.}
the review controls if non-relevant tabs are selected (tabs that do not
contain common forms or study forms).}
+\item{review_required_data}{a data frame with information about whether
+review is mandatory for each form. Should contain the columns \code{item_group}
+and \code{review_required}.}
+
\item{db_path}{Character string with the file path to the database.}
}
\description{
@@ -33,8 +44,8 @@ displayed in the application has any values that are newly entered or
updated since the last review session. In addition, if a page contains new
data, the user can mark all data in the form as being reviewed and can
(optionally) add a comment to this review action. The data will be saved in
-a database. All review activity is stored with an audit-trail, with date/time
-stamps and with the reviewer's name.
+a database. All review activity is stored with an audit-trail, with
+date/time stamps and with the reviewer's name.
}
\seealso{
\code{\link[=mod_review_forms_ui]{mod_review_forms_ui()}}
diff --git a/man/mod_review_forms_ui.Rd b/man/mod_review_forms_ui.Rd
index fb3045b7..443fe0bf 100644
--- a/man/mod_review_forms_ui.Rd
+++ b/man/mod_review_forms_ui.Rd
@@ -20,8 +20,8 @@ displayed in the application has any values that are newly entered or
updated since the last review session. In addition, if a page contains new
data, the user can mark all data in the form as being reviewed and can
(optionally) add a comment to this review action. The data will be saved in
-a database. All review activity is stored with an audit-trail, with date/time
-stamps and with the reviewer's name.
+a database. All review activity is stored with an audit-trail, with
+date/time stamps and with the reviewer's name.
}
\seealso{
\code{\link[=mod_review_forms_server]{mod_review_forms_server()}}
diff --git a/man/mod_study_forms_server.Rd b/man/mod_study_forms_server.Rd
index e151b2da..8c84debd 100644
--- a/man/mod_study_forms_server.Rd
+++ b/man/mod_study_forms_server.Rd
@@ -10,7 +10,8 @@ mod_study_forms_server(
form,
form_items,
id_item = c("subject_id", "event_name", "item_group", "form_repeat", "item_name"),
- table_names = NULL
+ table_names = NULL,
+ item_info
)
}
\arguments{
@@ -42,6 +43,10 @@ that can uniquely identify one item/row.}
\item{table_names}{An optional character vector. If provided, will be used
within \code{\link[=datatable_custom]{datatable_custom()}}, to improve the column names in the final
interactive tables.}
+
+\item{item_info}{A data frame containing the names of the study forms (in the
+column \code{item_group}), and the columns \code{item_scale} \code{use_unscaled_limits},
+which are used to customize the way the figures are shown in the page.}
}
\description{
A shiny module. Used to display figures and tables of a study-specific form
diff --git a/man/rename_raw_data.Rd b/man/rename_raw_data.Rd
new file mode 100644
index 00000000..3f55df25
--- /dev/null
+++ b/man/rename_raw_data.Rd
@@ -0,0 +1,23 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/fct_data_helpers.R
+\name{rename_raw_data}
+\alias{rename_raw_data}
+\title{Rename raw data}
+\usage{
+rename_raw_data(data, column_names = metadata$column_names)
+}
+\arguments{
+\item{data}{A data frame with raw study data.}
+
+\item{column_names}{A data frame with column names. Should have at
+least the columns \code{name_raw}, containing the current column names, and
+\code{name_new}, containing the new column names. \code{name_new} should contain all
+names that are required for ClinSight to function properly
+(\code{required_col_names}).}
+}
+\value{
+A data frame
+}
+\description{
+Helper function to rename raw data
+}
diff --git a/man/run_app.Rd b/man/run_app.Rd
index 050d0d70..00415ddd 100644
--- a/man/run_app.Rd
+++ b/man/run_app.Rd
@@ -9,12 +9,8 @@ run_app(
options = list(),
enableBookmarking = NULL,
uiPattern = "/",
- meta = metadata,
- data = clinsightful_data,
- user_db = "user_db.sqlite",
- credentials_db = "credentials_db.sqlite",
+ data_folder = NULL,
credentials_pwd = Sys.getenv("DB_SECRET"),
- test_mode = FALSE,
...
)
}
@@ -39,22 +35,13 @@ request to determine whether the \code{ui} should be used to handle the
request. Note that the entire request path must match the regular
expression in order for the match to be considered successful.}
-\item{meta}{A data frame containing metadata.}
-
-\item{data}{Either a data frame or a character string with the path to the
-app data in .rds format.}
-
-\item{user_db}{Character string. Path to the app database. If not existing,
-will be created based on app data and metadata, with all data labeled as
-'new'/not yet reviewed.}
-
-\item{credentials_db}{Character string. Path to the credentials database.}
+\item{data_folder}{Character string. The folder in which all data resides is
+usually set in the config.yml file. However, this can be overwritten if a
+path is set in this argument. Useful for testing purposes.}
\item{credentials_pwd}{Character string with the credentials' database
password.}
-\item{test_mode}{Logical, whether to run the application in test mode.}
-
\item{...}{arguments to pass to golem_opts. See \code{?golem::get_golem_options}
for more details.}
}
diff --git a/man/update_review_data.Rd b/man/update_review_data.Rd
index f0282d2f..83758347 100644
--- a/man/update_review_data.Rd
+++ b/man/update_review_data.Rd
@@ -8,7 +8,8 @@ update_review_data(
review_df,
latest_review_data,
common_vars = c("subject_id", "event_name", "item_group", "form_repeat", "item_name"),
- edit_time_var = "edit_date_time"
+ edit_time_var = "edit_date_time",
+ update_time = time_stamp()
)
}
\arguments{
@@ -21,6 +22,9 @@ updated.}
\item{edit_time_var}{A character vector with the column name of the edit-time
variable.}
+
+\item{update_time}{Time stamp given to rows with new rows that are added.
+Defaults to \code{\link[=time_stamp]{time_stamp()}}.}
}
\value{
A data frame containing only the rows with updated review data.
diff --git a/manifest.json b/manifest.json
new file mode 100644
index 00000000..3cd0fc7a
--- /dev/null
+++ b/manifest.json
@@ -0,0 +1,6598 @@
+{
+ "version": 1,
+ "locale": "en_US",
+ "platform": "4.3.3",
+ "metadata": {
+ "appmode": "shiny",
+ "primary_rmd": null,
+ "primary_html": null,
+ "content_category": null,
+ "has_parameters": false
+ },
+ "packages": {
+ "AsioHeaders": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "AsioHeaders",
+ "Type": "Package",
+ "Title": "'Asio' C++ Header Files",
+ "Version": "1.22.1-2",
+ "Date": "2022-12-07",
+ "Author": "Dirk Eddelbuettel",
+ "Maintainer": "Dirk Eddelbuettel ",
+ "Description": "'Asio' is a cross-platform C++ library for network and low-level\n I/O programming that provides developers with a consistent asynchronous model\n using a modern C++ approach. It is also included in Boost but requires linking\n when used with Boost. Standalone it can be used header-only (provided a recent\n compiler). 'Asio' is written and maintained by Christopher M. Kohlhoff, and\n released under the 'Boost Software License', Version 1.0.",
+ "Copyright": "file inst/COPYRIGHTS",
+ "License": "BSL-1.0",
+ "URL": "https://github.com/eddelbuettel/asioheaders,\nhttps://dirk.eddelbuettel.com/code/asioheaders.html",
+ "BugReports": "https://github.com/eddelbuettel/asioheaders/issues",
+ "NeedsCompilation": "no",
+ "Packaged": "2022-12-08 04:04:23 UTC; edd",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-12-08 08:12:34 UTC",
+ "Encoding": "UTF-8",
+ "Built": "R 4.3.0; ; 2024-01-23 01:39:34 UTC; windows"
+ }
+ },
+ "BH": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "BH",
+ "Type": "Package",
+ "Title": "Boost C++ Header Files",
+ "Version": "1.81.0-1",
+ "Date": "2023-01-17",
+ "Author": "Dirk Eddelbuettel, John W. Emerson and Michael J. Kane",
+ "Maintainer": "Dirk Eddelbuettel ",
+ "Description": "Boost provides free peer-reviewed portable C++ source \n libraries. A large part of Boost is provided as C++ template code\n which is resolved entirely at compile-time without linking. This \n package aims to provide the most useful subset of Boost libraries \n for template use among CRAN packages. By placing these libraries in \n this package, we offer a more efficient distribution system for CRAN \n as replication of this code in the sources of other packages is \n avoided. As of release 1.81.0-0, the following Boost libraries are\n included: 'accumulators' 'algorithm' 'align' 'any' 'atomic' 'beast'\n 'bimap' 'bind' 'circular_buffer' 'compute' 'concept' 'config'\n 'container' 'date_time' 'detail' 'dynamic_bitset' 'exception'\n 'flyweight' 'foreach' 'functional' 'fusion' 'geometry' 'graph' 'heap'\n 'icl' 'integer' 'interprocess' 'intrusive' 'io' 'iostreams'\n 'iterator' 'lambda2' 'math' 'move' 'mp11' 'mpl' 'multiprecision'\n 'numeric' 'pending' 'phoenix' 'polygon' 'preprocessor' 'process'\n 'propery_tree' 'random' 'range' 'scope_exit' 'smart_ptr' 'sort'\n 'spirit' 'tuple' 'type_traits' 'typeof' 'unordered' 'url' 'utility'\n 'uuid'.",
+ "License": "BSL-1.0",
+ "URL": "https://github.com/eddelbuettel/bh,\nhttps://dirk.eddelbuettel.com/code/bh.html",
+ "BugReports": "https://github.com/eddelbuettel/bh/issues",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-01-17 22:52:33 UTC; edd",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-01-22 08:20:02 UTC",
+ "Encoding": "UTF-8",
+ "Built": "R 4.3.0; ; 2024-01-23 01:14:17 UTC; windows"
+ }
+ },
+ "DBI": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "DBI",
+ "Title": "R Database Interface",
+ "Version": "1.1.3",
+ "Date": "2022-06-18",
+ "Authors@R": "c(\n person(\"R Special Interest Group on Databases (R-SIG-DB)\", role = \"aut\"),\n person(\"Hadley\", \"Wickham\", role = \"aut\"),\n person(\"Kirill\", \"Müller\", , \"krlmlr+r@mailbox.org\", role = c(\"aut\", \"cre\"),\n comment = c(ORCID = \"0000-0002-1416-3412\")),\n person(\"R Consortium\", role = \"fnd\")\n )",
+ "Description": "A database interface definition for communication between R\n and relational database management systems. All classes in this\n package are virtual and need to be extended by the various R/DBMS\n implementations.",
+ "License": "LGPL (>= 2.1)",
+ "URL": "https://dbi.r-dbi.org, https://github.com/r-dbi/DBI",
+ "BugReports": "https://github.com/r-dbi/DBI/issues",
+ "Depends": "methods, R (>= 3.0.0)",
+ "Suggests": "blob, covr, DBItest, dbplyr, downlit, dplyr, glue, hms,\nknitr, magrittr, RMariaDB, rmarkdown, rprojroot, RSQLite (>=\n1.1-2), testthat, xml2",
+ "VignetteBuilder": "knitr",
+ "Config/autostyle/scope": "line_breaks",
+ "Config/autostyle/strict": "false",
+ "Config/Needs/check": "r-dbi/DBItest",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.0",
+ "Config/Needs/website": "r-dbi/DBItest, AzureKusto, bigrquery,\nDatabaseConnector, dittodb, duckdb, implyr, lazysf, odbc, pool,\nRAthena, IMSMWU/RClickhouse, RH2, RJDBC, RMariaDB, RMySQL,\nRPostgres, RPostgreSQL, RPresto, RSQLite, sergeant, sparklyr,\nwithr",
+ "Collate": "'DBIObject.R' 'DBIDriver.R' 'Id.R' 'DBIConnection.R' 'ANSI.R'\n'DBI-package.R' 'DBIConnector.R' 'DBIResult.R' 'SQL.R'\n'SQLKeywords.R' 'SQLKeywords_DBIObject.R'\n'SQLKeywords_missing.R' 'data-types.R' 'data.R'\n'dbAppendTable.R' 'dbAppendTable_DBIConnection.R' 'dbBegin.R'\n'dbBind.R' 'dbCallProc.R' 'dbCanConnect.R'\n'dbCanConnect_DBIDriver.R' 'dbClearResult.R' 'dbColumnInfo.R'\n'dbCommit.R' 'dbConnect.R' 'dbConnect_DBIConnector.R'\n'dbCreateTable.R' 'dbCreateTable_DBIConnection.R'\n'dbDataType.R' 'dbDataType_DBIConnector.R'\n'dbDataType_DBIObject.R' 'dbDisconnect.R' 'dbDriver.R'\n'dbDriver_character.R' 'dbExecute.R'\n'dbExecute_DBIConnection_character.R' 'dbExistsTable.R'\n'dbExistsTable_DBIConnection_Id.R' 'dbFetch.R'\n'dbFetch_DBIResult.R' 'dbGetConnectArgs.R'\n'dbGetConnectArgs_DBIConnector.R' 'dbGetException.R'\n'dbGetInfo.R' 'dbGetInfo_DBIResult.R' 'dbGetQuery.R'\n'dbGetQuery_DBIConnection_character.R' 'dbGetRowCount.R'\n'dbGetRowsAffected.R' 'dbGetStatement.R' 'dbHasCompleted.R'\n'dbIsReadOnly.R' 'dbIsReadOnly_DBIConnector.R'\n'dbIsReadOnly_DBIObject.R' 'dbIsValid.R' 'dbListConnections.R'\n'dbListFields.R' 'dbListFields_DBIConnection_Id.R'\n'dbListFields_DBIConnection_character.R' 'dbListObjects.R'\n'dbListObjects_DBIConnection_ANY.R' 'dbListResults.R'\n'dbListTables.R' 'dbQuoteIdentifier.R'\n'dbQuoteIdentifier_DBIConnection.R' 'dbQuoteLiteral.R'\n'dbQuoteLiteral_DBIConnection.R' 'dbQuoteString.R'\n'dbQuoteString_DBIConnection.R' 'dbReadTable.R'\n'dbReadTable_DBIConnection_Id.R'\n'dbReadTable_DBIConnection_character.R' 'dbRemoveTable.R'\n'dbRemoveTable_DBIConnection_Id.R' 'dbRollback.R'\n'dbSendQuery.R' 'dbSendStatement.R'\n'dbSendStatement_DBIConnection_character.R'\n'dbSetDataMappings.R' 'dbUnloadDriver.R'\n'dbUnquoteIdentifier.R' 'dbUnquoteIdentifier_DBIConnection.R'\n'dbWithTransaction.R' 'dbWithTransaction_DBIConnection.R'\n'dbWriteTable.R' 'dbWriteTable_DBIConnection_Id_ANY.R'\n'dbiDataType.R' 'dbiDataType_AsIs.R' 'dbiDataType_Date.R'\n'dbiDataType_POSIXct.R' 'dbiDataType_character.R'\n'dbiDataType_data.frame.R' 'dbiDataType_difftime.R'\n'dbiDataType_integer.R' 'dbiDataType_list.R'\n'dbiDataType_logical.R' 'dbiDataType_numeric.R' 'deprecated.R'\n'fetch.R' 'hms.R' 'interpolate.R' 'isSQLKeyword.R'\n'isSQLKeyword_DBIObject_character.R' 'make.db.names.R'\n'make.db.names_DBIObject_character.R' 'methods_as_rd.R'\n'rownames.R' 'show_AnsiConnection.R' 'show_DBIConnection.R'\n'show_DBIConnector.R' 'show_DBIDriver.R' 'show_DBIResult.R'\n'show_Id.R' 'show_SQL.R' 'sqlAppendTable.R'\n'sqlAppendTableTemplate.R' 'sqlAppendTable_DBIConnection.R'\n'sqlCreateTable.R' 'sqlCreateTable_DBIConnection.R' 'sqlData.R'\n'sqlData_DBIConnection.R' 'sqlInterpolate.R'\n'sqlInterpolate_DBIConnection.R' 'sqlParseVariables.R'\n'sqlParseVariables_DBIConnection.R' 'summary.R'\n'summary_DBIObject.R' 'transactions.R'",
+ "NeedsCompilation": "no",
+ "Packaged": "2022-06-18 01:24:38 UTC; kirill",
+ "Author": "R Special Interest Group on Databases (R-SIG-DB) [aut],\n Hadley Wickham [aut],\n Kirill Müller [aut, cre] (),\n R Consortium [fnd]",
+ "Maintainer": "Kirill Müller ",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-06-18 07:10:15 UTC",
+ "Built": "R 4.3.0; ; 2023-04-24 19:11:04 UTC; windows"
+ }
+ },
+ "DT": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "DT",
+ "Type": "Package",
+ "Title": "A Wrapper of the JavaScript Library 'DataTables'",
+ "Version": "0.30",
+ "Authors@R": "c(\n person(\"Yihui\", \"Xie\", email = \"xie@yihui.name\", role = c(\"aut\", \"cre\")),\n person(\"Joe\", \"Cheng\", role = \"aut\"),\n person(\"Xianying\", \"Tan\", role = \"aut\"),\n person(\"JJ\", \"Allaire\", role = \"ctb\"),\n person(\"Maximilian\", \"Girlich\", role = \"ctb\"),\n person(\"Greg\", \"Freedman Ellis\", role = \"ctb\"),\n person(\"Johannes\", \"Rauh\", role = \"ctb\"),\n person(\"SpryMedia Limited\", role = c(\"ctb\", \"cph\"), comment = \"DataTables in htmlwidgets/lib\"),\n person(\"Brian\", \"Reavis\", role = c(\"ctb\", \"cph\"), comment = \"selectize.js in htmlwidgets/lib\"),\n person(\"Leon\", \"Gersen\", role = c(\"ctb\", \"cph\"), comment = \"noUiSlider in htmlwidgets/lib\"),\n person(\"Bartek\", \"Szopka\", role = c(\"ctb\", \"cph\"), comment = \"jquery.highlight.js in htmlwidgets/lib\"),\n person(\"Alex\", \"Pickering\", role = c(\"ctb\")),\n person(\"William\", \"Holmes\", role = c(\"ctb\")),\n person(\"Mikko\", \"Marttila\", role = c(\"ctb\")),\n person(\"Andres\", \"Quintero\", role = c(\"ctb\")),\n person(\"Stéphane\", \"Laurent\", role = c(\"ctb\")),\n person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\"))\n )",
+ "Maintainer": "Yihui Xie ",
+ "Description": "Data objects in R can be rendered as HTML tables using the\n JavaScript library 'DataTables' (typically via R Markdown or Shiny). The\n 'DataTables' library has been included in this R package. The package name\n 'DT' is an abbreviation of 'DataTables'.",
+ "URL": "https://github.com/rstudio/DT",
+ "BugReports": "https://github.com/rstudio/DT/issues",
+ "License": "GPL-3 | file LICENSE",
+ "Imports": "htmltools (>= 0.3.6), htmlwidgets (>= 1.3), httpuv, jsonlite\n(>= 0.9.16), magrittr, crosstalk, jquerylib, promises",
+ "Suggests": "knitr (>= 1.8), rmarkdown, shiny (>= 1.6), bslib, future,\ntestit, tibble",
+ "VignetteBuilder": "knitr",
+ "RoxygenNote": "7.2.3",
+ "Encoding": "UTF-8",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-10-04 20:26:15 UTC; yihui",
+ "Author": "Yihui Xie [aut, cre],\n Joe Cheng [aut],\n Xianying Tan [aut],\n JJ Allaire [ctb],\n Maximilian Girlich [ctb],\n Greg Freedman Ellis [ctb],\n Johannes Rauh [ctb],\n SpryMedia Limited [ctb, cph] (DataTables in htmlwidgets/lib),\n Brian Reavis [ctb, cph] (selectize.js in htmlwidgets/lib),\n Leon Gersen [ctb, cph] (noUiSlider in htmlwidgets/lib),\n Bartek Szopka [ctb, cph] (jquery.highlight.js in htmlwidgets/lib),\n Alex Pickering [ctb],\n William Holmes [ctb],\n Mikko Marttila [ctb],\n Andres Quintero [ctb],\n Stéphane Laurent [ctb],\n Posit Software, PBC [cph, fnd]",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-10-05 13:10:02 UTC",
+ "Built": "R 4.3.0; ; 2023-10-06 12:04:40 UTC; windows"
+ }
+ },
+ "MASS": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "MASS",
+ "Priority": "recommended",
+ "Version": "7.3-60",
+ "Date": "2023-05-02",
+ "Revision": "$Rev: 3621 $",
+ "Depends": "R (>= 4.0), grDevices, graphics, stats, utils",
+ "Imports": "methods",
+ "Suggests": "lattice, nlme, nnet, survival",
+ "Authors@R": "c(person(\"Brian\", \"Ripley\", role = c(\"aut\", \"cre\", \"cph\"),\n email = \"ripley@stats.ox.ac.uk\"),\n\t person(\"Bill\", \"Venables\", role = \"ctb\"),\n\t person(c(\"Douglas\", \"M.\"), \"Bates\", role = \"ctb\"),\n\t person(\"Kurt\", \"Hornik\", role = \"trl\",\n comment = \"partial port ca 1998\"),\n\t person(\"Albrecht\", \"Gebhardt\", role = \"trl\",\n comment = \"partial port ca 1998\"),\n\t person(\"David\", \"Firth\", role = \"ctb\"))",
+ "Description": "Functions and datasets to support Venables and Ripley,\n \"Modern Applied Statistics with S\" (4th edition, 2002).",
+ "Title": "Support Functions and Datasets for Venables and Ripley's MASS",
+ "LazyData": "yes",
+ "ByteCompile": "yes",
+ "License": "GPL-2 | GPL-3",
+ "URL": "http://www.stats.ox.ac.uk/pub/MASS4/",
+ "Contact": "",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-05-02 16:42:41 UTC; ripley",
+ "Author": "Brian Ripley [aut, cre, cph],\n Bill Venables [ctb],\n Douglas M. Bates [ctb],\n Kurt Hornik [trl] (partial port ca 1998),\n Albrecht Gebhardt [trl] (partial port ca 1998),\n David Firth [ctb]",
+ "Maintainer": "Brian Ripley ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-05-04 07:32:21 UTC",
+ "Encoding": "UTF-8",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 01:24:27 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "Matrix": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "Matrix",
+ "Version": "1.6-1.1",
+ "Date": "2023-09-08",
+ "Priority": "recommended",
+ "Title": "Sparse and Dense Matrix Classes and Methods",
+ "Description": "A rich hierarchy of sparse and dense matrix classes,\n\tincluding general, symmetric, triangular, and diagonal matrices\n\twith numeric, logical, or pattern entries. Efficient methods for\n\toperating on such matrices, often wrapping the 'BLAS', 'LAPACK',\n\tand 'SuiteSparse' libraries.",
+ "License": "GPL (>= 2) | file LICENCE",
+ "URL": "https://Matrix.R-forge.R-project.org",
+ "BugReports": "https://R-forge.R-project.org/tracker/?atid=294&group_id=61",
+ "Contact": "Matrix-authors@R-project.org",
+ "Authors@R": "\n\tc(person(\"Douglas\", \"Bates\", role = \"aut\",\n\t comment = c(ORCID = \"0000-0001-8316-9503\")),\n\t person(\"Martin\", \"Maechler\", role = c(\"aut\", \"cre\"),\n\t email = \"mmaechler+Matrix@gmail.com\",\n\t comment = c(ORCID = \"0000-0002-8685-9910\")),\n\t person(\"Mikael\", \"Jagan\", role = \"aut\",\n\t comment = c(ORCID = \"0000-0002-3542-2938\")),\n\t person(\"Timothy A.\", \"Davis\", role = \"ctb\",\n\t comment = c(ORCID = \"0000-0001-7614-6899\",\n\t \"SuiteSparse libraries, notably CHOLMOD and AMD\",\n\t \"collaborators listed in dir(pattern=\\\"^[A-Z]+[.]txt$\\\", full.names=TRUE, system.file(\\\"doc\\\", \\\"SuiteSparse\\\", package=\\\"Matrix\\\"))\")),\n\t person(\"Jens\", \"Oehlschlägel\", role = \"ctb\",\n\t comment = \"initial nearPD()\"),\n\t person(\"Jason\", \"Riedy\", role = \"ctb\",\n\t comment = c(ORCID = \"0000-0002-4345-4200\",\n\t \"GNU Octave's condest() and onenormest()\",\n\t \"Copyright: Regents of the University of California\")),\n\t person(\"R Core Team\", role = \"ctb\",\n\t comment = \"base R's matrix implementation\"))",
+ "Depends": "R (>= 3.5.0), methods",
+ "Imports": "grDevices, graphics, grid, lattice, stats, utils",
+ "Suggests": "MASS, datasets, sfsmisc",
+ "Enhances": "SparseM, graph",
+ "LazyData": "no",
+ "LazyDataNote": "not possible, since we use data/*.R and our S4 classes",
+ "BuildResaveData": "no",
+ "Encoding": "UTF-8",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-09-08 10:37:27 UTC; maechler",
+ "Author": "Douglas Bates [aut] (),\n Martin Maechler [aut, cre] (),\n Mikael Jagan [aut] (),\n Timothy A. Davis [ctb] (,\n SuiteSparse libraries, notably CHOLMOD and AMD, collaborators\n listed in dir(pattern=\"^[A-Z]+[.]txt$\", full.names=TRUE,\n system.file(\"doc\", \"SuiteSparse\", package=\"Matrix\"))),\n Jens Oehlschlägel [ctb] (initial nearPD()),\n Jason Riedy [ctb] (, GNU\n Octave's condest() and onenormest(), Copyright: Regents of the\n University of California),\n R Core Team [ctb] (base R's matrix implementation)",
+ "Maintainer": "Martin Maechler ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-09-18 17:40:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-09-19 12:00:42 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "R.methodsS3": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "R.methodsS3",
+ "Version": "1.8.2",
+ "Depends": "R (>= 2.13.0)",
+ "Imports": "utils",
+ "Suggests": "codetools",
+ "Title": "S3 Methods Simplified",
+ "Authors@R": "c(person(\"Henrik\", \"Bengtsson\", role=c(\"aut\", \"cre\", \"cph\"),\n email = \"henrikb@braju.com\"))",
+ "Author": "Henrik Bengtsson [aut, cre, cph]",
+ "Maintainer": "Henrik Bengtsson ",
+ "Description": "Methods that simplify the setup of S3 generic functions and S3 methods. Major effort has been made in making definition of methods as simple as possible with a minimum of maintenance for package developers. For example, generic functions are created automatically, if missing, and naming conflict are automatically solved, if possible. The method setMethodS3() is a good start for those who in the future may want to migrate to S4. This is a cross-platform package implemented in pure R that generates standard S3 methods.",
+ "License": "LGPL (>= 2.1)",
+ "LazyLoad": "TRUE",
+ "URL": "https://github.com/HenrikBengtsson/R.methodsS3",
+ "BugReports": "https://github.com/HenrikBengtsson/R.methodsS3/issues",
+ "NeedsCompilation": "no",
+ "Packaged": "2022-06-13 18:23:35 UTC; hb",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-06-13 22:00:14 UTC",
+ "Encoding": "UTF-8",
+ "Built": "R 4.3.0; ; 2024-01-23 01:19:47 UTC; windows"
+ }
+ },
+ "R.oo": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "R.oo",
+ "Version": "1.25.0",
+ "Depends": "R (>= 2.13.0), R.methodsS3 (>= 1.8.1)",
+ "Imports": "methods, utils",
+ "Suggests": "tools",
+ "Title": "R Object-Oriented Programming with or without References",
+ "Authors@R": "c(person(\"Henrik\", \"Bengtsson\", role=c(\"aut\", \"cre\", \"cph\"),\n email = \"henrikb@braju.com\"))",
+ "Author": "Henrik Bengtsson [aut, cre, cph]",
+ "Maintainer": "Henrik Bengtsson ",
+ "Description": "Methods and classes for object-oriented programming in R with or without references. Large effort has been made on making definition of methods as simple as possible with a minimum of maintenance for package developers. The package has been developed since 2001 and is now considered very stable. This is a cross-platform package implemented in pure R that defines standard S3 classes without any tricks.",
+ "License": "LGPL (>= 2.1)",
+ "LazyLoad": "TRUE",
+ "URL": "https://github.com/HenrikBengtsson/R.oo",
+ "BugReports": "https://github.com/HenrikBengtsson/R.oo/issues",
+ "NeedsCompilation": "no",
+ "Packaged": "2022-06-12 00:26:52 UTC; hb",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-06-12 02:20:02 UTC",
+ "Encoding": "UTF-8",
+ "Built": "R 4.3.0; ; 2024-01-23 02:30:46 UTC; windows"
+ }
+ },
+ "R.utils": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "R.utils",
+ "Version": "2.12.2",
+ "Depends": "R (>= 2.14.0), R.oo",
+ "Imports": "methods, utils, tools, R.methodsS3",
+ "Suggests": "datasets, digest (>= 0.6.10)",
+ "Title": "Various Programming Utilities",
+ "Authors@R": "c(person(\"Henrik\", \"Bengtsson\", role=c(\"aut\", \"cre\", \"cph\"),\n email = \"henrikb@braju.com\"))",
+ "Author": "Henrik Bengtsson [aut, cre, cph]",
+ "Maintainer": "Henrik Bengtsson ",
+ "Description": "Utility functions useful when programming and developing R packages.",
+ "License": "LGPL (>= 2.1)",
+ "LazyLoad": "TRUE",
+ "URL": "https://henrikbengtsson.github.io/R.utils/,\nhttps://github.com/HenrikBengtsson/R.utils",
+ "BugReports": "https://github.com/HenrikBengtsson/R.utils/issues",
+ "NeedsCompilation": "no",
+ "Packaged": "2022-11-11 18:51:45 UTC; hb",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-11-11 22:00:03 UTC",
+ "Encoding": "UTF-8",
+ "Built": "R 4.3.0; ; 2023-04-25 06:24:08 UTC; windows"
+ }
+ },
+ "R6": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "R6",
+ "Title": "Encapsulated Classes with Reference Semantics",
+ "Version": "2.5.1",
+ "Authors@R": "person(\"Winston\", \"Chang\", role = c(\"aut\", \"cre\"), email = \"winston@stdout.org\")",
+ "Description": "Creates classes with reference semantics, similar to R's built-in\n reference classes. Compared to reference classes, R6 classes are simpler\n and lighter-weight, and they are not built on S4 classes so they do not\n require the methods package. These classes allow public and private\n members, and they support inheritance, even when the classes are defined in\n different packages.",
+ "Depends": "R (>= 3.0)",
+ "Suggests": "testthat, pryr",
+ "License": "MIT + file LICENSE",
+ "URL": "https://r6.r-lib.org, https://github.com/r-lib/R6/",
+ "BugReports": "https://github.com/r-lib/R6/issues",
+ "RoxygenNote": "7.1.1",
+ "NeedsCompilation": "no",
+ "Packaged": "2021-08-06 20:18:46 UTC; winston",
+ "Author": "Winston Chang [aut, cre]",
+ "Maintainer": "Winston Chang ",
+ "Repository": "RSPM",
+ "Date/Publication": "2021-08-19 14:00:05 UTC",
+ "Encoding": "UTF-8",
+ "Built": "R 4.3.0; ; 2024-01-23 01:47:13 UTC; windows"
+ }
+ },
+ "RColorBrewer": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "RColorBrewer",
+ "Version": "1.1-3",
+ "Date": "2022-04-03",
+ "Title": "ColorBrewer Palettes",
+ "Authors@R": "c(person(given = \"Erich\", family = \"Neuwirth\", role = c(\"aut\",\n \"cre\"), email = \"erich.neuwirth@univie.ac.at\"))",
+ "Author": "Erich Neuwirth [aut, cre]",
+ "Maintainer": "Erich Neuwirth ",
+ "Depends": "R (>= 2.0.0)",
+ "Description": "Provides color schemes for maps (and other graphics)\n designed by Cynthia Brewer as described at http://colorbrewer2.org.",
+ "License": "Apache License 2.0",
+ "Packaged": "2022-04-03 10:26:20 UTC; neuwirth",
+ "NeedsCompilation": "no",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-04-03 19:20:13 UTC",
+ "Encoding": "UTF-8",
+ "Built": "R 4.3.0; ; 2024-01-23 02:10:18 UTC; windows"
+ }
+ },
+ "RSQLite": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "RSQLite",
+ "Title": "SQLite Interface for R",
+ "Version": "2.3.2",
+ "Date": "2023-10-27",
+ "Authors@R": "c(\n person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = c(\"aut\", \"cre\"),\n comment = c(ORCID = \"0000-0002-1416-3412\")),\n person(\"Hadley\", \"Wickham\", role = \"aut\"),\n person(c(\"David\", \"A.\"), \"James\", role = \"aut\"),\n person(\"Seth\", \"Falcon\", role = \"aut\"),\n person(\"D. Richard\", \"Hipp\", role = \"ctb\",\n comment = \"for the included SQLite sources\"),\n person(\"Dan\", \"Kennedy\", role = \"ctb\",\n comment = \"for the included SQLite sources\"),\n person(\"Joe\", \"Mistachkin\", role = \"ctb\",\n comment = \"for the included SQLite sources\"),\n person(, \"SQLite Authors\", role = \"ctb\",\n comment = \"for the included SQLite sources\"),\n person(\"Liam\", \"Healy\", role = \"ctb\",\n comment = \"for the included SQLite sources\"),\n person(\"R Consortium\", role = \"fnd\"),\n person(, \"RStudio\", role = \"cph\")\n )",
+ "Description": "Embeds the SQLite database engine in R and provides an\n interface compliant with the DBI package. The source for the SQLite\n engine and for various extensions in a recent version is included.\n System libraries will never be consulted because this package relies\n on static linking for the plugins it includes; this also ensures a\n consistent experience across all installations.",
+ "License": "LGPL (>= 2.1)",
+ "URL": "https://rsqlite.r-dbi.org, https://github.com/r-dbi/RSQLite",
+ "BugReports": "https://github.com/r-dbi/RSQLite/issues",
+ "Depends": "R (>= 3.1.0)",
+ "Imports": "bit64, blob (>= 1.2.0), DBI (>= 1.1.0), memoise, methods,\npkgconfig",
+ "Suggests": "callr, DBItest (>= 1.7.2.9001), gert, gh, hms, knitr,\nmagrittr, rmarkdown, rvest, testthat (>= 3.0.0), withr, xml2",
+ "LinkingTo": "plogr (>= 0.2.0), cpp11 (>= 0.4.0)",
+ "VignetteBuilder": "knitr",
+ "Config/autostyle/scope": "line_breaks",
+ "Config/autostyle/strict": "false",
+ "Config/testthat/edition": "3",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "Collate": "'SQLiteConnection.R' 'SQLKeywords_SQLiteConnection.R'\n'SQLiteDriver.R' 'SQLite.R' 'SQLiteResult.R' 'coerce.R'\n'compatRowNames.R' 'copy.R' 'cpp11.R' 'datasetsDb.R'\n'dbAppendTable_SQLiteConnection.R' 'dbBeginTransaction.R'\n'dbBegin_SQLiteConnection.R' 'dbBind_SQLiteResult.R'\n'dbClearResult_SQLiteResult.R' 'dbColumnInfo_SQLiteResult.R'\n'dbCommit_SQLiteConnection.R' 'dbConnect_SQLiteConnection.R'\n'dbConnect_SQLiteDriver.R' 'dbDataType_SQLiteConnection.R'\n'dbDataType_SQLiteDriver.R' 'dbDisconnect_SQLiteConnection.R'\n'dbExistsTable_SQLiteConnection_character.R'\n'dbFetch_SQLiteResult.R' 'dbGetException_SQLiteConnection.R'\n'dbGetInfo_SQLiteConnection.R' 'dbGetInfo_SQLiteDriver.R'\n'dbGetPreparedQuery.R'\n'dbGetPreparedQuery_SQLiteConnection_character_data.frame.R'\n'dbGetRowCount_SQLiteResult.R'\n'dbGetRowsAffected_SQLiteResult.R'\n'dbGetStatement_SQLiteResult.R' 'dbHasCompleted_SQLiteResult.R'\n'dbIsValid_SQLiteConnection.R' 'dbIsValid_SQLiteDriver.R'\n'dbIsValid_SQLiteResult.R' 'dbListResults_SQLiteConnection.R'\n'dbListTables_SQLiteConnection.R'\n'dbQuoteIdentifier_SQLiteConnection_SQL.R'\n'dbQuoteIdentifier_SQLiteConnection_character.R'\n'dbReadTable_SQLiteConnection_character.R'\n'dbRemoveTable_SQLiteConnection_character.R'\n'dbRollback_SQLiteConnection.R' 'dbSendPreparedQuery.R'\n'dbSendPreparedQuery_SQLiteConnection_character_data.frame.R'\n'dbSendQuery_SQLiteConnection_character.R'\n'dbUnloadDriver_SQLiteDriver.R'\n'dbUnquoteIdentifier_SQLiteConnection_SQL.R'\n'dbWriteTable_SQLiteConnection_character_character.R'\n'dbWriteTable_SQLiteConnection_character_data.frame.R'\n'db_bind.R' 'deprecated.R' 'export.R' 'fetch_SQLiteResult.R'\n'initExtension.R' 'initRegExp.R'\n'isSQLKeyword_SQLiteConnection_character.R'\n'make.db.names_SQLiteConnection_character.R' 'names.R'\n'pkgconfig.R' 'show_SQLiteConnection.R'\n'sqlData_SQLiteConnection.R' 'table.R' 'transactions.R'\n'utils.R' 'version.R' 'zzz.R'",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-10-28 08:25:55 UTC; kirill",
+ "Author": "Kirill Müller [aut, cre] (),\n Hadley Wickham [aut],\n David A. James [aut],\n Seth Falcon [aut],\n D. Richard Hipp [ctb] (for the included SQLite sources),\n Dan Kennedy [ctb] (for the included SQLite sources),\n Joe Mistachkin [ctb] (for the included SQLite sources),\n SQLite Authors [ctb] (for the included SQLite sources),\n Liam Healy [ctb] (for the included SQLite sources),\n R Consortium [fnd],\n RStudio [cph]",
+ "Maintainer": "Kirill Müller ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-10-28 21:00:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-10-30 21:34:35 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "Rcpp": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "Rcpp",
+ "Title": "Seamless R and C++ Integration",
+ "Version": "1.0.11",
+ "Date": "2023-07-03",
+ "Author": "Dirk Eddelbuettel, Romain Francois, JJ Allaire, Kevin Ushey, Qiang Kou,\n Nathan Russell, Inaki Ucar, Douglas Bates and John Chambers",
+ "Maintainer": "Dirk Eddelbuettel ",
+ "Description": "The 'Rcpp' package provides R functions as well as C++ classes which\n offer a seamless integration of R and C++. Many R data types and objects can be\n mapped back and forth to C++ equivalents which facilitates both writing of new\n code as well as easier integration of third-party libraries. Documentation\n about 'Rcpp' is provided by several vignettes included in this package, via the\n 'Rcpp Gallery' site at , the paper by Eddelbuettel and\n Francois (2011, ), the book by Eddelbuettel (2013,\n ) and the paper by Eddelbuettel and Balamuta (2018,\n ); see 'citation(\"Rcpp\")' for details.",
+ "Imports": "methods, utils",
+ "Suggests": "tinytest, inline, rbenchmark, pkgKitten (>= 0.1.2)",
+ "URL": "https://www.rcpp.org,\nhttps://dirk.eddelbuettel.com/code/rcpp.html,\nhttps://github.com/RcppCore/Rcpp",
+ "License": "GPL (>= 2)",
+ "BugReports": "https://github.com/RcppCore/Rcpp/issues",
+ "MailingList": "rcpp-devel@lists.r-forge.r-project.org",
+ "RoxygenNote": "6.1.1",
+ "Encoding": "UTF-8",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-07-03 15:56:55 UTC; edd",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-07-06 07:33:14 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 01:12:00 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "anytime": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "anytime",
+ "Type": "Package",
+ "Title": "Anything to 'POSIXct' or 'Date' Converter",
+ "Version": "0.3.9",
+ "Date": "2020-08-26",
+ "Author": "Dirk Eddelbuettel",
+ "Maintainer": "Dirk Eddelbuettel ",
+ "Description": "Convert input in any one of character, integer, numeric, factor,\n or ordered type into 'POSIXct' (or 'Date') objects, using one of a number of\n predefined formats, and relying on Boost facilities for date and time parsing.",
+ "URL": "http://dirk.eddelbuettel.com/code/anytime.html",
+ "BugReports": "https://github.com/eddelbuettel/anytime/issues",
+ "License": "GPL (>= 2)",
+ "Encoding": "UTF-8",
+ "Depends": "R (>= 3.2.0)",
+ "Imports": "Rcpp (>= 0.12.9)",
+ "LinkingTo": "Rcpp (>= 0.12.9), BH",
+ "Suggests": "tinytest (>= 1.0.0), gettz",
+ "RoxygenNote": "6.0.1",
+ "NeedsCompilation": "yes",
+ "Packaged": "2020-08-26 17:46:45.898451 UTC; edd",
+ "Repository": "RSPM",
+ "Date/Publication": "2020-08-27 11:40:21 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 05:10:22 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "askpass": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "askpass",
+ "Type": "Package",
+ "Title": "Password Entry Utilities for R, Git, and SSH",
+ "Version": "1.2.0",
+ "Authors@R": "person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), \n email = \"jeroen@berkeley.edu\", comment = c(ORCID = \"0000-0002-4035-0289\"))",
+ "Description": "Cross-platform utilities for prompting the user for credentials or a \n passphrase, for example to authenticate with a server or read a protected key.\n Includes native programs for MacOS and Windows, hence no 'tcltk' is required. \n Password entry can be invoked in two different ways: directly from R via the \n askpass() function, or indirectly as password-entry back-end for 'ssh-agent' \n or 'git-credential' via the SSH_ASKPASS and GIT_ASKPASS environment variables.\n Thereby the user can be prompted for credentials or a passphrase if needed \n when R calls out to git or ssh.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://github.com/r-lib/askpass",
+ "BugReports": "https://github.com/r-lib/askpass/issues",
+ "Encoding": "UTF-8",
+ "Imports": "sys (>= 2.1)",
+ "RoxygenNote": "7.2.3",
+ "Suggests": "testthat",
+ "Language": "en-US",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-09-03 19:16:12 UTC; jeroen",
+ "Author": "Jeroen Ooms [aut, cre] ()",
+ "Maintainer": "Jeroen Ooms ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-09-03 20:00:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 01:33:49 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "attempt": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "attempt",
+ "Title": "Tools for Defensive Programming",
+ "Version": "0.3.1",
+ "Authors@R": "person(\"Colin\", \"Fay\", email = \"contact@colinfay.me\", role = c(\"aut\", \"cre\"), comment=c(ORCID=\"0000-0001-7343-1846\"))",
+ "Description": "Tools for defensive programming, inspired by 'purrr' mappers and \n based on 'rlang'.'attempt' extends and facilitates defensive programming by \n providing a consistent grammar, and provides a set of easy to use functions \n for common tests and conditions. 'attempt' only depends on 'rlang', and \n focuses on speed, so it can be easily integrated in other functions and \n used in data analysis. ",
+ "License": "MIT + file LICENSE",
+ "Encoding": "UTF-8",
+ "URL": "https://github.com/ColinFay/attempt",
+ "LazyData": "true",
+ "Suggests": "testthat, knitr, rmarkdown, curl",
+ "VignetteBuilder": "knitr",
+ "Imports": "rlang",
+ "RoxygenNote": "7.1.0",
+ "NeedsCompilation": "no",
+ "Packaged": "2020-05-03 20:24:38 UTC; colin",
+ "Author": "Colin Fay [aut, cre] ()",
+ "Maintainer": "Colin Fay ",
+ "Repository": "RSPM",
+ "Date/Publication": "2020-05-03 20:50:02 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 01:33:02 UTC; windows"
+ }
+ },
+ "backports": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "backports",
+ "Type": "Package",
+ "Title": "Reimplementations of Functions Introduced Since R-3.0.0",
+ "Version": "1.4.1",
+ "Authors@R": "c(\n person(\"Michel\", \"Lang\", NULL, \"michellang@gmail.com\",\n role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0001-9754-0393\")),\n person(\"R Core Team\", role = \"aut\"))",
+ "Maintainer": "Michel Lang ",
+ "Description": "\n Functions introduced or changed since R v3.0.0 are re-implemented in this\n package. The backports are conditionally exported in order to let R resolve\n the function name to either the implemented backport, or the respective base\n version, if available. Package developers can make use of new functions or\n arguments by selectively importing specific backports to\n support older installations.",
+ "URL": "https://github.com/r-lib/backports",
+ "BugReports": "https://github.com/r-lib/backports/issues",
+ "License": "GPL-2 | GPL-3",
+ "NeedsCompilation": "yes",
+ "ByteCompile": "yes",
+ "Depends": "R (>= 3.0.0)",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.1.2",
+ "Packaged": "2021-12-13 10:49:30 UTC; michel",
+ "Author": "Michel Lang [cre, aut] (),\n R Core Team [aut]",
+ "Repository": "RSPM",
+ "Date/Publication": "2021-12-13 11:30:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 01:49:27 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "base64enc": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "base64enc",
+ "Version": "0.1-3",
+ "Title": "Tools for base64 encoding",
+ "Author": "Simon Urbanek ",
+ "Maintainer": "Simon Urbanek ",
+ "Depends": "R (>= 2.9.0)",
+ "Enhances": "png",
+ "Description": "This package provides tools for handling base64 encoding. It is more flexible than the orphaned base64 package.",
+ "License": "GPL-2 | GPL-3",
+ "URL": "http://www.rforge.net/base64enc",
+ "NeedsCompilation": "yes",
+ "Packaged": "2015-02-04 20:31:00 UTC; svnuser",
+ "Repository": "RSPM",
+ "Date/Publication": "2015-07-28 08:03:37",
+ "Encoding": "UTF-8",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 03:54:22 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "billboarder": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "billboarder",
+ "Title": "Create Interactive Chart with the JavaScript 'Billboard' Library",
+ "Version": "0.4.1",
+ "Authors@R": "c(\n person(\"Victor\", \"Perrier\", email = \"victor.perrier@dreamrs.fr\", role = c(\"aut\", \"cre\")),\n person(\"Fanny\", \"Meyer\", role = \"aut\"),\n person(\"NAVER Corp\", role = \"cph\", comment = \"billboard.js library\"),\n person(\"Mike\", \"Bostock\", role = \"cph\", comment = \"d3.format library\"))",
+ "Description": "Provides an 'htmlwidgets' interface to 'billboard.js', \n a re-usable easy interface JavaScript chart library, based on D3 v4+.\n Chart types include line charts, scatterplots, bar/lollipop charts, histogram/density plots, pie/donut charts and gauge charts.\n All charts are interactive, and a proxy method is implemented to smoothly update a chart without rendering it again in 'shiny' apps. ",
+ "URL": "https://github.com/dreamRs/billboarder,\nhttps://dreamrs.github.io/billboarder/",
+ "BugReports": "https://github.com/dreamRs/billboarder/issues",
+ "Depends": "R (>= 3.1.0)",
+ "License": "MIT + file LICENSE",
+ "Encoding": "UTF-8",
+ "LazyData": "true",
+ "RoxygenNote": "7.2.3",
+ "Imports": "htmlwidgets, htmltools, magrittr, jsonlite, ggplot2, scales,\nshiny, rlang",
+ "Suggests": "RColorBrewer, testthat, knitr, rmarkdown, covr",
+ "VignetteBuilder": "knitr",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-09-29 13:40:27 UTC; perri",
+ "Author": "Victor Perrier [aut, cre],\n Fanny Meyer [aut],\n NAVER Corp [cph] (billboard.js library),\n Mike Bostock [cph] (d3.format library)",
+ "Maintainer": "Victor Perrier ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-09-29 14:02:38 UTC",
+ "Built": "R 4.3.0; ; 2023-10-02 11:58:03 UTC; windows"
+ }
+ },
+ "bit": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "bit",
+ "Type": "Package",
+ "Title": "Classes and Methods for Fast Memory-Efficient Boolean Selections",
+ "Version": "4.0.5",
+ "Date": "2022-11-13",
+ "Author": "Jens Oehlschlägel [aut, cre], Brian Ripley [ctb]",
+ "Maintainer": "Jens Oehlschlägel ",
+ "Depends": "R (>= 2.9.2)",
+ "Suggests": "testthat (>= 0.11.0), roxygen2, knitr, rmarkdown,\nmicrobenchmark, bit64 (>= 4.0.0), ff (>= 4.0.0)",
+ "Description": "Provided are classes for boolean and skewed boolean vectors,\n fast boolean methods, fast unique and non-unique integer sorting,\n fast set operations on sorted and unsorted sets of integers, and\n foundations for ff (range index, compression, chunked processing).",
+ "License": "GPL-2 | GPL-3",
+ "LazyLoad": "yes",
+ "ByteCompile": "yes",
+ "Encoding": "UTF-8",
+ "URL": "https://github.com/truecluster/bit",
+ "VignetteBuilder": "knitr, rmarkdown",
+ "RoxygenNote": "7.2.0",
+ "NeedsCompilation": "yes",
+ "Packaged": "2022-11-13 21:22:09 UTC; jo",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-11-15 21:20:16 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 01:31:47 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "bit64": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "bit64",
+ "Type": "Package",
+ "Title": "A S3 Class for Vectors of 64bit Integers",
+ "Version": "4.0.5",
+ "Date": "2020-08-29",
+ "Author": "Jens Oehlschlägel [aut, cre], Leonardo Silvestri [ctb]",
+ "Maintainer": "Jens Oehlschlägel ",
+ "Depends": "R (>= 3.0.1), bit (>= 4.0.0), utils, methods, stats",
+ "Description": "\n Package 'bit64' provides serializable S3 atomic 64bit (signed) integers. \n These are useful for handling database keys and exact counting in +-2^63.\n WARNING: do not use them as replacement for 32bit integers, integer64 are not\n supported for subscripting by R-core and they have different semantics when \n combined with double, e.g. integer64 + double => integer64. \n Class integer64 can be used in vectors, matrices, arrays and data.frames. \n Methods are available for coercion from and to logicals, integers, doubles, \n characters and factors as well as many elementwise and summary functions. \n Many fast algorithmic operations such as 'match' and 'order' support inter-\n active data exploration and manipulation and optionally leverage caching.",
+ "License": "GPL-2 | GPL-3",
+ "LazyLoad": "yes",
+ "ByteCompile": "yes",
+ "URL": "https://github.com/truecluster/bit64",
+ "Encoding": "UTF-8",
+ "Repository": "RSPM",
+ "Repository/R-Forge/Project": "ff",
+ "Repository/R-Forge/Revision": "177",
+ "Repository/R-Forge/DateTimeStamp": "2018-08-17 17:45:18",
+ "Date/Publication": "2020-08-30 07:20:02 UTC",
+ "NeedsCompilation": "yes",
+ "Packaged": "2020-08-29 10:56:45 UTC; jo",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 01:37:45 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "blob": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "blob",
+ "Title": "A Simple S3 Class for Representing Vectors of Binary Data\n('BLOBS')",
+ "Version": "1.2.4",
+ "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", role = \"aut\"),\n person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = \"cre\"),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "R's raw vector is useful for storing a single binary object.\n What if you want to put a vector of them in a data frame? The 'blob'\n package provides the blob object, a list of raw vectors, suitable for\n use as a column in data frame.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://blob.tidyverse.org, https://github.com/tidyverse/blob",
+ "BugReports": "https://github.com/tidyverse/blob/issues",
+ "Imports": "methods, rlang, vctrs (>= 0.2.1)",
+ "Suggests": "covr, crayon, pillar (>= 1.2.1), testthat",
+ "Config/autostyle/scope": "line_breaks",
+ "Config/autostyle/strict": "false",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-03-17 09:42:50 UTC; kirill",
+ "Author": "Hadley Wickham [aut],\n Kirill Müller [cre],\n RStudio [cph, fnd]",
+ "Maintainer": "Kirill Müller ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-03-17 12:00:06 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 06:39:52 UTC; windows"
+ }
+ },
+ "brew": {
+ "Source": "CRAN",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Type": "Package",
+ "Package": "brew",
+ "Title": "Templating Framework for Report Generation",
+ "Version": "1.0-8",
+ "Authors@R": "c(\n person(\"Jeffrey\", \"Horner\", role = c(\"aut\", \"cph\")),\n person(\"Greg\", \"Hunt\", , \"greg@firmansyah.com\", role = c(\"aut\", \"cre\", \"cph\"))\n )",
+ "Description": "Implements a templating framework for mixing text and R code\n for report generation. brew template syntax is similar to PHP, Ruby's\n erb module, Java Server Pages, and Python's psp module.",
+ "License": "GPL-2",
+ "URL": "https://github.com/gregfrog/brew",
+ "BugReports": "https://github.com/gregfrog/brew/issues",
+ "Suggests": "testthat (>= 3.0.0)",
+ "Config/testthat/edition": "3",
+ "Encoding": "UTF-8",
+ "Repository": "RSPM",
+ "NeedsCompilation": "no",
+ "Packaged": "2022-09-28 07:04:26 UTC; greg",
+ "Author": "Jeffrey Horner [aut, cph],\n Greg Hunt [aut, cre, cph]",
+ "Maintainer": "Greg Hunt ",
+ "Date/Publication": "2022-09-29 08:10:18 UTC",
+ "Built": "R 4.3.0; ; 2023-07-07 22:21:39 UTC; windows"
+ }
+ },
+ "brio": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "brio",
+ "Title": "Basic R Input Output",
+ "Version": "1.1.3",
+ "Authors@R": "c(\n person(\"Jim\", \"Hester\", role = \"aut\",\n comment = c(ORCID = \"0000-0002-2739-7082\")),\n person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "Functions to handle basic input output, these functions\n always read and write UTF-8 (8-bit Unicode Transformation Format)\n files and provide more explicit control over line endings.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://brio.r-lib.org, https://github.com/r-lib/brio",
+ "BugReports": "https://github.com/r-lib/brio/issues",
+ "Suggests": "covr, testthat (>= 2.1.0)",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.1.2",
+ "NeedsCompilation": "yes",
+ "Packaged": "2021-11-29 23:19:46 UTC; jhester",
+ "Author": "Jim Hester [aut] (),\n Gábor Csárdi [aut, cre],\n RStudio [cph, fnd]",
+ "Maintainer": "Gábor Csárdi ",
+ "Repository": "RSPM",
+ "Date/Publication": "2021-11-30 13:10:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-04-25 02:26:26 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "bslib": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "bslib",
+ "Title": "Custom 'Bootstrap' 'Sass' Themes for 'shiny' and 'rmarkdown'",
+ "Version": "0.5.1",
+ "Authors@R": "c(\n person(\"Carson\", \"Sievert\", role = c(\"aut\", \"cre\"), email = \"carson@posit.co\", comment = c(ORCID = \"0000-0002-4958-2844\")),\n person(\"Joe\", \"Cheng\", role = \"aut\", email = \"joe@posit.co\"),\n person(\"Garrick\", \"Aden-Buie\", role = \"aut\", email = \"garrick@posit.co\", comment = c(ORCID = \"0000-0002-7111-0077\")),\n person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")),\n person(family = \"Bootstrap contributors\", role = \"ctb\",\n comment = \"Bootstrap library\"),\n person(family = \"Twitter, Inc\", role = \"cph\",\n comment = \"Bootstrap library\"),\n person(\"Javi\", \"Aguilar\", role = c(\"ctb\", \"cph\"),\n comment = \"Bootstrap colorpicker library\"),\n person(\"Thomas\", \"Park\", role = c(\"ctb\", \"cph\"),\n comment = \"Bootswatch library\"),\n person(family = \"PayPal\", role = c(\"ctb\", \"cph\"),\n comment = \"Bootstrap accessibility plugin\")\n )",
+ "Description": "Simplifies custom 'CSS' styling of both 'shiny' and\n 'rmarkdown' via 'Bootstrap' 'Sass'. Supports 'Bootstrap' 3, 4 and 5 as\n well as their various 'Bootswatch' themes. An interactive widget is\n also provided for previewing themes in real time.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://rstudio.github.io/bslib/, https://github.com/rstudio/bslib",
+ "BugReports": "https://github.com/rstudio/bslib/issues",
+ "Depends": "R (>= 2.10)",
+ "Imports": "base64enc, cachem, grDevices, htmltools (>= 0.5.4), jquerylib\n(>= 0.1.3), jsonlite, memoise (>= 2.0.1), mime, rlang, sass (>=\n0.4.0)",
+ "Suggests": "bsicons, curl, fontawesome, ggplot2, knitr, magrittr,\nrappdirs, rmarkdown (>= 2.7), shiny (>= 1.6.0), testthat,\nthematic, withr",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "Collate": "'accordion.R' 'breakpoints.R' 'bs-current-theme.R'\n'bs-dependencies.R' 'bs-global.R' 'bs-remove.R'\n'bs-theme-layers.R' 'bs-theme-preset-bootswatch.R'\n'bs-theme-preset-builtin.R' 'bs-theme-preset.R' 'utils.R'\n'bs-theme-preview.R' 'bs-theme-update.R' 'bs-theme.R'\n'bslib-package.R' 'card.R' 'deprecated.R' 'files.R' 'fill.R'\n'imports.R' 'input-switch.R' 'layout.R' 'nav-items.R'\n'nav-update.R' 'navs-legacy.R' 'navs.R' 'onLoad.R' 'page.R'\n'popover.R' 'precompiled.R' 'print.R' 'shiny-devmode.R'\n'sidebar.R' 'staticimports.R' 'tooltip.R' 'utils-deps.R'\n'utils-shiny.R' 'utils-tags.R' 'value-box.R'\n'version-default.R' 'versions.R'",
+ "Config/testthat/edition": "3",
+ "Config/Needs/routine": "chromote, desc, renv",
+ "Config/Needs/website": "brio, crosstalk, dplyr, DT, ggplot2, glue,\nhtmlwidgets, leaflet, lorem, palmerpenguins, plotly, purrr,\nrprojroot, rstudio/htmltools, scales, stringr, tidyr, webshot2",
+ "Config/Needs/deploy": "BH, cpp11, dplyr, DT, ggplot2, ggridges, gt,\nhexbin, histoslider, lattice, leaflet, lubridate, modelr,\nnycflights13, plotly, reactable, reshape2, rprojroot,\nrsconnect, scales",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-08-11 15:31:21 UTC; cpsievert",
+ "Author": "Carson Sievert [aut, cre] (),\n Joe Cheng [aut],\n Garrick Aden-Buie [aut] (),\n Posit Software, PBC [cph, fnd],\n Bootstrap contributors [ctb] (Bootstrap library),\n Twitter, Inc [cph] (Bootstrap library),\n Javi Aguilar [ctb, cph] (Bootstrap colorpicker library),\n Thomas Park [ctb, cph] (Bootswatch library),\n PayPal [ctb, cph] (Bootstrap accessibility plugin)",
+ "Maintainer": "Carson Sievert ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-08-11 16:53:52 UTC",
+ "Built": "R 4.3.0; ; 2023-10-12 11:36:59 UTC; windows"
+ }
+ },
+ "cachem": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "cachem",
+ "Version": "1.0.8",
+ "Title": "Cache R Objects with Automatic Pruning",
+ "Description": "Key-value stores with automatic pruning. Caches can limit\n either their total size or the age of the oldest object (or both),\n automatically pruning objects to maintain the constraints.",
+ "Authors@R": "c(\n person(\"Winston\", \"Chang\", , \"winston@rstudio.com\", c(\"aut\", \"cre\")),\n person(family = \"RStudio\", role = c(\"cph\", \"fnd\")))",
+ "License": "MIT + file LICENSE",
+ "Encoding": "UTF-8",
+ "ByteCompile": "true",
+ "URL": "https://cachem.r-lib.org/, https://github.com/r-lib/cachem",
+ "Imports": "rlang, fastmap (>= 1.1.1)",
+ "Suggests": "testthat",
+ "RoxygenNote": "7.2.3",
+ "Config/Needs/routine": "lobstr",
+ "Config/Needs/website": "pkgdown",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-05-01 15:38:38 UTC; winston",
+ "Author": "Winston Chang [aut, cre],\n RStudio [cph, fnd]",
+ "Maintainer": "Winston Chang ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-05-01 16:40:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 02:32:03 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "callr": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "callr",
+ "Title": "Call R from R",
+ "Version": "3.7.3",
+ "Authors@R": "c(\n person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\", \"cph\"),\n comment = c(ORCID = \"0000-0001-7098-9676\")),\n person(\"Winston\", \"Chang\", role = \"aut\"),\n person(\"RStudio\", role = c(\"cph\", \"fnd\")),\n person(\"Mango Solutions\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "It is sometimes useful to perform a computation in a separate\n R process, without affecting the current R process at all. This\n packages does exactly that.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://callr.r-lib.org, https://github.com/r-lib/callr#readme",
+ "BugReports": "https://github.com/r-lib/callr/issues",
+ "Depends": "R (>= 3.4)",
+ "Imports": "processx (>= 3.6.1), R6, utils",
+ "Suggests": "asciicast, cli (>= 1.1.0), covr, mockery, ps, rprojroot,\nspelling, testthat (>= 3.0.0), withr (>= 2.3.0)",
+ "Encoding": "UTF-8",
+ "Language": "en-US",
+ "RoxygenNote": "7.2.1.9000",
+ "Config/testthat/edition": "3",
+ "Config/Needs/website": "r-lib/asciicast, glue, htmlwidgets, igraph,\ntibble, tidyverse/tidytemplate",
+ "NeedsCompilation": "no",
+ "Packaged": "2022-11-02 15:17:20 UTC; gaborcsardi",
+ "Author": "Gábor Csárdi [aut, cre, cph] (),\n Winston Chang [aut],\n RStudio [cph, fnd],\n Mango Solutions [cph, fnd]",
+ "Maintainer": "Gábor Csárdi ",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-11-02 16:40:11 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 03:50:22 UTC; windows"
+ }
+ },
+ "cellranger": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "cellranger",
+ "Title": "Translate Spreadsheet Cell Ranges to Rows and Columns",
+ "Version": "1.1.0",
+ "Authors@R": "c(\n person(\"Jennifer\", \"Bryan\", , \"jenny@stat.ubc.ca\", c(\"cre\", \"aut\")),\n person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", \"ctb\")\n )",
+ "Description": "Helper functions to work with spreadsheets and the \"A1:D10\" style\n of cell range specification.",
+ "Depends": "R (>= 3.0.0)",
+ "License": "MIT + file LICENSE",
+ "LazyData": "true",
+ "URL": "https://github.com/rsheets/cellranger",
+ "BugReports": "https://github.com/rsheets/cellranger/issues",
+ "Suggests": "covr, testthat (>= 1.0.0), knitr, rmarkdown",
+ "RoxygenNote": "5.0.1.9000",
+ "VignetteBuilder": "knitr",
+ "Imports": "rematch, tibble",
+ "NeedsCompilation": "no",
+ "Packaged": "2016-07-26 06:50:00 UTC; jenny",
+ "Author": "Jennifer Bryan [cre, aut],\n Hadley Wickham [ctb]",
+ "Maintainer": "Jennifer Bryan ",
+ "Repository": "RSPM",
+ "Date/Publication": "2016-07-27 03:17:48",
+ "Encoding": "UTF-8",
+ "Built": "R 4.3.0; ; 2024-01-23 07:12:10 UTC; windows"
+ }
+ },
+ "checkmate": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "checkmate",
+ "Type": "Package",
+ "Title": "Fast and Versatile Argument Checks",
+ "Description": "Tests and assertions to perform frequent argument checks. A\n substantial part of the package was written in C to minimize any worries\n about execution time overhead.",
+ "Version": "2.3.0",
+ "Authors@R": "c(\n person(\"Michel\", \"Lang\", NULL, \"michellang@gmail.com\",\n role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0001-9754-0393\")),\n person(\"Bernd\", \"Bischl\", NULL, \"bernd_bischl@gmx.net\", role = \"ctb\"),\n person(\"Dénes\", \"Tóth\", NULL, \"toth.denes@kogentum.hu\", role = \"ctb\",\n comment = c(ORCID = \"0000-0003-4262-3217\"))\n )",
+ "URL": "https://mllg.github.io/checkmate/,\nhttps://github.com/mllg/checkmate",
+ "URLNote": "https://github.com/mllg/checkmate",
+ "BugReports": "https://github.com/mllg/checkmate/issues",
+ "NeedsCompilation": "yes",
+ "ByteCompile": "yes",
+ "Encoding": "UTF-8",
+ "Depends": "R (>= 3.0.0)",
+ "Imports": "backports (>= 1.1.0), utils",
+ "Suggests": "R6, fastmatch, data.table (>= 1.9.8), devtools, ggplot2,\nknitr, magrittr, microbenchmark, rmarkdown, testthat (>=\n3.0.4), tinytest (>= 1.1.0), tibble",
+ "License": "BSD_3_clause + file LICENSE",
+ "VignetteBuilder": "knitr",
+ "RoxygenNote": "7.2.3",
+ "Collate": "'AssertCollection.R' 'allMissing.R' 'anyInfinite.R'\n'anyMissing.R' 'anyNaN.R' 'asInteger.R' 'assert.R' 'helper.R'\n'makeExpectation.R' 'makeTest.R' 'makeAssertion.R'\n'checkAccess.R' 'checkArray.R' 'checkAtomic.R'\n'checkAtomicVector.R' 'checkCharacter.R' 'checkChoice.R'\n'checkClass.R' 'checkComplex.R' 'checkCount.R'\n'checkDataFrame.R' 'checkDataTable.R' 'checkDate.R'\n'checkDirectoryExists.R' 'checkDisjunct.R' 'checkDouble.R'\n'checkEnvironment.R' 'checkFALSE.R' 'checkFactor.R'\n'checkFileExists.R' 'checkFlag.R' 'checkFormula.R'\n'checkFunction.R' 'checkInt.R' 'checkInteger.R'\n'checkIntegerish.R' 'checkList.R' 'checkLogical.R'\n'checkMatrix.R' 'checkMultiClass.R' 'checkNamed.R'\n'checkNames.R' 'checkNull.R' 'checkNumber.R' 'checkNumeric.R'\n'checkOS.R' 'checkPOSIXct.R' 'checkPathForOutput.R'\n'checkPermutation.R' 'checkR6.R' 'checkRaw.R' 'checkScalar.R'\n'checkScalarNA.R' 'checkSetEqual.R' 'checkString.R'\n'checkSubset.R' 'checkTRUE.R' 'checkTibble.R' 'checkVector.R'\n'coalesce.R' 'isIntegerish.R' 'matchArg.R' 'qassert.R'\n'qassertr.R' 'vname.R' 'wfwl.R' 'zzz.R'",
+ "Packaged": "2023-10-25 10:38:55 UTC; michel",
+ "Author": "Michel Lang [cre, aut] (),\n Bernd Bischl [ctb],\n Dénes Tóth [ctb] ()",
+ "Maintainer": "Michel Lang ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-10-25 13:20:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-10-26 11:37:54 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "chromote": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "chromote",
+ "Title": "Headless Chrome Web Browser Interface",
+ "Version": "0.1.2",
+ "Authors@R": "c(\n person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = c(\"aut\", \"cre\")),\n person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\",\n comment = c(ORCID = \"0000-0001-9986-114X\")),\n person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "An implementation of the 'Chrome DevTools Protocol', for\n controlling a headless Chrome web browser.",
+ "License": "GPL-2",
+ "URL": "https://rstudio.github.io/chromote/,\nhttps://github.com/rstudio/chromote",
+ "BugReports": "https://github.com/rstudio/chromote/issues",
+ "Imports": "curl, fastmap, jsonlite, later (>= 1.1.0), magrittr, processx,\npromises (>= 1.1.1), R6, rlang, websocket (>= 1.2.0)",
+ "Suggests": "showimage, testthat (>= 3.0.0)",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "Config/testthat/edition": "3",
+ "Encoding": "UTF-8",
+ "Language": "en-US",
+ "RoxygenNote": "7.2.3",
+ "SystemRequirements": "Google Chrome or other Chromium-based browser.\nchromium: chromium (rpm) or chromium-browser (deb)",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-08-11 20:25:41 UTC; garrick",
+ "Author": "Winston Chang [aut, cre],\n Barret Schloerke [aut] (),\n Posit Software, PBC [cph, fnd]",
+ "Maintainer": "Winston Chang ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-08-11 21:43:51 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 04:50:29 UTC; windows"
+ }
+ },
+ "cli": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "cli",
+ "Title": "Helpers for Developing Command Line Interfaces",
+ "Version": "3.6.1",
+ "Authors@R": "c(\n person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")),\n person(\"Hadley\", \"Wickham\", role = \"ctb\"),\n person(\"Kirill\", \"Müller\", role = \"ctb\"),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "A suite of tools to build attractive command line interfaces\n ('CLIs'), from semantic elements: headings, lists, alerts, paragraphs,\n etc. Supports custom themes via a 'CSS'-like language. It also\n contains a number of lower level 'CLI' elements: rules, boxes, trees,\n and 'Unicode' symbols with 'ASCII' alternatives. It support ANSI\n colors and text styles as well.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://cli.r-lib.org, https://github.com/r-lib/cli#readme",
+ "BugReports": "https://github.com/r-lib/cli/issues",
+ "Depends": "R (>= 3.4)",
+ "Imports": "utils",
+ "Suggests": "callr, covr, crayon, digest, glue (>= 1.6.0), grDevices,\nhtmltools, htmlwidgets, knitr, methods, mockery, processx, ps\n(>= 1.3.4.9000), rlang (>= 1.0.2.9003), rmarkdown, rprojroot,\nrstudioapi, testthat, tibble, whoami, withr",
+ "Config/Needs/website": "r-lib/asciicast, bench, brio, cpp11, decor, desc,\nfansi, prettyunits, sessioninfo, tidyverse/tidytemplate,\nusethis, vctrs",
+ "Config/testthat/edition": "3",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.1.9000",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-03-22 13:59:32 UTC; gaborcsardi",
+ "Author": "Gábor Csárdi [aut, cre],\n Hadley Wickham [ctb],\n Kirill Müller [ctb],\n RStudio [cph, fnd]",
+ "Maintainer": "Gábor Csárdi ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-03-23 12:52:05 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-04-25 02:06:14 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "clipr": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Type": "Package",
+ "Package": "clipr",
+ "Title": "Read and Write from the System Clipboard",
+ "Version": "0.8.0",
+ "Authors@R": "c(\n person(\"Matthew\", \"Lincoln\", , \"matthew.d.lincoln@gmail.com\", role = c(\"aut\", \"cre\"),\n comment = c(ORCID = \"0000-0002-4387-3384\")),\n person(\"Louis\", \"Maddox\", role = \"ctb\"),\n person(\"Steve\", \"Simpson\", role = \"ctb\"),\n person(\"Jennifer\", \"Bryan\", role = \"ctb\")\n )",
+ "Description": "Simple utility functions to read from and write to\n the Windows, OS X, and X11 clipboards.",
+ "License": "GPL-3",
+ "URL": "https://github.com/mdlincoln/clipr,\nhttp://matthewlincoln.net/clipr/",
+ "BugReports": "https://github.com/mdlincoln/clipr/issues",
+ "Imports": "utils",
+ "Suggests": "covr, knitr, rmarkdown, rstudioapi (>= 0.5), testthat (>=\n2.0.0)",
+ "VignetteBuilder": "knitr",
+ "Encoding": "UTF-8",
+ "Language": "en-US",
+ "RoxygenNote": "7.1.2",
+ "SystemRequirements": "xclip (https://github.com/astrand/xclip) or xsel\n(http://www.vergenet.net/~conrad/software/xsel/) for accessing\nthe X11 clipboard, or wl-clipboard\n(https://github.com/bugaevc/wl-clipboard) for systems using\nWayland.",
+ "NeedsCompilation": "no",
+ "Packaged": "2022-02-19 02:20:21 UTC; mlincoln",
+ "Author": "Matthew Lincoln [aut, cre] (),\n Louis Maddox [ctb],\n Steve Simpson [ctb],\n Jennifer Bryan [ctb]",
+ "Maintainer": "Matthew Lincoln ",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-02-22 00:58:45 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 01:35:19 UTC; windows"
+ }
+ },
+ "codetools": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "codetools",
+ "Version": "0.2-19",
+ "Priority": "recommended",
+ "Author": "Luke Tierney ",
+ "Description": "Code analysis tools for R.",
+ "Title": "Code Analysis Tools for R",
+ "Depends": "R (>= 2.1)",
+ "Maintainer": "Luke Tierney ",
+ "URL": "https://gitlab.com/luke-tierney/codetools",
+ "License": "GPL",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-01-31 19:16:51 UTC; luke",
+ "Repository": "CRAN",
+ "Date/Publication": "2023-02-01 13:21:59 UTC",
+ "Built": "R 4.3.3; ; 2024-02-29 11:15:05 UTC; windows"
+ }
+ },
+ "colorspace": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "colorspace",
+ "Version": "2.1-0",
+ "Date": "2023-01-23",
+ "Title": "A Toolbox for Manipulating and Assessing Colors and Palettes",
+ "Authors@R": "c(person(given = \"Ross\", family = \"Ihaka\", role = \"aut\", email = \"ihaka@stat.auckland.ac.nz\"),\n person(given = \"Paul\", family = \"Murrell\", role = \"aut\", email = \"paul@stat.auckland.ac.nz\",\n comment = c(ORCID = \"0000-0002-3224-8858\")),\n person(given = \"Kurt\", family = \"Hornik\", role = \"aut\", email = \"Kurt.Hornik@R-project.org\",\n\t\t comment = c(ORCID = \"0000-0003-4198-9911\")),\n person(given = c(\"Jason\", \"C.\"), family = \"Fisher\", role = \"aut\", email = \"jfisher@usgs.gov\",\n comment = c(ORCID = \"0000-0001-9032-8912\")),\n person(given = \"Reto\", family = \"Stauffer\", role = \"aut\", email = \"Reto.Stauffer@uibk.ac.at\",\n comment = c(ORCID = \"0000-0002-3798-5507\")),\n person(given = c(\"Claus\", \"O.\"), family = \"Wilke\", role = \"aut\", email = \"wilke@austin.utexas.edu\",\n comment = c(ORCID = \"0000-0002-7470-9261\")),\n person(given = c(\"Claire\", \"D.\"), family = \"McWhite\", role = \"aut\", email = \"claire.mcwhite@utmail.utexas.edu\",\n comment = c(ORCID = \"0000-0001-7346-3047\")),\n person(given = \"Achim\", family = \"Zeileis\", role = c(\"aut\", \"cre\"), email = \"Achim.Zeileis@R-project.org\",\n comment = c(ORCID = \"0000-0003-0918-3766\")))",
+ "Description": "Carries out mapping between assorted color spaces including RGB, HSV, HLS,\n CIEXYZ, CIELUV, HCL (polar CIELUV), CIELAB, and polar CIELAB.\n\t Qualitative, sequential, and diverging color palettes based on HCL colors\n\t are provided along with corresponding ggplot2 color scales.\n\t Color palette choice is aided by an interactive app (with either a Tcl/Tk\n\t or a shiny graphical user interface) and shiny apps with an HCL color picker and a\n\t color vision deficiency emulator. Plotting functions for displaying\n\t and assessing palettes include color swatches, visualizations of the\n\t HCL space, and trajectories in HCL and/or RGB spectrum. Color manipulation\n\t functions include: desaturation, lightening/darkening, mixing, and\n\t simulation of color vision deficiencies (deutanomaly, protanomaly, tritanomaly).\n\t Details can be found on the project web page at \n\t and in the accompanying scientific paper: Zeileis et al. (2020, Journal of Statistical\n\t Software, ).",
+ "Depends": "R (>= 3.0.0), methods",
+ "Imports": "graphics, grDevices, stats",
+ "Suggests": "datasets, utils, KernSmooth, MASS, kernlab, mvtnorm, vcd,\ntcltk, shiny, shinyjs, ggplot2, dplyr, scales, grid, png, jpeg,\nknitr, rmarkdown, RColorBrewer, rcartocolor, scico, viridis,\nwesanderson",
+ "VignetteBuilder": "knitr",
+ "License": "BSD_3_clause + file LICENSE",
+ "URL": "https://colorspace.R-Forge.R-project.org/, https://hclwizard.org/",
+ "BugReports": "https://colorspace.R-Forge.R-project.org/contact.html",
+ "LazyData": "yes",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-01-23 08:50:11 UTC; zeileis",
+ "Author": "Ross Ihaka [aut],\n Paul Murrell [aut] (),\n Kurt Hornik [aut] (),\n Jason C. Fisher [aut] (),\n Reto Stauffer [aut] (),\n Claus O. Wilke [aut] (),\n Claire D. McWhite [aut] (),\n Achim Zeileis [aut, cre] ()",
+ "Maintainer": "Achim Zeileis ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-01-23 11:40:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 01:38:26 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "commonmark": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "commonmark",
+ "Type": "Package",
+ "Title": "High Performance CommonMark and Github Markdown Rendering in R",
+ "Version": "1.9.0",
+ "Authors@R": "c(\n person(\"Jeroen\", \"Ooms\", ,\"jeroen@berkeley.edu\", role = c(\"aut\", \"cre\"),\n comment = c(ORCID = \"0000-0002-4035-0289\")),\n person(\"John MacFarlane\", role = \"cph\", comment = \"Author of cmark\"))",
+ "URL": "https://docs.ropensci.org/commonmark/\nhttps://r-lib.r-universe.dev/commonmark\nhttps://github.github.com/gfm/ (spec)",
+ "BugReports": "https://github.com/r-lib/commonmark/issues",
+ "Description": "The CommonMark specification defines a rationalized version of markdown\n syntax. This package uses the 'cmark' reference implementation for converting\n markdown text into various formats including html, latex and groff man. In\n addition it exposes the markdown parse tree in xml format. Also includes opt-in\n support for GFM extensions including tables, autolinks, and strikethrough text.",
+ "License": "BSD_2_clause + file LICENSE",
+ "Suggests": "curl, testthat, xml2",
+ "RoxygenNote": "7.2.3",
+ "Language": "en-US",
+ "Encoding": "UTF-8",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-03-17 18:02:44 UTC; jeroen",
+ "Author": "Jeroen Ooms [aut, cre] (),\n John MacFarlane [cph] (Author of cmark)",
+ "Maintainer": "Jeroen Ooms ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-03-17 18:40:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 01:25:46 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "config": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "config",
+ "Type": "Package",
+ "Title": "Manage Environment Specific Configuration Values",
+ "Version": "0.3.2",
+ "Authors@R": "c(\n person(\"JJ\", \"Allaire\", role = c(\"aut\"), email = \"jj@rstudio.com\"),\n person(\"Andrie\", \"de Vries\", role = \"cre\", email = \"apdevries@gmail.com\"),\n person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"))\n )",
+ "Imports": "yaml (>= 2.1.19)",
+ "Suggests": "testthat, knitr, rmarkdown, covr, spelling, withr",
+ "Description": "Manage configuration values across multiple environments (e.g.\n development, test, production). Read values using a function that determines\n the current environment and returns the appropriate value.",
+ "License": "GPL-3",
+ "URL": "https://rstudio.github.io/config/,\nhttps://github.com/rstudio/config",
+ "BugReports": "https://github.com/rstudio/config/issues",
+ "RoxygenNote": "7.2.3",
+ "VignetteBuilder": "knitr",
+ "Encoding": "UTF-8",
+ "Language": "en-US",
+ "Config/testthat/edition": "3",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-08-30 09:28:23 UTC; apdev",
+ "Author": "JJ Allaire [aut],\n Andrie de Vries [cre],\n Posit Software, PBC [cph, fnd]",
+ "Maintainer": "Andrie de Vries ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-08-30 16:50:36 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 01:41:43 UTC; windows"
+ }
+ },
+ "covr": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Encoding": "UTF-8",
+ "Package": "covr",
+ "Title": "Test Coverage for Packages",
+ "Version": "3.6.3",
+ "Authors@R": "c(\n person(\"Jim\", \"Hester\", email = \"james.f.hester@gmail.com\", role = c(\"aut\", \"cre\")),\n person(\"Willem\", \"Ligtenberg\", role = \"ctb\"),\n person(\"Kirill\", \"Müller\", role = \"ctb\"),\n person(\"Henrik\", \"Bengtsson\", role = \"ctb\"),\n person(\"Steve\", \"Peak\", role = \"ctb\"),\n person(\"Kirill\", \"Sevastyanenko\", role = \"ctb\"),\n person(\"Jon\", \"Clayden\", role = \"ctb\"),\n person(\"Robert\", \"Flight\", role = \"ctb\"),\n person(\"Eric\", \"Brown\", role = \"ctb\"),\n person(\"Brodie\", \"Gaslam\", role = \"ctb\"),\n person(\"Will\", \"Beasley\", role = \"ctb\"),\n person(\"Robert\", \"Krzyzanowski\", role = \"ctb\"),\n person(\"Markus\", \"Wamser\", role = \"ctb\"),\n person(\"Karl\", \"Forner\", role = \"ctb\"),\n person(\"Gergely\", \"Daróczi\", role = \"ctb\"),\n person(\"Jouni\", \"Helske\", role = \"ctb\"),\n person(\"Kun\", \"Ren\", role = \"ctb\"),\n person(\"Jeroen\", \"Ooms\", role = \"ctb\"),\n person(\"Ken\", \"Williams\", role = \"ctb\"),\n person(\"Chris\", \"Campbell\", role = \"ctb\"),\n person(\"David\", \"Hugh-Jones\", role = \"ctb\"),\n person(\"Qin\", \"Wang\", role = \"ctb\"),\n person(\"Doug\", \"Kelkhoff\", role = \"ctb\"),\n person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\"),\n person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"),\n person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"),\n person(family = \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"),\n person(family = \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\")\n )",
+ "Description": "Track and report code coverage for your package and (optionally)\n upload the results to a coverage service like 'Codecov' or\n 'Coveralls' . Code coverage is a measure of the amount of\n code being exercised by a set of tests. It is an indirect measure of test\n quality and completeness. This package is compatible with any testing\n methodology or framework and tracks coverage of both R code and compiled\n C/C++/FORTRAN code.",
+ "URL": "https://covr.r-lib.org, https://github.com/r-lib/covr",
+ "BugReports": "https://github.com/r-lib/covr/issues",
+ "Depends": "R (>= 3.1.0), methods",
+ "Imports": "digest, stats, utils, jsonlite, rex, httr, crayon, withr (>=\n1.0.2), yaml",
+ "Suggests": "R6, curl, knitr, rmarkdown, htmltools, DT (>= 0.2), testthat,\nrlang, rstudioapi (>= 0.2), xml2 (>= 1.0.0), parallel, memoise,\nmockery, covr",
+ "License": "MIT + file LICENSE",
+ "VignetteBuilder": "knitr",
+ "RoxygenNote": "7.2.3",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-10-10 15:11:25 UTC; jimhester",
+ "Author": "Jim Hester [aut, cre],\n Willem Ligtenberg [ctb],\n Kirill Müller [ctb],\n Henrik Bengtsson [ctb],\n Steve Peak [ctb],\n Kirill Sevastyanenko [ctb],\n Jon Clayden [ctb],\n Robert Flight [ctb],\n Eric Brown [ctb],\n Brodie Gaslam [ctb],\n Will Beasley [ctb],\n Robert Krzyzanowski [ctb],\n Markus Wamser [ctb],\n Karl Forner [ctb],\n Gergely Daróczi [ctb],\n Jouni Helske [ctb],\n Kun Ren [ctb],\n Jeroen Ooms [ctb],\n Ken Williams [ctb],\n Chris Campbell [ctb],\n David Hugh-Jones [ctb],\n Qin Wang [ctb],\n Doug Kelkhoff [ctb],\n Ivan Sagalaev [ctb, cph] (highlight.js library),\n Mark Otto [ctb] (Bootstrap library),\n Jacob Thornton [ctb] (Bootstrap library),\n Bootstrap contributors [ctb] (Bootstrap library),\n Twitter, Inc [cph] (Bootstrap library)",
+ "Maintainer": "Jim Hester ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-10-11 00:40:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-10-12 11:45:46 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "cowplot": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "cowplot",
+ "Title": "Streamlined Plot Theme and Plot Annotations for 'ggplot2'",
+ "Version": "1.1.1",
+ "Authors@R": "\n person(\n given = \"Claus O.\",\n family = \"Wilke\",\n role = c(\"aut\", \"cre\"),\n email = \"wilke@austin.utexas.edu\",\n comment = c(ORCID = \"0000-0002-7470-9261\")\n )",
+ "Description": "\n Provides various features that help with creating publication-quality figures\n with 'ggplot2', such as a set of themes, functions to align plots and arrange\n them into complex compound figures, and functions that make it easy to annotate\n plots and or mix plots with images. The package was originally written for\n internal use in the Wilke lab, hence the name (Claus O. Wilke's plot package).\n It has also been used extensively in the book Fundamentals of Data\n Visualization.",
+ "URL": "https://wilkelab.org/cowplot/",
+ "BugReports": "https://github.com/wilkelab/cowplot/issues",
+ "Depends": "R (>= 3.5.0)",
+ "Imports": "ggplot2 (> 2.2.1), grid, gtable, grDevices, methods, rlang,\nscales",
+ "License": "GPL-2",
+ "LazyData": "true",
+ "Suggests": "Cairo, covr, dplyr, forcats, gridGraphics (>= 0.4-0), knitr,\nlattice, magick, maps, PASWR, patchwork, rmarkdown, ragg,\ntestthat (>= 1.0.0), tidyr, vdiffr (>= 0.3.0), VennDiagram",
+ "VignetteBuilder": "knitr",
+ "Collate": "'add_sub.R' 'align_plots.R' 'as_grob.R' 'as_gtable.R'\n'axis_canvas.R' 'cowplot.R' 'draw.R' 'get_plot_component.R'\n'get_axes.R' 'get_titles.R' 'get_legend.R' 'get_panel.R'\n'gtable.R' 'key_glyph.R' 'plot_grid.R' 'save.R'\n'set_null_device.R' 'setup.R' 'stamp.R' 'themes.R'\n'utils_ggplot2.R'",
+ "RoxygenNote": "7.1.1",
+ "Encoding": "UTF-8",
+ "NeedsCompilation": "no",
+ "Packaged": "2020-12-15 18:32:06 UTC; clauswilke",
+ "Author": "Claus O. Wilke [aut, cre] ()",
+ "Maintainer": "Claus O. Wilke ",
+ "Repository": "RSPM",
+ "Date/Publication": "2020-12-30 14:30:02 UTC",
+ "Built": "R 4.3.0; ; 2023-07-08 01:03:56 UTC; windows"
+ }
+ },
+ "cpp11": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "cpp11",
+ "Title": "A C++11 Interface for R's C Interface",
+ "Version": "0.4.6",
+ "Authors@R": "\n c(\n person(\"Davis\", \"Vaughan\", email = \"davis@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4777-038X\")),\n person(\"Jim\",\"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")),\n person(\"Romain\", \"François\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")),\n person(\"Benjamin\", \"Kietzman\", role = \"ctb\"),\n person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "Provides a header only, C++11 interface to R's C\n interface. Compared to other approaches 'cpp11' strives to be safe\n against long jumps from the C API as well as C++ exceptions, conform\n to normal R function semantics and supports interaction with 'ALTREP'\n vectors.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://cpp11.r-lib.org, https://github.com/r-lib/cpp11",
+ "BugReports": "https://github.com/r-lib/cpp11/issues",
+ "Depends": "R (>= 3.5.0)",
+ "Suggests": "bench, brio, callr, cli, covr, decor, desc, ggplot2, glue,\nknitr, lobstr, mockery, progress, rmarkdown, scales, Rcpp,\ntestthat, tibble, utils, vctrs, withr",
+ "VignetteBuilder": "knitr",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "Config/testthat/edition": "3",
+ "Config/Needs/cpp11/cpp_register": "brio, cli, decor, desc, glue, tibble,\nvctrs",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-08-08 21:27:43 UTC; davis",
+ "Author": "Davis Vaughan [aut, cre] (),\n Jim Hester [aut] (),\n Romain François [aut] (),\n Benjamin Kietzman [ctb],\n Posit Software, PBC [cph, fnd]",
+ "Maintainer": "Davis Vaughan ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-08-10 06:50:07 UTC",
+ "Built": "R 4.3.0; ; 2023-11-29 12:29:31 UTC; windows"
+ }
+ },
+ "crayon": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "crayon",
+ "Title": "Colored Terminal Output",
+ "Version": "1.5.2",
+ "Authors@R": "c(\n person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\",\n role = c(\"aut\", \"cre\")),\n person(\n \"Brodie\", \"Gaslam\", email=\"brodie.gaslam@yahoo.com\",\n role=c(\"ctb\"))\n )",
+ "Description": "The crayon package is now superseded. Please use the 'cli' package\n for new projects.\n Colored terminal output on terminals that support 'ANSI'\n color and highlight codes. It also works in 'Emacs' 'ESS'. 'ANSI'\n color support is automatically detected. Colors and highlighting can\n be combined and nested. New styles can also be created easily.\n This package was inspired by the 'chalk' 'JavaScript' project.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://github.com/r-lib/crayon#readme",
+ "BugReports": "https://github.com/r-lib/crayon/issues",
+ "Collate": "'aaa-rstudio-detect.R' 'aaaa-rematch2.R'\n'aab-num-ansi-colors.R' 'aac-num-ansi-colors.R' 'ansi-256.r'\n'ansi-palette.R' 'combine.r' 'string.r' 'utils.r'\n'crayon-package.r' 'disposable.r' 'enc-utils.R' 'has_ansi.r'\n'has_color.r' 'link.R' 'styles.r' 'machinery.r' 'parts.r'\n'print.r' 'style-var.r' 'show.r' 'string_operations.r'",
+ "Imports": "grDevices, methods, utils",
+ "Suggests": "mockery, rstudioapi, testthat, withr",
+ "RoxygenNote": "7.1.2",
+ "Encoding": "UTF-8",
+ "NeedsCompilation": "no",
+ "Packaged": "2022-09-29 06:24:10 UTC; gaborcsardi",
+ "Author": "Gábor Csárdi [aut, cre],\n Brodie Gaslam [ctb]",
+ "Maintainer": "Gábor Csárdi ",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-09-29 16:20:24 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 01:25:24 UTC; windows"
+ }
+ },
+ "credentials": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "credentials",
+ "Type": "Package",
+ "Title": "Tools for Managing SSH and Git Credentials",
+ "Version": "2.0.1",
+ "Authors@R": "person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), \n email = \"jeroen@berkeley.edu\", comment = c(ORCID = \"0000-0002-4035-0289\"))",
+ "Description": "Setup and retrieve HTTPS and SSH credentials for use with 'git' and \n other services. For HTTPS remotes the package interfaces the 'git-credential' \n utility which 'git' uses to store HTTP usernames and passwords. For SSH \n remotes we provide convenient functions to find or generate appropriate SSH \n keys. The package both helps the user to setup a local git installation, and\n also provides a back-end for git/ssh client libraries to authenticate with \n existing user credentials.",
+ "License": "MIT + file LICENSE",
+ "SystemRequirements": "git (optional)",
+ "Encoding": "UTF-8",
+ "Imports": "openssl (>= 1.3), sys (>= 2.1), curl, jsonlite, askpass",
+ "Suggests": "testthat, knitr, rmarkdown",
+ "RoxygenNote": "7.2.1",
+ "VignetteBuilder": "knitr",
+ "Language": "en-US",
+ "URL": "https://docs.ropensci.org/credentials/\nhttps://r-lib.r-universe.dev/credentials",
+ "BugReports": "https://github.com/r-lib/credentials/issues",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-09-06 11:28:31 UTC; jeroen",
+ "Author": "Jeroen Ooms [aut, cre] ()",
+ "Maintainer": "Jeroen Ooms ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-09-06 21:32:31 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 03:15:02 UTC; windows"
+ }
+ },
+ "crosstalk": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "crosstalk",
+ "Type": "Package",
+ "Title": "Inter-Widget Interactivity for HTML Widgets",
+ "Version": "1.2.0",
+ "Authors@R": "c(\n person(\"Joe\", \"Cheng\", role = \"aut\", email = \"joe@rstudio.com\"),\n person(\"Carson\", \"Sievert\", role = c(\"aut\", \"cre\"),\n email = \"carson@rstudio.com\", comment = c(ORCID = \"0000-0002-4958-2844\")),\n person(family = \"RStudio\", role = \"cph\"),\n person(family = \"jQuery Foundation\", role = \"cph\",\n comment = \"jQuery library and jQuery UI library\"),\n person(family = \"jQuery contributors\", role = c(\"ctb\", \"cph\"),\n comment = \"jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt\"),\n person(\"Mark\", \"Otto\", role = \"ctb\",\n comment = \"Bootstrap library\"),\n person(\"Jacob\", \"Thornton\", role = \"ctb\",\n comment = \"Bootstrap library\"),\n person(family = \"Bootstrap contributors\", role = \"ctb\",\n comment = \"Bootstrap library\"),\n person(family = \"Twitter, Inc\", role = \"cph\",\n comment = \"Bootstrap library\"),\n person(\"Brian\", \"Reavis\", role = c(\"ctb\", \"cph\"),\n comment = \"selectize.js library\"),\n person(\"Kristopher Michael\", \"Kowal\", role = c(\"ctb\", \"cph\"),\n comment = \"es5-shim library\"),\n person(family = \"es5-shim contributors\", role = c(\"ctb\", \"cph\"),\n comment = \"es5-shim library\"),\n person(\"Denis\", \"Ineshin\", role = c(\"ctb\", \"cph\"),\n comment = \"ion.rangeSlider library\"),\n person(\"Sami\", \"Samhuri\", role = c(\"ctb\", \"cph\"),\n comment = \"Javascript strftime library\")\n )",
+ "Description": "Provides building blocks for allowing HTML widgets to communicate\n with each other, with Shiny or without (i.e. static .html files). Currently\n supports linked brushing and filtering.",
+ "License": "MIT + file LICENSE",
+ "Imports": "htmltools (>= 0.3.6), jsonlite, lazyeval, R6",
+ "Suggests": "shiny, ggplot2, testthat (>= 2.1.0), sass, bslib",
+ "URL": "https://rstudio.github.io/crosstalk/",
+ "BugReports": "https://github.com/rstudio/crosstalk/issues",
+ "RoxygenNote": "7.1.1",
+ "Encoding": "UTF-8",
+ "NeedsCompilation": "no",
+ "Packaged": "2021-11-04 15:35:47 UTC; cpsievert",
+ "Author": "Joe Cheng [aut],\n Carson Sievert [aut, cre] (),\n RStudio [cph],\n jQuery Foundation [cph] (jQuery library and jQuery UI library),\n jQuery contributors [ctb, cph] (jQuery library; authors listed in\n inst/www/shared/jquery-AUTHORS.txt),\n Mark Otto [ctb] (Bootstrap library),\n Jacob Thornton [ctb] (Bootstrap library),\n Bootstrap contributors [ctb] (Bootstrap library),\n Twitter, Inc [cph] (Bootstrap library),\n Brian Reavis [ctb, cph] (selectize.js library),\n Kristopher Michael Kowal [ctb, cph] (es5-shim library),\n es5-shim contributors [ctb, cph] (es5-shim library),\n Denis Ineshin [ctb, cph] (ion.rangeSlider library),\n Sami Samhuri [ctb, cph] (Javascript strftime library)",
+ "Maintainer": "Carson Sievert ",
+ "Repository": "RSPM",
+ "Date/Publication": "2021-11-04 16:30:02 UTC",
+ "Built": "R 4.3.0; ; 2023-05-29 16:01:07 UTC; windows"
+ }
+ },
+ "curl": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "curl",
+ "Type": "Package",
+ "Title": "A Modern and Flexible Web Client for R",
+ "Version": "5.1.0",
+ "Authors@R": "c(\n person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroen@berkeley.edu\",\n comment = c(ORCID = \"0000-0002-4035-0289\")),\n person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = \"ctb\"),\n person(\"RStudio\", role = \"cph\")\n )",
+ "Description": "The curl() and curl_download() functions provide highly\n configurable drop-in replacements for base url() and download.file() with\n better performance, support for encryption (https, ftps), gzip compression,\n authentication, and other 'libcurl' goodies. The core of the package implements a\n framework for performing fully customized requests where data can be processed\n either in memory, on disk, or streaming via the callback or connection\n interfaces. Some knowledge of 'libcurl' is recommended; for a more-user-friendly\n web client see the 'httr' package which builds on this package with http\n specific tools and logic.",
+ "License": "MIT + file LICENSE",
+ "SystemRequirements": "libcurl: libcurl-devel (rpm) or\nlibcurl4-openssl-dev (deb).",
+ "URL": "https://jeroen.r-universe.dev/curl https://curl.se/libcurl/",
+ "BugReports": "https://github.com/jeroen/curl/issues",
+ "Suggests": "spelling, testthat (>= 1.0.0), knitr, jsonlite, rmarkdown,\nmagrittr, httpuv (>= 1.4.4), webutils",
+ "VignetteBuilder": "knitr",
+ "Depends": "R (>= 3.0.0)",
+ "RoxygenNote": "7.2.3",
+ "Encoding": "UTF-8",
+ "Language": "en-US",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-09-30 07:44:16 UTC; jeroen",
+ "Author": "Jeroen Ooms [aut, cre] (),\n Hadley Wickham [ctb],\n RStudio [cph]",
+ "Maintainer": "Jeroen Ooms ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-10-02 15:20:07 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-10-03 11:36:15 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "data.table": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "data.table",
+ "Version": "1.14.8",
+ "Title": "Extension of `data.frame`",
+ "Authors@R": "c(\n person(\"Matt\",\"Dowle\", role=c(\"aut\",\"cre\"), email=\"mattjdowle@gmail.com\"),\n person(\"Arun\",\"Srinivasan\", role=\"aut\", email=\"asrini@pm.me\"),\n person(\"Jan\",\"Gorecki\", role=\"ctb\"),\n person(\"Michael\",\"Chirico\", role=\"ctb\"),\n person(\"Pasha\",\"Stetsenko\", role=\"ctb\"),\n person(\"Tom\",\"Short\", role=\"ctb\"),\n person(\"Steve\",\"Lianoglou\", role=\"ctb\"),\n person(\"Eduard\",\"Antonyan\", role=\"ctb\"),\n person(\"Markus\",\"Bonsch\", role=\"ctb\"),\n person(\"Hugh\",\"Parsonage\", role=\"ctb\"),\n person(\"Scott\",\"Ritchie\", role=\"ctb\"),\n person(\"Kun\",\"Ren\", role=\"ctb\"),\n person(\"Xianying\",\"Tan\", role=\"ctb\"),\n person(\"Rick\",\"Saporta\", role=\"ctb\"),\n person(\"Otto\",\"Seiskari\", role=\"ctb\"),\n person(\"Xianghui\",\"Dong\", role=\"ctb\"),\n person(\"Michel\",\"Lang\", role=\"ctb\"),\n person(\"Watal\",\"Iwasaki\", role=\"ctb\"),\n person(\"Seth\",\"Wenchel\", role=\"ctb\"),\n person(\"Karl\",\"Broman\", role=\"ctb\"),\n person(\"Tobias\",\"Schmidt\", role=\"ctb\"),\n person(\"David\",\"Arenburg\", role=\"ctb\"),\n person(\"Ethan\",\"Smith\", role=\"ctb\"),\n person(\"Francois\",\"Cocquemas\", role=\"ctb\"),\n person(\"Matthieu\",\"Gomez\", role=\"ctb\"),\n person(\"Philippe\",\"Chataignon\", role=\"ctb\"),\n person(\"Nello\",\"Blaser\", role=\"ctb\"),\n person(\"Dmitry\",\"Selivanov\", role=\"ctb\"),\n person(\"Andrey\",\"Riabushenko\", role=\"ctb\"),\n person(\"Cheng\",\"Lee\", role=\"ctb\"),\n person(\"Declan\",\"Groves\", role=\"ctb\"),\n person(\"Daniel\",\"Possenriede\", role=\"ctb\"),\n person(\"Felipe\",\"Parages\", role=\"ctb\"),\n person(\"Denes\",\"Toth\", role=\"ctb\"),\n person(\"Mus\",\"Yaramaz-David\", role=\"ctb\"),\n person(\"Ayappan\",\"Perumal\", role=\"ctb\"),\n person(\"James\",\"Sams\", role=\"ctb\"),\n person(\"Martin\",\"Morgan\", role=\"ctb\"),\n person(\"Michael\",\"Quinn\", role=\"ctb\"),\n person(\"@javrucebo\",\"\", role=\"ctb\"),\n person(\"@marc-outins\",\"\", role=\"ctb\"),\n person(\"Roy\",\"Storey\", role=\"ctb\"),\n person(\"Manish\",\"Saraswat\", role=\"ctb\"),\n person(\"Morgan\",\"Jacob\", role=\"ctb\"),\n person(\"Michael\",\"Schubmehl\", role=\"ctb\"),\n person(\"Davis\",\"Vaughan\", role=\"ctb\"),\n person(\"Toby\",\"Hocking\", role=\"ctb\"),\n person(\"Leonardo\",\"Silvestri\", role=\"ctb\"),\n person(\"Tyson\",\"Barrett\", role=\"ctb\"),\n person(\"Jim\",\"Hester\", role=\"ctb\"),\n person(\"Anthony\",\"Damico\", role=\"ctb\"),\n person(\"Sebastian\",\"Freundt\", role=\"ctb\"),\n person(\"David\",\"Simons\", role=\"ctb\"),\n person(\"Elliott\",\"Sales de Andrade\", role=\"ctb\"),\n person(\"Cole\",\"Miller\", role=\"ctb\"),\n person(\"Jens Peder\",\"Meldgaard\", role=\"ctb\"),\n person(\"Vaclav\",\"Tlapak\", role=\"ctb\"),\n person(\"Kevin\",\"Ushey\", role=\"ctb\"),\n person(\"Dirk\",\"Eddelbuettel\", role=\"ctb\"),\n person(\"Ben\",\"Schwen\", role=\"ctb\"))",
+ "Depends": "R (>= 3.1.0)",
+ "Imports": "methods",
+ "Suggests": "bit64 (>= 4.0.0), bit (>= 4.0.4), curl, R.utils, xts,\nnanotime, zoo (>= 1.8-1), yaml, knitr, rmarkdown",
+ "SystemRequirements": "zlib",
+ "Description": "Fast aggregation of large data (e.g. 100GB in RAM), fast ordered joins, fast add/modify/delete of columns by group using no copies at all, list columns, friendly and fast character-separated-value read/write. Offers a natural and flexible syntax, for faster development.",
+ "License": "MPL-2.0 | file LICENSE",
+ "URL": "https://r-datatable.com, https://Rdatatable.gitlab.io/data.table,\nhttps://github.com/Rdatatable/data.table",
+ "BugReports": "https://github.com/Rdatatable/data.table/issues",
+ "VignetteBuilder": "knitr",
+ "ByteCompile": "TRUE",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-02-16 16:37:18 UTC; mdowle",
+ "Author": "Matt Dowle [aut, cre],\n Arun Srinivasan [aut],\n Jan Gorecki [ctb],\n Michael Chirico [ctb],\n Pasha Stetsenko [ctb],\n Tom Short [ctb],\n Steve Lianoglou [ctb],\n Eduard Antonyan [ctb],\n Markus Bonsch [ctb],\n Hugh Parsonage [ctb],\n Scott Ritchie [ctb],\n Kun Ren [ctb],\n Xianying Tan [ctb],\n Rick Saporta [ctb],\n Otto Seiskari [ctb],\n Xianghui Dong [ctb],\n Michel Lang [ctb],\n Watal Iwasaki [ctb],\n Seth Wenchel [ctb],\n Karl Broman [ctb],\n Tobias Schmidt [ctb],\n David Arenburg [ctb],\n Ethan Smith [ctb],\n Francois Cocquemas [ctb],\n Matthieu Gomez [ctb],\n Philippe Chataignon [ctb],\n Nello Blaser [ctb],\n Dmitry Selivanov [ctb],\n Andrey Riabushenko [ctb],\n Cheng Lee [ctb],\n Declan Groves [ctb],\n Daniel Possenriede [ctb],\n Felipe Parages [ctb],\n Denes Toth [ctb],\n Mus Yaramaz-David [ctb],\n Ayappan Perumal [ctb],\n James Sams [ctb],\n Martin Morgan [ctb],\n Michael Quinn [ctb],\n @javrucebo [ctb],\n @marc-outins [ctb],\n Roy Storey [ctb],\n Manish Saraswat [ctb],\n Morgan Jacob [ctb],\n Michael Schubmehl [ctb],\n Davis Vaughan [ctb],\n Toby Hocking [ctb],\n Leonardo Silvestri [ctb],\n Tyson Barrett [ctb],\n Jim Hester [ctb],\n Anthony Damico [ctb],\n Sebastian Freundt [ctb],\n David Simons [ctb],\n Elliott Sales de Andrade [ctb],\n Cole Miller [ctb],\n Jens Peder Meldgaard [ctb],\n Vaclav Tlapak [ctb],\n Kevin Ushey [ctb],\n Dirk Eddelbuettel [ctb],\n Ben Schwen [ctb]",
+ "Maintainer": "Matt Dowle ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-02-17 12:20:12 UTC",
+ "Encoding": "UTF-8",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-04-25 02:30:05 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "dbplyr": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Type": "Package",
+ "Package": "dbplyr",
+ "Title": "A 'dplyr' Back End for Databases",
+ "Version": "2.4.0",
+ "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")),\n person(\"Maximilian\", \"Girlich\", role = \"aut\"),\n person(\"Edgar\", \"Ruiz\", role = \"aut\"),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "A 'dplyr' back end for databases that allows you to work with\n remote database tables as if they are in-memory data frames. Basic\n features works with any database that has a 'DBI' back end; more\n advanced features require 'SQL' translation to be provided by the\n package author.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://dbplyr.tidyverse.org/, https://github.com/tidyverse/dbplyr",
+ "BugReports": "https://github.com/tidyverse/dbplyr/issues",
+ "Depends": "R (>= 3.6)",
+ "Imports": "blob (>= 1.2.0), cli (>= 3.6.1), DBI (>= 1.1.3), dplyr (>=\n1.1.2), glue (>= 1.6.2), lifecycle (>= 1.0.3), magrittr,\nmethods, pillar (>= 1.9.0), purrr (>= 1.0.1), R6 (>= 2.2.2),\nrlang (>= 1.1.1), tibble (>= 3.2.1), tidyr (>= 1.3.0),\ntidyselect (>= 1.2.0), utils, vctrs (>= 0.6.3), withr (>=\n2.5.0)",
+ "Suggests": "bit64, covr, knitr, Lahman, nycflights13, odbc, RMariaDB (>=\n1.2.2), rmarkdown, RPostgres (>= 1.4.5), RPostgreSQL, RSQLite\n(>= 2.3.1), testthat (>= 3.1.10)",
+ "VignetteBuilder": "knitr",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "Config/testthat/edition": "3",
+ "Encoding": "UTF-8",
+ "Language": "en-gb",
+ "RoxygenNote": "7.2.3",
+ "Collate": "'db-sql.R' 'utils-check.R' 'import-standalone-types-check.R'\n'import-standalone-obj-type.R' 'utils.R' 'sql.R' 'escape.R'\n'translate-sql-cut.R' 'translate-sql-quantile.R'\n'translate-sql-string.R' 'translate-sql-paste.R'\n'translate-sql-helpers.R' 'translate-sql-window.R'\n'translate-sql-conditional.R' 'backend-.R' 'backend-access.R'\n'backend-hana.R' 'backend-hive.R' 'backend-impala.R'\n'verb-copy-to.R' 'backend-mssql.R' 'backend-mysql.R'\n'backend-odbc.R' 'backend-oracle.R' 'backend-postgres.R'\n'backend-postgres-old.R' 'backend-redshift.R'\n'backend-snowflake.R' 'backend-spark-sql.R' 'backend-sqlite.R'\n'backend-teradata.R' 'build-sql.R' 'data-cache.R'\n'data-lahman.R' 'data-nycflights13.R' 'db-escape.R' 'db-io.R'\n'db.R' 'dbplyr.R' 'explain.R' 'ident.R' 'join-by-compat.R'\n'join-cols-compat.R' 'lazy-join-query.R' 'lazy-ops.R'\n'lazy-query.R' 'lazy-select-query.R' 'lazy-set-op-query.R'\n'memdb.R' 'optimise-utils.R' 'pillar.R' 'progress.R'\n'sql-build.R' 'query-join.R' 'query-select.R'\n'query-semi-join.R' 'query-set-op.R' 'query.R' 'reexport.R'\n'remote.R' 'rows.R' 'schema.R' 'simulate.R' 'sql-clause.R'\n'sql-expr.R' 'src-sql.R' 'src_dbi.R' 'table-ident.R'\n'tbl-lazy.R' 'tbl-sql.R' 'test-frame.R' 'testthat.R'\n'tidyeval-across.R' 'tidyeval.R' 'translate-sql.R'\n'utils-format.R' 'verb-arrange.R' 'verb-compute.R'\n'verb-count.R' 'verb-distinct.R' 'verb-do-query.R' 'verb-do.R'\n'verb-expand.R' 'verb-fill.R' 'verb-filter.R' 'verb-group_by.R'\n'verb-head.R' 'verb-joins.R' 'verb-mutate.R'\n'verb-pivot-longer.R' 'verb-pivot-wider.R' 'verb-pull.R'\n'verb-select.R' 'verb-set-ops.R' 'verb-slice.R'\n'verb-summarise.R' 'verb-uncount.R' 'verb-window.R' 'zzz.R'",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-10-25 20:30:22 UTC; hadleywickham",
+ "Author": "Hadley Wickham [aut, cre],\n Maximilian Girlich [aut],\n Edgar Ruiz [aut],\n RStudio [cph, fnd]",
+ "Maintainer": "Hadley Wickham ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-10-26 07:40:02 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 07:46:57 UTC; windows"
+ }
+ },
+ "desc": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "desc",
+ "Title": "Manipulate DESCRIPTION Files",
+ "Version": "1.4.2",
+ "Authors@R": "c(\n person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")),\n person(\"Kirill\", \"Müller\", role = \"aut\"),\n person(\"Jim\", \"Hester\", , \"james.f.hester@gmail.com\", role = \"aut\"),\n person(\"Maëlle\", \"Salmon\", role = \"ctb\",\n comment = c(ORCID = \"0000-0002-2815-0399\")),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )",
+ "Maintainer": "Gábor Csárdi ",
+ "Description": "Tools to read, write, create, and manipulate DESCRIPTION\n files. It is intended for packages that create or manipulate other\n packages.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://github.com/r-lib/desc#readme,\nhttps://r-lib.github.io/desc/",
+ "BugReports": "https://github.com/r-lib/desc/issues",
+ "Depends": "R (>= 3.4)",
+ "Imports": "cli, R6, rprojroot, utils",
+ "Suggests": "callr, covr, gh, spelling, testthat, whoami, withr",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "Config/testthat/edition": "3",
+ "Encoding": "UTF-8",
+ "Language": "en-US",
+ "RoxygenNote": "7.2.1.9000",
+ "Collate": "'assertions.R' 'authors-at-r.R' 'built.R' 'classes.R'\n'collate.R' 'constants.R' 'deps.R' 'desc-package.R'\n'description.R' 'encoding.R' 'latex.R' 'non-oo-api.R'\n'package-archives.R' 'read.R' 'remotes.R' 'str.R'\n'syntax_checks.R' 'urls.R' 'utils.R' 'validate.R' 'version.R'",
+ "NeedsCompilation": "no",
+ "Packaged": "2022-09-08 09:02:11 UTC; gaborcsardi",
+ "Author": "Gábor Csárdi [aut, cre],\n Kirill Müller [aut],\n Jim Hester [aut],\n Maëlle Salmon [ctb] (),\n RStudio [cph, fnd]",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-09-08 10:52:55 UTC",
+ "Built": "R 4.3.0; ; 2023-04-25 02:25:49 UTC; windows"
+ }
+ },
+ "devtools": {
+ "Source": "CRAN",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "devtools",
+ "Title": "Tools to Make Developing R Packages Easier",
+ "Version": "2.4.5",
+ "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", role = \"aut\"),\n person(\"Jim\", \"Hester\", role = \"aut\"),\n person(\"Winston\", \"Chang\", role = \"aut\"),\n person(\"Jennifer\", \"Bryan\", , \"jenny@rstudio.com\", role = c(\"aut\", \"cre\"),\n comment = c(ORCID = \"0000-0002-6983-2759\")),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "Collection of package development tools.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://devtools.r-lib.org/, https://github.com/r-lib/devtools",
+ "BugReports": "https://github.com/r-lib/devtools/issues",
+ "Depends": "R (>= 3.0.2), usethis (>= 2.1.6)",
+ "Imports": "cli (>= 3.3.0), desc (>= 1.4.1), ellipsis (>= 0.3.2), fs (>=\n1.5.2), lifecycle (>= 1.0.1), memoise (>= 2.0.1), miniUI (>=\n0.1.1.1), pkgbuild (>= 1.3.1), pkgdown (>= 2.0.6), pkgload (>=\n1.3.0), profvis (>= 0.3.7), rcmdcheck (>= 1.4.0), remotes (>=\n2.4.2), rlang (>= 1.0.4), roxygen2 (>= 7.2.1), rversions (>=\n2.1.1), sessioninfo (>= 1.2.2), stats, testthat (>= 3.1.5),\ntools, urlchecker (>= 1.0.1), utils, withr (>= 2.5.0)",
+ "Suggests": "BiocManager (>= 1.30.18), callr (>= 3.7.1), covr (>= 3.5.1),\ncurl (>= 4.3.2), digest (>= 0.6.29), DT (>= 0.23), foghorn (>=\n1.4.2), gh (>= 1.3.0), gmailr (>= 1.0.1), httr (>= 1.4.3),\nknitr (>= 1.39), lintr (>= 3.0.0), MASS, mockery (>= 0.4.3),\npingr (>= 2.0.1), rhub (>= 1.1.1), rmarkdown (>= 2.14),\nrstudioapi (>= 0.13), spelling (>= 2.2)",
+ "VignetteBuilder": "knitr",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "Encoding": "UTF-8",
+ "Language": "en-US",
+ "RoxygenNote": "7.2.1",
+ "Config/testthat/edition": "3",
+ "NeedsCompilation": "no",
+ "Packaged": "2022-10-11 16:13:16 UTC; jenny",
+ "Author": "Hadley Wickham [aut],\n Jim Hester [aut],\n Winston Chang [aut],\n Jennifer Bryan [aut, cre] (),\n RStudio [cph, fnd]",
+ "Maintainer": "Jennifer Bryan ",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-10-11 17:12:36 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 09:06:25 UTC; windows"
+ }
+ },
+ "diffobj": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "diffobj",
+ "Type": "Package",
+ "Title": "Diffs for R Objects",
+ "Description": "Generate a colorized diff of two R objects for an intuitive\n visualization of their differences.",
+ "Version": "0.3.5",
+ "Authors@R": "c(\n person(\n \"Brodie\", \"Gaslam\", email=\"brodie.gaslam@yahoo.com\",\n role=c(\"aut\", \"cre\")),\n person(\n \"Michael B.\", \"Allen\", email=\"ioplex@gmail.com\",\n role=c(\"ctb\", \"cph\"),\n comment=\"Original C implementation of Myers Diff Algorithm\"))",
+ "Depends": "R (>= 3.1.0)",
+ "License": "GPL-2 | GPL-3",
+ "URL": "https://github.com/brodieG/diffobj",
+ "BugReports": "https://github.com/brodieG/diffobj/issues",
+ "RoxygenNote": "7.1.1",
+ "VignetteBuilder": "knitr",
+ "Encoding": "UTF-8",
+ "Suggests": "knitr, rmarkdown",
+ "Collate": "'capt.R' 'options.R' 'pager.R' 'check.R' 'finalizer.R'\n'misc.R' 'html.R' 'styles.R' 's4.R' 'core.R' 'diff.R' 'get.R'\n'guides.R' 'hunks.R' 'layout.R' 'myerssimple.R' 'rdiff.R'\n'rds.R' 'set.R' 'subset.R' 'summmary.R' 'system.R' 'text.R'\n'tochar.R' 'trim.R' 'word.R'",
+ "Imports": "crayon (>= 1.3.2), tools, methods, utils, stats",
+ "NeedsCompilation": "yes",
+ "Packaged": "2021-10-05 01:16:56 UTC; bg",
+ "Author": "Brodie Gaslam [aut, cre],\n Michael B. Allen [ctb, cph] (Original C implementation of Myers Diff\n Algorithm)",
+ "Maintainer": "Brodie Gaslam ",
+ "Repository": "RSPM",
+ "Date/Publication": "2021-10-05 07:10:17 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 01:44:25 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "digest": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "digest",
+ "Author": "Dirk Eddelbuettel with contributions\n by Antoine Lucas, Jarek Tuszynski, Henrik Bengtsson, Simon Urbanek,\n Mario Frasca, Bryan Lewis, Murray Stokely, Hannes Muehleisen,\n Duncan Murdoch, Jim Hester, Wush Wu, Qiang Kou, Thierry Onkelinx,\n Michel Lang, Viliam Simko, Kurt Hornik, Radford Neal, Kendon Bell,\n Matthew de Queljoe, Ion Suruceanu, Bill Denney, Dirk Schumacher,\n Winston Chang, and Dean Attali.",
+ "Version": "0.6.33",
+ "Date": "2023-06-28",
+ "Maintainer": "Dirk Eddelbuettel ",
+ "Title": "Create Compact Hash Digests of R Objects",
+ "Description": "Implementation of a function 'digest()' for the creation of hash\n digests of arbitrary R objects (using the 'md5', 'sha-1', 'sha-256', 'crc32',\n 'xxhash', 'murmurhash', 'spookyhash', 'blake3' and 'crc32c' algorithms) permitting\n easy comparison of R language objects, as well as functions such as'hmac()' to\n create hash-based message authentication code. Please note that this package\n is not meant to be deployed for cryptographic purposes for which more\n comprehensive (and widely tested) libraries such as 'OpenSSL' should be\n used.",
+ "URL": "https://github.com/eddelbuettel/digest,\nhttps://dirk.eddelbuettel.com/code/digest.html",
+ "BugReports": "https://github.com/eddelbuettel/digest/issues",
+ "Depends": "R (>= 3.3.0)",
+ "Imports": "utils",
+ "License": "GPL (>= 2)",
+ "Suggests": "tinytest, simplermarkdown",
+ "VignetteBuilder": "simplermarkdown",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-06-28 02:46:18 UTC; edd",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-07-07 14:10:02 UTC",
+ "Encoding": "UTF-8",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 01:06:01 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "downlit": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "downlit",
+ "Title": "Syntax Highlighting and Automatic Linking",
+ "Version": "0.4.3",
+ "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "Syntax highlighting of R code, specifically designed for the\n needs of 'RMarkdown' packages like 'pkgdown', 'hugodown', and\n 'bookdown'. It includes linking of function calls to their\n documentation on the web, and automatic translation of ANSI escapes in\n output to the equivalent HTML.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://downlit.r-lib.org/, https://github.com/r-lib/downlit",
+ "BugReports": "https://github.com/r-lib/downlit/issues",
+ "Depends": "R (>= 3.4.0)",
+ "Imports": "brio, desc, digest, evaluate, fansi, memoise, rlang, vctrs,\nwithr, yaml",
+ "Suggests": "covr, htmltools, jsonlite, MASS, MassSpecWavelet, pkgload,\nrmarkdown, testthat (>= 3.0.0), xml2",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "Config/testthat/edition": "3",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-06-29 22:06:14 UTC; hadleywickham",
+ "Author": "Hadley Wickham [aut, cre],\n RStudio [cph, fnd]",
+ "Maintainer": "Hadley Wickham ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-06-29 22:40:08 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 06:24:41 UTC; windows"
+ }
+ },
+ "dplyr": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Type": "Package",
+ "Package": "dplyr",
+ "Title": "A Grammar of Data Manipulation",
+ "Version": "1.1.3",
+ "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"),\n comment = c(ORCID = \"0000-0003-4757-117X\")),\n person(\"Romain\", \"François\", role = \"aut\",\n comment = c(ORCID = \"0000-0002-2444-4226\")),\n person(\"Lionel\", \"Henry\", role = \"aut\"),\n person(\"Kirill\", \"Müller\", role = \"aut\",\n comment = c(ORCID = \"0000-0002-1416-3412\")),\n person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = \"aut\",\n comment = c(ORCID = \"0000-0003-4777-038X\")),\n person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "A fast, consistent tool for working with data frame like\n objects, both in memory and out of memory.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://dplyr.tidyverse.org, https://github.com/tidyverse/dplyr",
+ "BugReports": "https://github.com/tidyverse/dplyr/issues",
+ "Depends": "R (>= 3.5.0)",
+ "Imports": "cli (>= 3.4.0), generics, glue (>= 1.3.2), lifecycle (>=\n1.0.3), magrittr (>= 1.5), methods, pillar (>= 1.9.0), R6,\nrlang (>= 1.1.0), tibble (>= 3.2.0), tidyselect (>= 1.2.0),\nutils, vctrs (>= 0.6.0)",
+ "Suggests": "bench, broom, callr, covr, DBI, dbplyr (>= 2.2.1), ggplot2,\nknitr, Lahman, lobstr, microbenchmark, nycflights13, purrr,\nrmarkdown, RMySQL, RPostgreSQL, RSQLite, stringi (>= 1.7.6),\ntestthat (>= 3.1.5), tidyr (>= 1.3.0), withr",
+ "VignetteBuilder": "knitr",
+ "Config/Needs/website": "tidyverse, shiny, pkgdown, tidyverse/tidytemplate",
+ "Config/testthat/edition": "3",
+ "Encoding": "UTF-8",
+ "LazyData": "true",
+ "RoxygenNote": "7.2.3",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-08-25 22:28:32 UTC; hadleywickham",
+ "Author": "Hadley Wickham [aut, cre] (),\n Romain François [aut] (),\n Lionel Henry [aut],\n Kirill Müller [aut] (),\n Davis Vaughan [aut] (),\n Posit Software, PBC [cph, fnd]",
+ "Maintainer": "Hadley Wickham ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-09-03 16:20:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-09-04 11:37:01 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "ellipsis": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "ellipsis",
+ "Version": "0.3.2",
+ "Title": "Tools for Working with ...",
+ "Description": "The ellipsis is a powerful tool for extending functions. Unfortunately \n this power comes at a cost: misspelled arguments will be silently ignored. \n The ellipsis package provides a collection of functions to catch problems\n and alert the user.",
+ "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")),\n person(\"RStudio\", role = \"cph\")\n )",
+ "License": "MIT + file LICENSE",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.1.1",
+ "URL": "https://ellipsis.r-lib.org, https://github.com/r-lib/ellipsis",
+ "BugReports": "https://github.com/r-lib/ellipsis/issues",
+ "Depends": "R (>= 3.2)",
+ "Imports": "rlang (>= 0.3.0)",
+ "Suggests": "covr, testthat",
+ "NeedsCompilation": "yes",
+ "Packaged": "2021-04-29 12:06:44 UTC; lionel",
+ "Author": "Hadley Wickham [aut, cre],\n RStudio [cph]",
+ "Maintainer": "Hadley Wickham ",
+ "Repository": "RSPM",
+ "Date/Publication": "2021-04-29 12:40:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 01:37:52 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "evaluate": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "evaluate",
+ "Type": "Package",
+ "Title": "Parsing and Evaluation Tools that Provide More Details than the\nDefault",
+ "Version": "0.22",
+ "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", role = \"aut\"),\n person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")),\n person(\"Michael\", \"Lawrence\", role = \"ctb\"),\n person(\"Thomas\", \"Kluyver\", role = \"ctb\"),\n person(\"Jeroen\", \"Ooms\", role = \"ctb\"),\n person(\"Barret\", \"Schloerke\", role = \"ctb\"),\n person(\"Adam\", \"Ryczkowski\", role = \"ctb\"),\n person(\"Hiroaki\", \"Yutani\", role = \"ctb\"),\n person(\"Michel\", \"Lang\", role = \"ctb\"),\n person(\"Karolis\", \"Koncevičius\", role = \"ctb\"),\n person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "Parsing and evaluation tools that make it easy to recreate the\n command line behaviour of R.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://github.com/r-lib/evaluate",
+ "BugReports": "https://github.com/r-lib/evaluate/issues",
+ "Depends": "R (>= 3.0.2)",
+ "Imports": "methods",
+ "Suggests": "covr, ggplot2, lattice, rlang, testthat (>= 3.0.0), withr",
+ "RoxygenNote": "7.2.3",
+ "Encoding": "UTF-8",
+ "Config/testthat/edition": "3",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-09-29 02:32:03 UTC; yihui",
+ "Author": "Hadley Wickham [aut],\n Yihui Xie [aut, cre] (),\n Michael Lawrence [ctb],\n Thomas Kluyver [ctb],\n Jeroen Ooms [ctb],\n Barret Schloerke [ctb],\n Adam Ryczkowski [ctb],\n Hiroaki Yutani [ctb],\n Michel Lang [ctb],\n Karolis Koncevičius [ctb],\n Posit Software, PBC [cph, fnd]",
+ "Maintainer": "Yihui Xie ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-09-29 04:30:05 UTC",
+ "Built": "R 4.3.0; ; 2023-10-02 11:17:40 UTC; windows"
+ }
+ },
+ "fansi": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "fansi",
+ "Title": "ANSI Control Sequence Aware String Functions",
+ "Description": "Counterparts to R string manipulation functions that account for\n the effects of ANSI text formatting control sequences.",
+ "Version": "1.0.5",
+ "Authors@R": "c(\n person(\"Brodie\", \"Gaslam\", email=\"brodie.gaslam@yahoo.com\",\n role=c(\"aut\", \"cre\")),\n person(\"Elliott\", \"Sales De Andrade\", role=\"ctb\"),\n person(family=\"R Core Team\",\n email=\"R-core@r-project.org\", role=\"cph\",\n comment=\"UTF8 byte length calcs from src/util.c\"\n ))",
+ "Depends": "R (>= 3.1.0)",
+ "License": "GPL-2 | GPL-3",
+ "URL": "https://github.com/brodieG/fansi",
+ "BugReports": "https://github.com/brodieG/fansi/issues",
+ "VignetteBuilder": "knitr",
+ "Suggests": "unitizer, knitr, rmarkdown",
+ "Imports": "grDevices, utils",
+ "RoxygenNote": "7.2.3",
+ "Encoding": "UTF-8",
+ "Collate": "'constants.R' 'fansi-package.R' 'internal.R' 'load.R' 'misc.R'\n'nchar.R' 'strwrap.R' 'strtrim.R' 'strsplit.R' 'substr2.R'\n'trimws.R' 'tohtml.R' 'unhandled.R' 'normalize.R' 'sgr.R'",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-10-07 16:15:12 UTC; bg",
+ "Author": "Brodie Gaslam [aut, cre],\n Elliott Sales De Andrade [ctb],\n R Core Team [cph] (UTF8 byte length calcs from src/util.c)",
+ "Maintainer": "Brodie Gaslam ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-10-08 19:30:05 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-11-28 16:31:55 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "farver": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Type": "Package",
+ "Package": "farver",
+ "Title": "High Performance Colour Space Manipulation",
+ "Version": "2.1.1",
+ "Authors@R": "c(\n person(\"Thomas Lin\", \"Pedersen\", , \"thomasp85@gmail.com\", role = c(\"cre\", \"aut\"),\n comment = c(ORCID = \"0000-0002-5147-4711\")),\n person(\"Berendea\", \"Nicolae\", role = \"aut\",\n comment = \"Author of the ColorSpace C++ library\"),\n person(\"Romain\", \"François\", , \"romain@purrple.cat\", role = \"aut\",\n comment = c(ORCID = \"0000-0002-2444-4226\"))\n )",
+ "Maintainer": "Thomas Lin Pedersen ",
+ "Description": "The encoding of colour can be handled in many different ways,\n using different colour spaces. As different colour spaces have\n different uses, efficient conversion between these representations are\n important. The 'farver' package provides a set of functions that gives\n access to very fast colour space conversion and comparisons\n implemented in C++, and offers speed improvements over the\n 'convertColor' function in the 'grDevices' package.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://farver.data-imaginist.com,\nhttps://github.com/thomasp85/farver",
+ "BugReports": "https://github.com/thomasp85/farver/issues",
+ "Suggests": "covr, testthat (>= 3.0.0)",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.0",
+ "SystemRequirements": "C++11",
+ "Config/testthat/edition": "3",
+ "NeedsCompilation": "yes",
+ "Packaged": "2022-07-06 12:54:24 UTC; thomas",
+ "Author": "Thomas Lin Pedersen [cre, aut]\n (),\n Berendea Nicolae [aut] (Author of the ColorSpace C++ library),\n Romain François [aut] ()",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-07-06 13:50:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 02:03:15 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "fastmap": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "fastmap",
+ "Title": "Fast Data Structures",
+ "Version": "1.1.1",
+ "Authors@R": "c(\n person(\"Winston\", \"Chang\", email = \"winston@rstudio.com\", role = c(\"aut\", \"cre\")),\n person(given = \"RStudio\", role = c(\"cph\", \"fnd\")),\n person(given = \"Tessil\", role = \"cph\", comment = \"hopscotch_map library\")\n )",
+ "Description": "Fast implementation of data structures, including a key-value\n store, stack, and queue. Environments are commonly used as key-value stores\n in R, but every time a new key is used, it is added to R's global symbol\n table, causing a small amount of memory leakage. This can be problematic in\n cases where many different keys are used. Fastmap avoids this memory leak\n issue by implementing the map using data structures in C++.",
+ "License": "MIT + file LICENSE",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "Suggests": "testthat (>= 2.1.1)",
+ "URL": "https://r-lib.github.io/fastmap/, https://github.com/r-lib/fastmap",
+ "BugReports": "https://github.com/r-lib/fastmap/issues",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-02-24 16:01:27 UTC; winston",
+ "Author": "Winston Chang [aut, cre],\n RStudio [cph, fnd],\n Tessil [cph] (hopscotch_map library)",
+ "Maintainer": "Winston Chang ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-02-24 16:30:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 02:31:07 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "fontawesome": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Type": "Package",
+ "Package": "fontawesome",
+ "Version": "0.5.2",
+ "Title": "Easily Work with 'Font Awesome' Icons",
+ "Description": "Easily and flexibly insert 'Font Awesome' icons into 'R Markdown'\n documents and 'Shiny' apps. These icons can be inserted into HTML content\n through inline 'SVG' tags or 'i' tags. There is also a utility function for\n exporting 'Font Awesome' icons as 'PNG' images for those situations where\n raster graphics are needed.",
+ "Authors@R": "c(\n person(\"Richard\", \"Iannone\", , \"rich@posit.co\", c(\"aut\", \"cre\"),\n comment = c(ORCID = \"0000-0003-3925-190X\")),\n person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"ctb\",\n comment = c(ORCID = \"0000-0003-4474-2498\")),\n person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"ctb\"),\n person(\"Dave\", \"Gandy\", role = c(\"ctb\", \"cph\"),\n comment = \"Font-Awesome font\"),\n person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"))\n )",
+ "License": "MIT + file LICENSE",
+ "URL": "https://github.com/rstudio/fontawesome,\nhttps://rstudio.github.io/fontawesome/",
+ "BugReports": "https://github.com/rstudio/fontawesome/issues",
+ "Encoding": "UTF-8",
+ "ByteCompile": "true",
+ "RoxygenNote": "7.2.3",
+ "Depends": "R (>= 3.3.0)",
+ "Imports": "rlang (>= 1.0.6), htmltools (>= 0.5.1.1)",
+ "Suggests": "covr, dplyr (>= 1.0.8), knitr (>= 1.31), testthat (>= 3.0.0),\nrsvg",
+ "Config/testthat/edition": "3",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-08-19 02:32:12 UTC; rich",
+ "Author": "Richard Iannone [aut, cre] (),\n Christophe Dervieux [ctb] (),\n Winston Chang [ctb],\n Dave Gandy [ctb, cph] (Font-Awesome font),\n Posit Software, PBC [cph, fnd]",
+ "Maintainer": "Richard Iannone ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-08-19 04:52:40 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 05:18:17 UTC; windows"
+ }
+ },
+ "fs": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "fs",
+ "Title": "Cross-Platform File System Operations Based on 'libuv'",
+ "Version": "1.6.3",
+ "Authors@R": "c(\n person(\"Jim\", \"Hester\", role = \"aut\"),\n person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = \"aut\"),\n person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")),\n person(\"libuv project contributors\", role = \"cph\",\n comment = \"libuv library\"),\n person(\"Joyent, Inc. and other Node contributors\", role = \"cph\",\n comment = \"libuv library\"),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "A cross-platform interface to file system operations, built\n on top of the 'libuv' C library.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://fs.r-lib.org, https://github.com/r-lib/fs",
+ "BugReports": "https://github.com/r-lib/fs/issues",
+ "Depends": "R (>= 3.4)",
+ "Imports": "methods",
+ "Suggests": "covr, crayon, knitr, pillar (>= 1.0.0), rmarkdown, spelling,\ntestthat (>= 3.0.0), tibble (>= 1.1.0), vctrs (>= 0.3.0), withr",
+ "VignetteBuilder": "knitr",
+ "ByteCompile": "true",
+ "Copyright": "file COPYRIGHTS",
+ "Encoding": "UTF-8",
+ "Language": "en-US",
+ "RoxygenNote": "7.2.3",
+ "SystemRequirements": "GNU make",
+ "Config/testthat/edition": "3",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-07-10 16:24:00 UTC; gaborcsardi",
+ "Author": "Jim Hester [aut],\n Hadley Wickham [aut],\n Gábor Csárdi [aut, cre],\n libuv project contributors [cph] (libuv library),\n Joyent, Inc. and other Node contributors [cph] (libuv library),\n RStudio [cph, fnd]",
+ "Maintainer": "Gábor Csárdi ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-07-20 10:30:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 02:16:55 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "generics": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "generics",
+ "Title": "Common S3 Generics not Provided by Base R Methods Related to\nModel Fitting",
+ "Version": "0.1.3",
+ "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")),\n person(\"Max\", \"Kuhn\", , \"max@rstudio.com\", role = \"aut\"),\n person(\"Davis\", \"Vaughan\", , \"davis@rstudio.com\", role = \"aut\"),\n person(\"RStudio\", role = \"cph\")\n )",
+ "Description": "In order to reduce potential package dependencies and\n conflicts, generics provides a number of commonly used S3 generics.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://generics.r-lib.org, https://github.com/r-lib/generics",
+ "BugReports": "https://github.com/r-lib/generics/issues",
+ "Depends": "R (>= 3.2)",
+ "Imports": "methods",
+ "Suggests": "covr, pkgload, testthat (>= 3.0.0), tibble, withr",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "Config/testthat/edition": "3",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.0",
+ "NeedsCompilation": "no",
+ "Packaged": "2022-07-05 14:52:13 UTC; davis",
+ "Author": "Hadley Wickham [aut, cre],\n Max Kuhn [aut],\n Davis Vaughan [aut],\n RStudio [cph]",
+ "Maintainer": "Hadley Wickham ",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-07-05 19:40:02 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 01:51:21 UTC; windows"
+ }
+ },
+ "gert": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Type": "Package",
+ "Package": "gert",
+ "Title": "Simple Git Client for R",
+ "Version": "2.0.0",
+ "Authors@R": "c(\n person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroen@berkeley.edu\",\n comment = c(ORCID = \"0000-0002-4035-0289\")),\n person(\"Jennifer\", \"Bryan\", role = \"ctb\", email = \"jenny@rstudio.com\",\n comment = c(ORCID = \"0000-0002-6983-2759\")))",
+ "Description": "Simple git client for R based on 'libgit2' with\n support for SSH and HTTPS remotes. All functions in 'gert' use basic R data \n types (such as vectors and data-frames) for their arguments and return values.\n User credentials are shared with command line 'git' through the git-credential\n store and ssh keys stored on disk or ssh-agent.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://docs.ropensci.org/gert/\nhttps://ropensci.r-universe.dev/gert",
+ "BugReports": "https://github.com/r-lib/gert/issues",
+ "Imports": "askpass, credentials (>= 1.2.1), openssl (>= 2.0.3),\nrstudioapi (>= 0.11), sys, zip (>= 2.1.0)",
+ "Suggests": "spelling, knitr, rmarkdown, testthat",
+ "VignetteBuilder": "knitr",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "SystemRequirements": "libgit2 (>= 1.0): libgit2-devel (rpm) or\nlibgit2-dev (deb)",
+ "Language": "en-US",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-09-26 10:10:02 UTC; jeroen",
+ "Author": "Jeroen Ooms [aut, cre] (),\n Jennifer Bryan [ctb] ()",
+ "Maintainer": "Jeroen Ooms ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-09-26 12:40:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-09-28 17:18:43 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "ggplot2": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "ggplot2",
+ "Version": "3.4.4",
+ "Title": "Create Elegant Data Visualisations Using the Grammar of Graphics",
+ "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\",\n comment = c(ORCID = \"0000-0003-4757-117X\")),\n person(\"Winston\", \"Chang\", role = \"aut\",\n comment = c(ORCID = \"0000-0002-1576-2126\")),\n person(\"Lionel\", \"Henry\", role = \"aut\"),\n person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"aut\", \"cre\"),\n comment = c(ORCID = \"0000-0002-5147-4711\")),\n person(\"Kohske\", \"Takahashi\", role = \"aut\"),\n person(\"Claus\", \"Wilke\", role = \"aut\",\n comment = c(ORCID = \"0000-0002-7470-9261\")),\n person(\"Kara\", \"Woo\", role = \"aut\",\n comment = c(ORCID = \"0000-0002-5125-4188\")),\n person(\"Hiroaki\", \"Yutani\", role = \"aut\",\n comment = c(ORCID = \"0000-0002-3385-7233\")),\n person(\"Dewey\", \"Dunnington\", role = \"aut\",\n comment = c(ORCID = \"0000-0002-9415-4582\")),\n person(\"Posit, PBC\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "A system for 'declaratively' creating graphics, based on \"The\n Grammar of Graphics\". You provide the data, tell 'ggplot2' how to map\n variables to aesthetics, what graphical primitives to use, and it\n takes care of the details.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://ggplot2.tidyverse.org,\nhttps://github.com/tidyverse/ggplot2",
+ "BugReports": "https://github.com/tidyverse/ggplot2/issues",
+ "Depends": "R (>= 3.3)",
+ "Imports": "cli, glue, grDevices, grid, gtable (>= 0.1.1), isoband,\nlifecycle (> 1.0.1), MASS, mgcv, rlang (>= 1.1.0), scales (>=\n1.2.0), stats, tibble, vctrs (>= 0.5.0), withr (>= 2.5.0)",
+ "Suggests": "covr, dplyr, ggplot2movies, hexbin, Hmisc, knitr, lattice,\nmapproj, maps, multcomp, munsell, nlme, profvis, quantreg,\nragg, RColorBrewer, rmarkdown, rpart, sf (>= 0.7-3), svglite\n(>= 1.2.0.9001), testthat (>= 3.1.2), vdiffr (>= 1.0.0), xml2",
+ "Enhances": "sp",
+ "VignetteBuilder": "knitr",
+ "Config/Needs/website": "ggtext, tidyr, forcats, tidyverse/tidytemplate",
+ "Config/testthat/edition": "3",
+ "Encoding": "UTF-8",
+ "LazyData": "true",
+ "RoxygenNote": "7.2.3",
+ "Collate": "'ggproto.R' 'ggplot-global.R' 'aaa-.R'\n'aes-colour-fill-alpha.R' 'aes-evaluation.R'\n'aes-group-order.R' 'aes-linetype-size-shape.R'\n'aes-position.R' 'compat-plyr.R' 'utilities.R' 'aes.R'\n'utilities-checks.R' 'legend-draw.R' 'geom-.R'\n'annotation-custom.R' 'annotation-logticks.R' 'geom-polygon.R'\n'geom-map.R' 'annotation-map.R' 'geom-raster.R'\n'annotation-raster.R' 'annotation.R' 'autolayer.R' 'autoplot.R'\n'axis-secondary.R' 'backports.R' 'bench.R' 'bin.R' 'coord-.R'\n'coord-cartesian-.R' 'coord-fixed.R' 'coord-flip.R'\n'coord-map.R' 'coord-munch.R' 'coord-polar.R'\n'coord-quickmap.R' 'coord-sf.R' 'coord-transform.R' 'data.R'\n'facet-.R' 'facet-grid-.R' 'facet-null.R' 'facet-wrap.R'\n'fortify-lm.R' 'fortify-map.R' 'fortify-multcomp.R'\n'fortify-spatial.R' 'fortify.R' 'stat-.R' 'geom-abline.R'\n'geom-rect.R' 'geom-bar.R' 'geom-bin2d.R' 'geom-blank.R'\n'geom-boxplot.R' 'geom-col.R' 'geom-path.R' 'geom-contour.R'\n'geom-count.R' 'geom-crossbar.R' 'geom-segment.R'\n'geom-curve.R' 'geom-defaults.R' 'geom-ribbon.R'\n'geom-density.R' 'geom-density2d.R' 'geom-dotplot.R'\n'geom-errorbar.R' 'geom-errorbarh.R' 'geom-freqpoly.R'\n'geom-function.R' 'geom-hex.R' 'geom-histogram.R'\n'geom-hline.R' 'geom-jitter.R' 'geom-label.R'\n'geom-linerange.R' 'geom-point.R' 'geom-pointrange.R'\n'geom-quantile.R' 'geom-rug.R' 'geom-sf.R' 'geom-smooth.R'\n'geom-spoke.R' 'geom-text.R' 'geom-tile.R' 'geom-violin.R'\n'geom-vline.R' 'ggplot2-package.R' 'grob-absolute.R'\n'grob-dotstack.R' 'grob-null.R' 'grouping.R' 'guide-bins.R'\n'guide-colorbar.R' 'guide-colorsteps.R' 'guide-legend.R'\n'guides-.R' 'guides-axis.R' 'guides-grid.R' 'guides-none.R'\n'hexbin.R' 'import-standalone-obj-type.R'\n'import-standalone-types-check.R' 'labeller.R' 'labels.R'\n'layer.R' 'layer-sf.R' 'layout.R' 'limits.R' 'margins.R'\n'performance.R' 'plot-build.R' 'plot-construction.R'\n'plot-last.R' 'plot.R' 'position-.R' 'position-collide.R'\n'position-dodge.R' 'position-dodge2.R' 'position-identity.R'\n'position-jitter.R' 'position-jitterdodge.R' 'position-nudge.R'\n'position-stack.R' 'quick-plot.R' 'reshape-add-margins.R'\n'save.R' 'scale-.R' 'scale-alpha.R' 'scale-binned.R'\n'scale-brewer.R' 'scale-colour.R' 'scale-continuous.R'\n'scale-date.R' 'scale-discrete-.R' 'scale-expansion.R'\n'scale-gradient.R' 'scale-grey.R' 'scale-hue.R'\n'scale-identity.R' 'scale-linetype.R' 'scale-linewidth.R'\n'scale-manual.R' 'scale-shape.R' 'scale-size.R' 'scale-steps.R'\n'scale-type.R' 'scale-view.R' 'scale-viridis.R' 'scales-.R'\n'stat-align.R' 'stat-bin.R' 'stat-bin2d.R' 'stat-bindot.R'\n'stat-binhex.R' 'stat-boxplot.R' 'stat-contour.R'\n'stat-count.R' 'stat-density-2d.R' 'stat-density.R'\n'stat-ecdf.R' 'stat-ellipse.R' 'stat-function.R'\n'stat-identity.R' 'stat-qq-line.R' 'stat-qq.R'\n'stat-quantilemethods.R' 'stat-sf-coordinates.R' 'stat-sf.R'\n'stat-smooth-methods.R' 'stat-smooth.R' 'stat-sum.R'\n'stat-summary-2d.R' 'stat-summary-bin.R' 'stat-summary-hex.R'\n'stat-summary.R' 'stat-unique.R' 'stat-ydensity.R'\n'summarise-plot.R' 'summary.R' 'theme-elements.R' 'theme.R'\n'theme-defaults.R' 'theme-current.R' 'utilities-break.R'\n'utilities-grid.R' 'utilities-help.R' 'utilities-matrix.R'\n'utilities-resolution.R' 'utilities-table.R'\n'utilities-tidy-eval.R' 'zxx.R' 'zzz.R'",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-10-11 08:54:22 UTC; thomas",
+ "Author": "Hadley Wickham [aut] (),\n Winston Chang [aut] (),\n Lionel Henry [aut],\n Thomas Lin Pedersen [aut, cre]\n (),\n Kohske Takahashi [aut],\n Claus Wilke [aut] (),\n Kara Woo [aut] (),\n Hiroaki Yutani [aut] (),\n Dewey Dunnington [aut] (),\n Posit, PBC [cph, fnd]",
+ "Maintainer": "Thomas Lin Pedersen ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-10-12 11:40:02 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 06:44:25 UTC; windows"
+ }
+ },
+ "gh": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "gh",
+ "Title": "'GitHub' 'API'",
+ "Version": "1.4.0",
+ "Authors@R": "c(\n person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"cre\", \"ctb\")),\n person(\"Jennifer\", \"Bryan\", role = \"aut\"),\n person(\"Hadley\", \"Wickham\", role = \"aut\"),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "Minimal client to access the 'GitHub' 'API'.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://gh.r-lib.org/, https://github.com/r-lib/gh#readme",
+ "BugReports": "https://github.com/r-lib/gh/issues",
+ "Depends": "R (>= 3.4)",
+ "Imports": "cli (>= 3.0.1), gitcreds, httr2, ini, jsonlite, rlang (>=\n1.0.0)",
+ "Suggests": "covr, knitr, mockery, rmarkdown, rprojroot, spelling,\ntestthat (>= 3.0.0), withr",
+ "VignetteBuilder": "knitr",
+ "Encoding": "UTF-8",
+ "Language": "en-US",
+ "RoxygenNote": "7.2.3",
+ "Config/testthat/edition": "3",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-02-22 19:58:53 UTC; gaborcsardi",
+ "Author": "Gábor Csárdi [cre, ctb],\n Jennifer Bryan [aut],\n Hadley Wickham [aut],\n RStudio [cph, fnd]",
+ "Maintainer": "Gábor Csárdi ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-02-22 20:20:02 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 06:27:00 UTC; windows"
+ }
+ },
+ "gitcreds": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "gitcreds",
+ "Title": "Query 'git' Credentials from 'R'",
+ "Version": "0.1.2",
+ "Authors@R": "c(\n person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "Query, set, delete credentials from the 'git' credential\n store. Manage 'GitHub' tokens and other 'git' credentials. This\n package is to be used by other packages that need to authenticate to\n 'GitHub' and/or other 'git' repositories.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://gitcreds.r-lib.org/, https://github.com/r-lib/gitcreds",
+ "BugReports": "https://github.com/r-lib/gitcreds/issues",
+ "Depends": "R (>= 3.4)",
+ "Suggests": "codetools, covr, knitr, mockery, oskeyring, rmarkdown,\ntestthat (>= 3.0.0), withr",
+ "VignetteBuilder": "knitr",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.1.9000",
+ "SystemRequirements": "git",
+ "Config/testthat/edition": "3",
+ "NeedsCompilation": "no",
+ "Packaged": "2022-09-08 10:28:07 UTC; gaborcsardi",
+ "Author": "Gábor Csárdi [aut, cre],\n RStudio [cph, fnd]",
+ "Maintainer": "Gábor Csárdi ",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-09-08 10:42:55 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 01:13:09 UTC; windows"
+ }
+ },
+ "globals": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "globals",
+ "Version": "0.16.2",
+ "Depends": "R (>= 3.1.2)",
+ "Imports": "codetools",
+ "Title": "Identify Global Objects in R Expressions",
+ "Authors@R": "c(\n person(\"Henrik\", \"Bengtsson\", role=c(\"aut\", \"cre\", \"cph\"),\n email=\"henrikb@braju.com\"),\n person(\"Davis\",\"Vaughan\", role=\"ctb\",\n email=\"davis@rstudio.com\"))",
+ "Description": "Identifies global (\"unknown\" or \"free\") objects in R expressions\n by code inspection using various strategies (ordered, liberal, or\n conservative). The objective of this package is to make it as simple as\n possible to identify global objects for the purpose of exporting them in\n parallel, distributed compute environments.",
+ "License": "LGPL (>= 2.1)",
+ "LazyLoad": "TRUE",
+ "ByteCompile": "TRUE",
+ "URL": "https://globals.futureverse.org,\nhttps://github.com/HenrikBengtsson/globals",
+ "BugReports": "https://github.com/HenrikBengtsson/globals/issues",
+ "RoxygenNote": "7.2.2",
+ "NeedsCompilation": "no",
+ "Packaged": "2022-11-21 20:18:24 UTC; hb",
+ "Author": "Henrik Bengtsson [aut, cre, cph],\n Davis Vaughan [ctb]",
+ "Maintainer": "Henrik Bengtsson ",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-11-21 21:10:02 UTC",
+ "Encoding": "UTF-8",
+ "Built": "R 4.3.0; ; 2024-01-23 02:20:25 UTC; windows"
+ }
+ },
+ "glue": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "glue",
+ "Title": "Interpreted String Literals",
+ "Version": "1.6.2",
+ "Authors@R": "c(\n person(\"Jim\", \"Hester\", role = \"aut\",\n comment = c(ORCID = \"0000-0002-2739-7082\")),\n person(\"Jennifer\", \"Bryan\", , \"jenny@rstudio.com\", role = c(\"aut\", \"cre\"),\n comment = c(ORCID = \"0000-0002-6983-2759\")),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "An implementation of interpreted string literals, inspired by\n Python's Literal String Interpolation\n and Docstrings\n and Julia's Triple-Quoted\n String Literals\n .",
+ "License": "MIT + file LICENSE",
+ "URL": "https://github.com/tidyverse/glue, https://glue.tidyverse.org/",
+ "BugReports": "https://github.com/tidyverse/glue/issues",
+ "Depends": "R (>= 3.4)",
+ "Imports": "methods",
+ "Suggests": "covr, crayon, DBI, dplyr, forcats, ggplot2, knitr, magrittr,\nmicrobenchmark, R.utils, rmarkdown, rprintf, RSQLite, stringr,\ntestthat (>= 3.0.0), vctrs (>= 0.3.0), waldo (>= 0.3.0), withr",
+ "VignetteBuilder": "knitr",
+ "ByteCompile": "true",
+ "Config/Needs/website": "hadley/emo, tidyverse/tidytemplate",
+ "Config/testthat/edition": "3",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.1.2",
+ "NeedsCompilation": "yes",
+ "Packaged": "2022-02-23 22:50:40 UTC; jenny",
+ "Author": "Jim Hester [aut] (),\n Jennifer Bryan [aut, cre] (),\n RStudio [cph, fnd]",
+ "Maintainer": "Jennifer Bryan ",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-02-24 07:50:20 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 01:38:37 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "golem": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "golem",
+ "Title": "A Framework for Robust Shiny Applications",
+ "Version": "0.4.1",
+ "Authors@R": "c(\n person(\"Colin\", \"Fay\", , \"contact@colinfay.me\", role = c(\"cre\", \"aut\"),\n comment = c(ORCID = \"0000-0001-7343-1846\")),\n person(\"Vincent\", \"Guyader\", , \"vincent@thinkr.fr\", role = \"aut\",\n comment = c(ORCID = \"0000-0003-0671-9270\", \"previous maintainer\")),\n person(\"Sébastien\", \"Rochette\", , \"sebastien@thinkr.fr\", role = \"aut\",\n comment = c(ORCID = \"0000-0002-1565-9313\")),\n person(\"Cervan\", \"Girard\", , \"cervan@thinkr.fr\", role = \"aut\",\n comment = c(ORCID = \"0000-0002-4816-4624\")),\n person(\"Novica\", \"Nakov\", , \"nnovica@gmail.com\", role = \"ctb\"),\n person(\"David\", \"Granjon\", , \"dgranjon@ymail.com\", role = \"ctb\"),\n person(\"Arthur\", \"Bréant\", , \"arthur@thinkr.fr\", role = \"ctb\"),\n person(\"Antoine\", \"Languillaume\", , \"antoine@thinkr.fr\", role = \"ctb\"),\n person(\"ThinkR\", role = \"cph\")\n )",
+ "Description": "An opinionated framework for building a production-ready\n 'Shiny' application. This package contains a series of tools for\n building a robust 'Shiny' application from start to finish.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://github.com/ThinkR-open/golem",
+ "BugReports": "https://github.com/ThinkR-open/golem/issues",
+ "Depends": "R (>= 3.0)",
+ "Imports": "attempt (>= 0.3.0), config, here, htmltools, rlang (>= 1.0.0),\nshiny (>= 1.5.0), utils, yaml",
+ "Suggests": "covr, cli (>= 2.0.0), crayon, devtools, dockerfiler (>=\n0.2.0), knitr, pkgload, pkgbuild, pkgdown, processx, purrr,\nrcmdcheck, roxygen2, rmarkdown, rsconnect, spelling, stringr,\ntestthat, tools, withr, attachment (>= 0.2.5), renv, usethis\n(>= 1.6.0), fs, rstudioapi, desc",
+ "VignetteBuilder": "knitr",
+ "Config/testthat/edition": "3",
+ "Encoding": "UTF-8",
+ "Language": "en-US",
+ "RoxygenNote": "7.2.3",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-06-05 15:00:10 UTC; colinfay",
+ "Author": "Colin Fay [cre, aut] (),\n Vincent Guyader [aut] (,\n previous maintainer),\n Sébastien Rochette [aut] (),\n Cervan Girard [aut] (),\n Novica Nakov [ctb],\n David Granjon [ctb],\n Arthur Bréant [ctb],\n Antoine Languillaume [ctb],\n ThinkR [cph]",
+ "Maintainer": "Colin Fay ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-06-05 15:50:03 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 08:12:58 UTC; windows"
+ }
+ },
+ "gtable": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "gtable",
+ "Title": "Arrange 'Grobs' in Tables",
+ "Version": "0.3.4",
+ "Authors@R": "\n c(person(given = \"Hadley\",\n family = \"Wickham\",\n role = \"aut\",\n email = \"hadley@posit.co\"),\n person(given = \"Thomas Lin\",\n family = \"Pedersen\",\n role = c(\"aut\", \"cre\"),\n email = \"thomas.pedersen@posit.co\"),\n person(given = \"Posit Software, PBC\",\n role = \"cph\"))",
+ "Description": "Tools to make it easier to work with \"tables\" of\n 'grobs'. The 'gtable' package defines a 'gtable' grob class that specifies a\n grid along with a list of grobs and their placement in the grid. Further the\n package makes it easy to manipulate and combine 'gtable' objects so that \n complex compositions can be built up sequentially.",
+ "License": "MIT + file LICENSE",
+ "Depends": "R (>= 3.5)",
+ "Imports": "cli, glue, grid, lifecycle, rlang (>= 1.1.0)",
+ "Suggests": "covr, ggplot2, knitr, profvis, rmarkdown, testthat (>= 3.0.0)",
+ "VignetteBuilder": "knitr",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "URL": "https://gtable.r-lib.org, https://github.com/r-lib/gtable",
+ "BugReports": "https://github.com/r-lib/gtable/issues",
+ "Config/testthat/edition": "3",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-08-21 10:36:53 UTC; thomas",
+ "Author": "Hadley Wickham [aut],\n Thomas Lin Pedersen [aut, cre],\n Posit Software, PBC [cph]",
+ "Maintainer": "Thomas Lin Pedersen ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-08-21 11:20:02 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 03:51:11 UTC; windows"
+ }
+ },
+ "here": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "here",
+ "Title": "A Simpler Way to Find Your Files",
+ "Version": "1.0.1",
+ "Date": "2020-12-13",
+ "Authors@R": "\n c(person(given = \"Kirill\",\n family = \"M\\u00fcller\",\n role = c(\"aut\", \"cre\"),\n email = \"krlmlr+r@mailbox.org\",\n comment = c(ORCID = \"0000-0002-1416-3412\")),\n person(given = \"Jennifer\",\n family = \"Bryan\",\n role = \"ctb\",\n email = \"jenny@rstudio.com\",\n comment = c(ORCID = \"0000-0002-6983-2759\")))",
+ "Description": "Constructs paths to your project's files.\n Declare the relative path of a file within your project with 'i_am()'.\n Use the 'here()' function as a drop-in replacement for 'file.path()',\n it will always locate the files relative to your project root.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://here.r-lib.org/, https://github.com/r-lib/here",
+ "BugReports": "https://github.com/r-lib/here/issues",
+ "Imports": "rprojroot (>= 2.0.2)",
+ "Suggests": "conflicted, covr, fs, knitr, palmerpenguins, plyr, readr,\nrlang, rmarkdown, testthat, uuid, withr",
+ "VignetteBuilder": "knitr",
+ "Encoding": "UTF-8",
+ "LazyData": "true",
+ "RoxygenNote": "7.1.1.9000",
+ "Config/testthat/edition": "3",
+ "NeedsCompilation": "no",
+ "Packaged": "2020-12-13 06:59:33 UTC; kirill",
+ "Author": "Kirill Müller [aut, cre] (),\n Jennifer Bryan [ctb] ()",
+ "Maintainer": "Kirill Müller ",
+ "Repository": "RSPM",
+ "Date/Publication": "2020-12-13 07:30:02 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 02:06:41 UTC; windows"
+ }
+ },
+ "highr": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "highr",
+ "Type": "Package",
+ "Title": "Syntax Highlighting for R Source Code",
+ "Version": "0.10",
+ "Authors@R": "c(\n person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")),\n person(\"Yixuan\", \"Qiu\", role = \"aut\"),\n person(\"Christopher\", \"Gandrud\", role = \"ctb\"),\n person(\"Qiang\", \"Li\", role = \"ctb\")\n )",
+ "Description": "Provides syntax highlighting for R source code. Currently it\n supports LaTeX and HTML output. Source code of other languages is supported\n via Andre Simon's highlight package ().",
+ "Depends": "R (>= 3.3.0)",
+ "Imports": "xfun (>= 0.18)",
+ "Suggests": "knitr, markdown, testit",
+ "License": "GPL",
+ "URL": "https://github.com/yihui/highr",
+ "BugReports": "https://github.com/yihui/highr/issues",
+ "VignetteBuilder": "knitr",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "NeedsCompilation": "no",
+ "Packaged": "2022-12-22 06:43:07 UTC; yihui",
+ "Author": "Yihui Xie [aut, cre] (),\n Yixuan Qiu [aut],\n Christopher Gandrud [ctb],\n Qiang Li [ctb]",
+ "Maintainer": "Yihui Xie ",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-12-22 07:00:02 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 01:42:32 UTC; windows"
+ }
+ },
+ "hms": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "hms",
+ "Title": "Pretty Time of Day",
+ "Date": "2023-03-21",
+ "Version": "1.1.3",
+ "Authors@R": "c(\n person(\"Kirill\", \"Müller\", role = c(\"aut\", \"cre\"), email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\")),\n person(\"R Consortium\", role = \"fnd\"),\n person(\"RStudio\", role = \"fnd\")\n )",
+ "Description": "Implements an S3 class for storing and formatting time-of-day\n values, based on the 'difftime' class.",
+ "Imports": "lifecycle, methods, pkgconfig, rlang (>= 1.0.2), vctrs (>=\n0.3.8)",
+ "Suggests": "crayon, lubridate, pillar (>= 1.1.0), testthat (>= 3.0.0)",
+ "License": "MIT + file LICENSE",
+ "Encoding": "UTF-8",
+ "URL": "https://hms.tidyverse.org/, https://github.com/tidyverse/hms",
+ "BugReports": "https://github.com/tidyverse/hms/issues",
+ "RoxygenNote": "7.2.3",
+ "Config/testthat/edition": "3",
+ "Config/autostyle/scope": "line_breaks",
+ "Config/autostyle/strict": "false",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-03-21 16:52:11 UTC; kirill",
+ "Author": "Kirill Müller [aut, cre] (),\n R Consortium [fnd],\n RStudio [fnd]",
+ "Maintainer": "Kirill Müller ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-03-21 18:10:02 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 06:39:56 UTC; windows"
+ }
+ },
+ "htmltools": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "htmltools",
+ "Type": "Package",
+ "Title": "Tools for HTML",
+ "Version": "0.5.6.1",
+ "Authors@R": "c(\n person(\"Joe\", \"Cheng\", role = \"aut\", email = \"joe@posit.co\"),\n person(\"Carson\", \"Sievert\", role = c(\"aut\", \"cre\"), email = \"carson@posit.co\", comment = c(ORCID = \"0000-0002-4958-2844\")),\n person(\"Barret\", \"Schloerke\", role = \"aut\", email = \"barret@posit.co\", comment = c(ORCID = \"0000-0001-9986-114X\")),\n person(\"Winston\", \"Chang\", role = \"aut\", email = \"winston@posit.co\", comment = c(ORCID = \"0000-0002-1576-2126\")),\n person(\"Yihui\", \"Xie\", role = \"aut\", email = \"yihui@posit.co\"),\n person(\"Jeff\", \"Allen\", role = \"aut\"),\n person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "Tools for HTML generation and output.",
+ "Depends": "R (>= 2.14.1)",
+ "Imports": "utils, digest, grDevices, base64enc, rlang (>= 0.4.12),\nfastmap (>= 1.1.0), ellipsis",
+ "Suggests": "markdown, testthat, withr, Cairo, ragg, shiny",
+ "Enhances": "knitr",
+ "License": "GPL (>= 2)",
+ "URL": "https://github.com/rstudio/htmltools,\nhttps://rstudio.github.io/htmltools/",
+ "BugReports": "https://github.com/rstudio/htmltools/issues",
+ "RoxygenNote": "7.2.3",
+ "Encoding": "UTF-8",
+ "Collate": "'colors.R' 'fill.R' 'html_dependency.R' 'html_escape.R'\n'html_print.R' 'htmltools-package.R' 'images.R' 'known_tags.R'\n'selector.R' 'staticimports.R' 'tag_query.R' 'utils.R' 'tags.R'\n'template.R'",
+ "Config/Needs/check": "knitr",
+ "Config/Needs/website": "rstudio/quillt, bench",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-10-06 15:29:21 UTC; cpsievert",
+ "Author": "Joe Cheng [aut],\n Carson Sievert [aut, cre] (),\n Barret Schloerke [aut] (),\n Winston Chang [aut] (),\n Yihui Xie [aut],\n Jeff Allen [aut],\n Posit Software, PBC [cph, fnd]",
+ "Maintainer": "Carson Sievert ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-10-06 20:40:06 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-10-09 11:34:54 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "htmlwidgets": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "htmlwidgets",
+ "Type": "Package",
+ "Title": "HTML Widgets for R",
+ "Version": "1.6.2",
+ "Authors@R": "c(\n person(\"Ramnath\", \"Vaidyanathan\", role = c(\"aut\", \"cph\")),\n person(\"Yihui\", \"Xie\", role = c(\"aut\")),\n person(\"JJ\", \"Allaire\", role = c(\"aut\")),\n person(\"Joe\", \"Cheng\", role = c(\"aut\"), email = \"joe@rstudio.com\"),\n person(\"Carson\", \"Sievert\", role = c(\"aut\", \"cre\"), email = \"carson@rstudio.com\", comment = c(ORCID = \"0000-0002-4958-2844\")),\n person(\"Kenton\", \"Russell\", role = c(\"aut\", \"cph\")),\n person(\"Ellis\", \"Hughes\", role = c(\"ctb\")),\n person(family = \"RStudio\", role = \"cph\")\n )",
+ "Description": "A framework for creating HTML widgets that render in various\n contexts including the R console, 'R Markdown' documents, and 'Shiny'\n web applications.",
+ "License": "MIT + file LICENSE",
+ "VignetteBuilder": "knitr",
+ "Imports": "grDevices, htmltools (>= 0.5.4), jsonlite (>= 0.9.16), yaml,\nknitr (>= 1.8), rmarkdown",
+ "Suggests": "testthat",
+ "Enhances": "shiny (>= 1.1)",
+ "URL": "https://github.com/ramnathv/htmlwidgets",
+ "BugReports": "https://github.com/ramnathv/htmlwidgets/issues",
+ "RoxygenNote": "7.2.3",
+ "Encoding": "UTF-8",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-03-17 15:34:40 UTC; cpsievert",
+ "Author": "Ramnath Vaidyanathan [aut, cph],\n Yihui Xie [aut],\n JJ Allaire [aut],\n Joe Cheng [aut],\n Carson Sievert [aut, cre] (),\n Kenton Russell [aut, cph],\n Ellis Hughes [ctb],\n RStudio [cph]",
+ "Maintainer": "Carson Sievert ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-03-17 16:50:06 UTC",
+ "Built": "R 4.3.0; ; 2023-11-03 12:36:39 UTC; windows"
+ }
+ },
+ "httpuv": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Type": "Package",
+ "Package": "httpuv",
+ "Title": "HTTP and WebSocket Server Library",
+ "Version": "1.6.12",
+ "Authors@R": "c(\n person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"),\n person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = c(\"aut\", \"cre\")),\n person(\"Posit, PBC\", \"fnd\", role = \"cph\"),\n person(\"Hector\", \"Corrada Bravo\", role = \"ctb\"),\n person(\"Jeroen\", \"Ooms\", role = \"ctb\"),\n person(\"Andrzej\", \"Krzemienski\", role = \"cph\",\n comment = \"optional.hpp\"),\n person(\"libuv project contributors\", role = \"cph\",\n comment = \"libuv library, see src/libuv/AUTHORS file\"),\n person(\"Joyent, Inc. and other Node contributors\", role = \"cph\",\n comment = \"libuv library, see src/libuv/AUTHORS file; and http-parser library, see src/http-parser/AUTHORS file\"),\n person(\"Niels\", \"Provos\", role = \"cph\",\n comment = \"libuv subcomponent: tree.h\"),\n person(\"Internet Systems Consortium, Inc.\", role = \"cph\",\n comment = \"libuv subcomponent: inet_pton and inet_ntop, contained in src/libuv/src/inet.c\"),\n person(\"Alexander\", \"Chemeris\", role = \"cph\",\n comment = \"libuv subcomponent: stdint-msvc2008.h (from msinttypes)\"),\n person(\"Google, Inc.\", role = \"cph\",\n comment = \"libuv subcomponent: pthread-fixes.c\"),\n person(\"Sony Mobile Communcations AB\", role = \"cph\",\n comment = \"libuv subcomponent: pthread-fixes.c\"),\n person(\"Berkeley Software Design Inc.\", role = \"cph\",\n comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"),\n person(\"Kenneth\", \"MacKay\", role = \"cph\",\n comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"),\n person(\"Emergya (Cloud4all, FP7/2007-2013, grant agreement no 289016)\", role = \"cph\",\n comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"),\n person(\"Steve\", \"Reid\", role = \"aut\",\n comment = \"SHA-1 implementation\"),\n person(\"James\", \"Brown\", role = \"aut\",\n comment = \"SHA-1 implementation\"),\n person(\"Bob\", \"Trower\", role = \"aut\",\n comment = \"base64 implementation\"),\n person(\"Alexander\", \"Peslyak\", role = \"aut\",\n comment = \"MD5 implementation\"),\n person(\"Trantor Standard Systems\", role = \"cph\",\n comment = \"base64 implementation\"),\n person(\"Igor\", \"Sysoev\", role = \"cph\",\n comment = \"http-parser\")\n )",
+ "Description": "Provides low-level socket and protocol support for handling\n HTTP and WebSocket requests directly from within R. It is primarily\n intended as a building block for other packages, rather than making it\n particularly easy to create complete web applications using httpuv\n alone. httpuv is built on top of the libuv and http-parser C\n libraries, both of which were developed by Joyent, Inc. (See LICENSE\n file for libuv and http-parser license information.)",
+ "License": "GPL (>= 2) | file LICENSE",
+ "URL": "https://github.com/rstudio/httpuv",
+ "BugReports": "https://github.com/rstudio/httpuv/issues",
+ "Depends": "R (>= 2.15.1)",
+ "Imports": "later (>= 0.8.0), promises, R6, Rcpp (>= 1.0.7), utils",
+ "Suggests": "callr, curl, testthat, websocket",
+ "LinkingTo": "later, Rcpp",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "SystemRequirements": "GNU make, zlib",
+ "Collate": "'RcppExports.R' 'httpuv.R' 'random_port.R' 'server.R'\n'staticServer.R' 'static_paths.R' 'utils.R'",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-10-23 17:02:22 UTC; garrick",
+ "Author": "Joe Cheng [aut],\n Winston Chang [aut, cre],\n Posit, PBC fnd [cph],\n Hector Corrada Bravo [ctb],\n Jeroen Ooms [ctb],\n Andrzej Krzemienski [cph] (optional.hpp),\n libuv project contributors [cph] (libuv library, see src/libuv/AUTHORS\n file),\n Joyent, Inc. and other Node contributors [cph] (libuv library, see\n src/libuv/AUTHORS file; and http-parser library, see\n src/http-parser/AUTHORS file),\n Niels Provos [cph] (libuv subcomponent: tree.h),\n Internet Systems Consortium, Inc. [cph] (libuv subcomponent: inet_pton\n and inet_ntop, contained in src/libuv/src/inet.c),\n Alexander Chemeris [cph] (libuv subcomponent: stdint-msvc2008.h (from\n msinttypes)),\n Google, Inc. [cph] (libuv subcomponent: pthread-fixes.c),\n Sony Mobile Communcations AB [cph] (libuv subcomponent:\n pthread-fixes.c),\n Berkeley Software Design Inc. [cph] (libuv subcomponent:\n android-ifaddrs.h, android-ifaddrs.c),\n Kenneth MacKay [cph] (libuv subcomponent: android-ifaddrs.h,\n android-ifaddrs.c),\n Emergya (Cloud4all, FP7/2007-2013, grant agreement no 289016) [cph]\n (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c),\n Steve Reid [aut] (SHA-1 implementation),\n James Brown [aut] (SHA-1 implementation),\n Bob Trower [aut] (base64 implementation),\n Alexander Peslyak [aut] (MD5 implementation),\n Trantor Standard Systems [cph] (base64 implementation),\n Igor Sysoev [cph] (http-parser)",
+ "Maintainer": "Winston Chang ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-10-23 19:40:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-10-24 11:50:39 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "httr": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "httr",
+ "Title": "Tools for Working with URLs and HTTP",
+ "Version": "1.4.7",
+ "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")),\n person(\"Posit, PBC\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "Useful tools for working with HTTP organised by HTTP verbs\n (GET(), POST(), etc). Configuration functions make it easy to control\n additional request components (authenticate(), add_headers() and so\n 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.5)",
+ "Imports": "curl (>= 5.0.2), jsonlite, mime, openssl (>= 0.8), R6",
+ "Suggests": "covr, httpuv, jpeg, knitr, png, readr, rmarkdown, testthat\n(>= 0.8.0), xml2",
+ "VignetteBuilder": "knitr",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-08-15 02:56:56 UTC; hadleywickham",
+ "Author": "Hadley Wickham [aut, cre],\n Posit, PBC [cph, fnd]",
+ "Maintainer": "Hadley Wickham ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-08-15 09:00:02 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 02:52:42 UTC; windows"
+ }
+ },
+ "httr2": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "httr2",
+ "Title": "Perform HTTP Requests and Process the Responses",
+ "Version": "0.2.3",
+ "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "Tools for creating and modifying HTTP requests, then\n performing them and processing the results. 'httr2' is a modern\n re-imagining of 'httr' that uses a pipe-based interface and solves\n more of the problems that API wrapping packages face.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://httr2.r-lib.org, https://github.com/r-lib/httr2",
+ "BugReports": "https://github.com/r-lib/httr2/issues",
+ "Depends": "R (>= 3.4)",
+ "Imports": "cli (>= 3.0.0), curl, glue, magrittr, openssl, R6, rappdirs,\nrlang (>= 1.0.0), withr",
+ "Suggests": "askpass, bench, clipr, covr, docopt, httpuv, jose, jsonlite,\nknitr, purrr, rmarkdown, testthat (>= 3.0.0), tibble, webfakes,\nxml2",
+ "VignetteBuilder": "knitr",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "Config/testthat/edition": "3",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-05-08 18:56:52 UTC; hadleywickham",
+ "Author": "Hadley Wickham [aut, cre],\n RStudio [cph, fnd]",
+ "Maintainer": "Hadley Wickham ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-05-08 19:30:02 UTC",
+ "Built": "R 4.3.0; ; 2023-05-29 16:08:25 UTC; windows"
+ }
+ },
+ "ini": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "ini",
+ "Type": "Package",
+ "Title": "Read and Write '.ini' Files",
+ "Version": "0.3.1",
+ "Date": "2018-05-19",
+ "Author": "David Valentim Dias",
+ "Maintainer": "David Valentim Dias ",
+ "Description": "Parse simple '.ini' configuration files to an structured list. Users\n can manipulate this resulting list with lapply() functions. This same\n structured list can be used to write back to file after modifications.",
+ "License": "GPL-3",
+ "URL": "https://github.com/dvdscripter/ini",
+ "BugReports": "https://github.com/dvdscripter/ini/issues",
+ "LazyData": "FALSE",
+ "RoxygenNote": "6.0.1",
+ "Suggests": "testthat",
+ "NeedsCompilation": "no",
+ "Packaged": "2018-05-19 23:19:45 UTC; CLIENTE",
+ "Repository": "RSPM",
+ "Date/Publication": "2018-05-20 03:26:39 UTC",
+ "Encoding": "UTF-8",
+ "Built": "R 4.3.0; ; 2024-01-23 03:20:38 UTC; windows"
+ }
+ },
+ "isoband": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "isoband",
+ "Title": "Generate Isolines and Isobands from Regularly Spaced Elevation\nGrids",
+ "Version": "0.2.7",
+ "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"),\n comment = c(ORCID = \"0000-0003-4757-117X\")),\n person(\"Claus O.\", \"Wilke\", , \"wilke@austin.utexas.edu\", role = \"aut\",\n comment = c(\"Original author\", ORCID = \"0000-0002-7470-9261\")),\n person(\"Thomas Lin\", \"Pedersen\", , \"thomasp85@gmail.com\", role = \"aut\",\n comment = c(ORCID = \"0000-0002-5147-4711\"))\n )",
+ "Description": "A fast C++ implementation to generate contour lines\n (isolines) and contour polygons (isobands) from regularly spaced grids\n containing elevation data.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://isoband.r-lib.org",
+ "BugReports": "https://github.com/r-lib/isoband/issues",
+ "Imports": "grid, utils",
+ "Suggests": "covr, ggplot2, knitr, magick, microbenchmark, rmarkdown, sf,\ntestthat, xml2",
+ "VignetteBuilder": "knitr",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "Config/testthat/edition": "3",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "SystemRequirements": "C++11",
+ "NeedsCompilation": "yes",
+ "Packaged": "2022-12-19 20:10:02 UTC; hadleywickham",
+ "Author": "Hadley Wickham [aut, cre] (),\n Claus O. Wilke [aut] (Original author,\n ),\n Thomas Lin Pedersen [aut] ()",
+ "Maintainer": "Hadley Wickham ",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-12-20 10:00:13 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 02:23:57 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "jquerylib": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "jquerylib",
+ "Title": "Obtain 'jQuery' as an HTML Dependency Object",
+ "Version": "0.1.4",
+ "Authors@R": "c(\n person(\"Carson\", \"Sievert\", role = c(\"aut\", \"cre\"), email = \"carson@rstudio.com\", comment = c(ORCID = \"0000-0002-4958-2844\")),\n person(\"Joe\", \"Cheng\", role = \"aut\", email = \"joe@rstudio.com\"),\n person(family = \"RStudio\", role = \"cph\"),\n person(family = \"jQuery Foundation\", role = \"cph\",\n comment = \"jQuery library and jQuery UI library\"),\n person(family = \"jQuery contributors\", role = c(\"ctb\", \"cph\"),\n comment = \"jQuery library; authors listed in inst/lib/jquery-AUTHORS.txt\")\n )",
+ "Description": "Obtain any major version of 'jQuery' () and use it in any webpage generated by 'htmltools' (e.g. 'shiny', 'htmlwidgets', and 'rmarkdown').\n Most R users don't need to use this package directly, but other R packages (e.g. 'shiny', 'rmarkdown', etc.) depend on this package to avoid bundling redundant copies of 'jQuery'.",
+ "License": "MIT + file LICENSE",
+ "Encoding": "UTF-8",
+ "Config/testthat/edition": "3",
+ "RoxygenNote": "7.0.2",
+ "Imports": "htmltools",
+ "Suggests": "testthat",
+ "NeedsCompilation": "no",
+ "Packaged": "2021-04-26 16:40:21 UTC; cpsievert",
+ "Author": "Carson Sievert [aut, cre] (),\n Joe Cheng [aut],\n RStudio [cph],\n jQuery Foundation [cph] (jQuery library and jQuery UI library),\n jQuery contributors [ctb, cph] (jQuery library; authors listed in\n inst/lib/jquery-AUTHORS.txt)",
+ "Maintainer": "Carson Sievert ",
+ "Repository": "RSPM",
+ "Date/Publication": "2021-04-26 17:10:02 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 05:28:57 UTC; windows"
+ }
+ },
+ "jsonlite": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "jsonlite",
+ "Version": "1.8.7",
+ "Title": "A Simple and Robust JSON Parser and Generator for R",
+ "License": "MIT + file LICENSE",
+ "Depends": "methods",
+ "Authors@R": "c(\n person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroen@berkeley.edu\",\n comment = c(ORCID = \"0000-0002-4035-0289\")),\n person(\"Duncan\", \"Temple Lang\", role = \"ctb\"),\n person(\"Lloyd\", \"Hilaiel\", role = \"cph\", comment=\"author of bundled libyajl\"))",
+ "URL": "https://jeroen.r-universe.dev/jsonlite\nhttps://arxiv.org/abs/1403.2805",
+ "BugReports": "https://github.com/jeroen/jsonlite/issues",
+ "Maintainer": "Jeroen Ooms ",
+ "VignetteBuilder": "knitr, R.rsp",
+ "Description": "A reasonably fast JSON parser and generator, optimized for statistical \n data and the web. Offers simple, flexible tools for working with JSON in R, and\n is particularly powerful for building pipelines and interacting with a web API. \n The implementation is based on the mapping described in the vignette (Ooms, 2014).\n In addition to converting JSON data from/to R objects, 'jsonlite' contains \n functions to stream, validate, and prettify JSON data. The unit tests included \n with the package verify that all edge cases are encoded and decoded consistently \n for use with dynamic data in systems and applications.",
+ "Suggests": "httr, vctrs, testthat, knitr, rmarkdown, R.rsp, sf",
+ "RoxygenNote": "7.2.3",
+ "Encoding": "UTF-8",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-06-29 08:00:03 UTC; jeroen",
+ "Author": "Jeroen Ooms [aut, cre] (),\n Duncan Temple Lang [ctb],\n Lloyd Hilaiel [cph] (author of bundled libyajl)",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-06-29 22:10:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-06-30 12:00:13 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "kableExtra": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "kableExtra",
+ "Type": "Package",
+ "Title": "Construct Complex Table with 'kable' and Pipe Syntax",
+ "Version": "1.3.4",
+ "Authors@R": "c(\n person('Hao', 'Zhu', email = 'haozhu233@gmail.com', role = c('aut', 'cre'),\n comment = c(ORCID = '0000-0002-3386-6076')),\n person('Thomas', 'Travison', role = 'ctb'),\n person('Timothy', 'Tsai', role = 'ctb'),\n person('Will', 'Beasley', email = 'wibeasley@hotmail.com', role = 'ctb'),\n person('Yihui', 'Xie', email = 'xie@yihui.name', role = 'ctb'),\n person('GuangChuang', 'Yu', email = 'guangchuangyu@gmail.com', role = 'ctb'),\n person('Stéphane', 'Laurent', role = 'ctb'),\n person('Rob', 'Shepherd', role = 'ctb'),\n person('Yoni', 'Sidi', role = 'ctb'), \n person('Brian', 'Salzer', role = 'ctb'),\n person('George', 'Gui', role = 'ctb'),\n person('Yeliang', 'Fan', role = 'ctb'),\n person('Duncan', 'Murdoch', role = 'ctb'),\n person('Bill', 'Evans', role = 'ctb')\n )",
+ "Description": "Build complex HTML or 'LaTeX' tables using 'kable()' from 'knitr' \n and the piping syntax from 'magrittr'. Function 'kable()' is a light weight \n table generator coming from 'knitr'. This package simplifies the way to \n manipulate the HTML or 'LaTeX' codes generated by 'kable()' and allows \n users to construct complex tables and customize styles using a readable \n syntax. ",
+ "License": "MIT + file LICENSE",
+ "LazyData": "TRUE",
+ "URL": "http://haozhu233.github.io/kableExtra/,\nhttps://github.com/haozhu233/kableExtra",
+ "BugReports": "https://github.com/haozhu233/kableExtra/issues",
+ "Depends": "R (>= 3.1.0)",
+ "Imports": "knitr (>= 1.16), magrittr, stringr (>= 1.0), xml2 (>= 1.1.1),\nrvest, rmarkdown (>= 1.6.0), scales, viridisLite, stats,\ngrDevices, htmltools, rstudioapi, glue, tools, webshot, digest,\ngraphics, svglite",
+ "Suggests": "testthat, magick, formattable, sparkline",
+ "VignetteBuilder": "knitr",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.1.1",
+ "NeedsCompilation": "no",
+ "Packaged": "2021-02-19 18:56:12 UTC; haozhu",
+ "Author": "Hao Zhu [aut, cre] (),\n Thomas Travison [ctb],\n Timothy Tsai [ctb],\n Will Beasley [ctb],\n Yihui Xie [ctb],\n GuangChuang Yu [ctb],\n Stéphane Laurent [ctb],\n Rob Shepherd [ctb],\n Yoni Sidi [ctb],\n Brian Salzer [ctb],\n George Gui [ctb],\n Yeliang Fan [ctb],\n Duncan Murdoch [ctb],\n Bill Evans [ctb]",
+ "Maintainer": "Hao Zhu ",
+ "Repository": "RSPM",
+ "Date/Publication": "2021-02-20 05:50:07 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 08:16:59 UTC; windows"
+ }
+ },
+ "knitr": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "knitr",
+ "Type": "Package",
+ "Title": "A General-Purpose Package for Dynamic Report Generation in R",
+ "Version": "1.45",
+ "Authors@R": "c(\n person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")),\n person(\"Abhraneel\", \"Sarma\", role = \"ctb\"),\n person(\"Adam\", \"Vogt\", role = \"ctb\"),\n person(\"Alastair\", \"Andrew\", role = \"ctb\"),\n person(\"Alex\", \"Zvoleff\", role = \"ctb\"),\n person(\"Amar\", \"Al-Zubaidi\", role = \"ctb\"),\n person(\"Andre\", \"Simon\", role = \"ctb\", comment = \"the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de\"),\n person(\"Aron\", \"Atkins\", role = \"ctb\"),\n person(\"Aaron\", \"Wolen\", role = \"ctb\"),\n person(\"Ashley\", \"Manton\", role = \"ctb\"),\n person(\"Atsushi\", \"Yasumoto\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8335-495X\")),\n person(\"Ben\", \"Baumer\", role = \"ctb\"),\n person(\"Brian\", \"Diggs\", role = \"ctb\"),\n person(\"Brian\", \"Zhang\", role = \"ctb\"),\n person(\"Bulat\", \"Yapparov\", role = \"ctb\"),\n person(\"Cassio\", \"Pereira\", role = \"ctb\"),\n person(\"Christophe\", \"Dervieux\", role = \"ctb\"),\n person(\"David\", \"Hall\", role = \"ctb\"),\n person(\"David\", \"Hugh-Jones\", role = \"ctb\"),\n person(\"David\", \"Robinson\", role = \"ctb\"),\n person(\"Doug\", \"Hemken\", role = \"ctb\"),\n person(\"Duncan\", \"Murdoch\", role = \"ctb\"),\n person(\"Elio\", \"Campitelli\", role = \"ctb\"),\n person(\"Ellis\", \"Hughes\", role = \"ctb\"),\n person(\"Emily\", \"Riederer\", role = \"ctb\"),\n person(\"Fabian\", \"Hirschmann\", role = \"ctb\"),\n person(\"Fitch\", \"Simeon\", role = \"ctb\"),\n person(\"Forest\", \"Fang\", role = \"ctb\"),\n person(c(\"Frank\", \"E\", \"Harrell\", \"Jr\"), role = \"ctb\", comment = \"the Sweavel package at inst/misc/Sweavel.sty\"),\n person(\"Garrick\", \"Aden-Buie\", role = \"ctb\"),\n person(\"Gregoire\", \"Detrez\", role = \"ctb\"),\n person(\"Hadley\", \"Wickham\", role = \"ctb\"),\n person(\"Hao\", \"Zhu\", role = \"ctb\"),\n person(\"Heewon\", \"Jeon\", role = \"ctb\"),\n person(\"Henrik\", \"Bengtsson\", role = \"ctb\"),\n person(\"Hiroaki\", \"Yutani\", role = \"ctb\"),\n person(\"Ian\", \"Lyttle\", role = \"ctb\"),\n person(\"Hodges\", \"Daniel\", role = \"ctb\"),\n person(\"Jacob\", \"Bien\", role = \"ctb\"),\n person(\"Jake\", \"Burkhead\", role = \"ctb\"),\n person(\"James\", \"Manton\", role = \"ctb\"),\n person(\"Jared\", \"Lander\", role = \"ctb\"),\n person(\"Jason\", \"Punyon\", role = \"ctb\"),\n person(\"Javier\", \"Luraschi\", role = \"ctb\"),\n person(\"Jeff\", \"Arnold\", role = \"ctb\"),\n person(\"Jenny\", \"Bryan\", role = \"ctb\"),\n person(\"Jeremy\", \"Ashkenas\", role = c(\"ctb\", \"cph\"), comment = \"the CSS file at inst/misc/docco-classic.css\"),\n person(\"Jeremy\", \"Stephens\", role = \"ctb\"),\n person(\"Jim\", \"Hester\", role = \"ctb\"),\n person(\"Joe\", \"Cheng\", role = \"ctb\"),\n person(\"Johannes\", \"Ranke\", role = \"ctb\"),\n person(\"John\", \"Honaker\", role = \"ctb\"),\n person(\"John\", \"Muschelli\", role = \"ctb\"),\n person(\"Jonathan\", \"Keane\", role = \"ctb\"),\n person(\"JJ\", \"Allaire\", role = \"ctb\"),\n person(\"Johan\", \"Toloe\", role = \"ctb\"),\n person(\"Jonathan\", \"Sidi\", role = \"ctb\"),\n person(\"Joseph\", \"Larmarange\", role = \"ctb\"),\n person(\"Julien\", \"Barnier\", role = \"ctb\"),\n person(\"Kaiyin\", \"Zhong\", role = \"ctb\"),\n person(\"Kamil\", \"Slowikowski\", role = \"ctb\"),\n person(\"Karl\", \"Forner\", role = \"ctb\"),\n person(c(\"Kevin\", \"K.\"), \"Smith\", role = \"ctb\"),\n person(\"Kirill\", \"Mueller\", role = \"ctb\"),\n person(\"Kohske\", \"Takahashi\", role = \"ctb\"),\n person(\"Lorenz\", \"Walthert\", role = \"ctb\"),\n person(\"Lucas\", \"Gallindo\", role = \"ctb\"),\n person(\"Marius\", \"Hofert\", role = \"ctb\"),\n person(\"Martin\", \"Modrák\", role = \"ctb\"),\n person(\"Michael\", \"Chirico\", role = \"ctb\"),\n person(\"Michael\", \"Friendly\", role = \"ctb\"),\n person(\"Michal\", \"Bojanowski\", role = \"ctb\"),\n person(\"Michel\", \"Kuhlmann\", role = \"ctb\"),\n person(\"Miller\", \"Patrick\", role = \"ctb\"),\n person(\"Nacho\", \"Caballero\", role = \"ctb\"),\n person(\"Nick\", \"Salkowski\", role = \"ctb\"),\n person(\"Niels Richard\", \"Hansen\", role = \"ctb\"),\n person(\"Noam\", \"Ross\", role = \"ctb\"),\n person(\"Obada\", \"Mahdi\", role = \"ctb\"),\n person(\"Pavel N.\", \"Krivitsky\", role = \"ctb\", comment=c(ORCID = \"0000-0002-9101-3362\")),\n person(\"Pedro\", \"Faria\", role = \"ctb\"),\n person(\"Qiang\", \"Li\", role = \"ctb\"),\n person(\"Ramnath\", \"Vaidyanathan\", role = \"ctb\"),\n person(\"Richard\", \"Cotton\", role = \"ctb\"),\n person(\"Robert\", \"Krzyzanowski\", role = \"ctb\"),\n person(\"Rodrigo\", \"Copetti\", role = \"ctb\"),\n person(\"Romain\", \"Francois\", role = \"ctb\"),\n person(\"Ruaridh\", \"Williamson\", role = \"ctb\"),\n person(\"Sagiru\", \"Mati\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1413-3974\")),\n person(\"Scott\", \"Kostyshak\", role = \"ctb\"),\n person(\"Sebastian\", \"Meyer\", role = \"ctb\"),\n person(\"Sietse\", \"Brouwer\", role = \"ctb\"),\n person(c(\"Simon\", \"de\"), \"Bernard\", role = \"ctb\"),\n person(\"Sylvain\", \"Rousseau\", role = \"ctb\"),\n person(\"Taiyun\", \"Wei\", role = \"ctb\"),\n person(\"Thibaut\", \"Assus\", role = \"ctb\"),\n person(\"Thibaut\", \"Lamadon\", role = \"ctb\"),\n person(\"Thomas\", \"Leeper\", role = \"ctb\"),\n person(\"Tim\", \"Mastny\", role = \"ctb\"),\n person(\"Tom\", \"Torsney-Weir\", role = \"ctb\"),\n person(\"Trevor\", \"Davis\", role = \"ctb\"),\n person(\"Viktoras\", \"Veitas\", role = \"ctb\"),\n person(\"Weicheng\", \"Zhu\", role = \"ctb\"),\n person(\"Wush\", \"Wu\", role = \"ctb\"),\n person(\"Zachary\", \"Foster\", role = \"ctb\"),\n person(\"Zhian N.\", \"Kamvar\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1458-7108\")),\n person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "Provides a general-purpose tool for dynamic report generation in R\n using Literate Programming techniques.",
+ "Depends": "R (>= 3.3.0)",
+ "Imports": "evaluate (>= 0.15), highr, methods, tools, xfun (>= 0.39),\nyaml (>= 2.1.19)",
+ "Suggests": "bslib, codetools, DBI (>= 0.4-1), digest, formatR, gifski,\ngridSVG, htmlwidgets (>= 0.7), curl, jpeg, JuliaCall (>=\n0.11.1), magick, markdown (>= 1.3), png, ragg, reticulate (>=\n1.4), rgl (>= 0.95.1201), rlang, rmarkdown, sass, showtext,\nstyler (>= 1.2.0), targets (>= 0.6.0), testit, tibble,\ntikzDevice (>= 0.10), tinytex (>= 0.46), webshot, rstudioapi,\nsvglite, xml2 (>= 1.2.0)",
+ "License": "GPL",
+ "URL": "https://yihui.org/knitr/",
+ "BugReports": "https://github.com/yihui/knitr/issues",
+ "Encoding": "UTF-8",
+ "VignetteBuilder": "knitr",
+ "SystemRequirements": "Package vignettes based on R Markdown v2 or\nreStructuredText require Pandoc (http://pandoc.org). The\nfunction rst2pdf() requires rst2pdf\n(https://github.com/rst2pdf/rst2pdf).",
+ "Collate": "'block.R' 'cache.R' 'utils.R' 'citation.R' 'hooks-html.R'\n'plot.R' 'defaults.R' 'concordance.R' 'engine.R' 'highlight.R'\n'themes.R' 'header.R' 'hooks-asciidoc.R' 'hooks-chunk.R'\n'hooks-extra.R' 'hooks-latex.R' 'hooks-md.R' 'hooks-rst.R'\n'hooks-textile.R' 'hooks.R' 'output.R' 'package.R' 'pandoc.R'\n'params.R' 'parser.R' 'pattern.R' 'rocco.R' 'spin.R' 'table.R'\n'template.R' 'utils-conversion.R' 'utils-rd2html.R'\n'utils-string.R' 'utils-sweave.R' 'utils-upload.R'\n'utils-vignettes.R' 'zzz.R'",
+ "RoxygenNote": "7.2.3",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-10-27 03:03:09 UTC; yihui",
+ "Author": "Yihui Xie [aut, cre] (),\n Abhraneel Sarma [ctb],\n Adam Vogt [ctb],\n Alastair Andrew [ctb],\n Alex Zvoleff [ctb],\n Amar Al-Zubaidi [ctb],\n Andre Simon [ctb] (the CSS files under inst/themes/ were derived from\n the Highlight package http://www.andre-simon.de),\n Aron Atkins [ctb],\n Aaron Wolen [ctb],\n Ashley Manton [ctb],\n Atsushi Yasumoto [ctb] (),\n Ben Baumer [ctb],\n Brian Diggs [ctb],\n Brian Zhang [ctb],\n Bulat Yapparov [ctb],\n Cassio Pereira [ctb],\n Christophe Dervieux [ctb],\n David Hall [ctb],\n David Hugh-Jones [ctb],\n David Robinson [ctb],\n Doug Hemken [ctb],\n Duncan Murdoch [ctb],\n Elio Campitelli [ctb],\n Ellis Hughes [ctb],\n Emily Riederer [ctb],\n Fabian Hirschmann [ctb],\n Fitch Simeon [ctb],\n Forest Fang [ctb],\n Frank E Harrell Jr [ctb] (the Sweavel package at inst/misc/Sweavel.sty),\n Garrick Aden-Buie [ctb],\n Gregoire Detrez [ctb],\n Hadley Wickham [ctb],\n Hao Zhu [ctb],\n Heewon Jeon [ctb],\n Henrik Bengtsson [ctb],\n Hiroaki Yutani [ctb],\n Ian Lyttle [ctb],\n Hodges Daniel [ctb],\n Jacob Bien [ctb],\n Jake Burkhead [ctb],\n James Manton [ctb],\n Jared Lander [ctb],\n Jason Punyon [ctb],\n Javier Luraschi [ctb],\n Jeff Arnold [ctb],\n Jenny Bryan [ctb],\n Jeremy Ashkenas [ctb, cph] (the CSS file at\n inst/misc/docco-classic.css),\n Jeremy Stephens [ctb],\n Jim Hester [ctb],\n Joe Cheng [ctb],\n Johannes Ranke [ctb],\n John Honaker [ctb],\n John Muschelli [ctb],\n Jonathan Keane [ctb],\n JJ Allaire [ctb],\n Johan Toloe [ctb],\n Jonathan Sidi [ctb],\n Joseph Larmarange [ctb],\n Julien Barnier [ctb],\n Kaiyin Zhong [ctb],\n Kamil Slowikowski [ctb],\n Karl Forner [ctb],\n Kevin K. Smith [ctb],\n Kirill Mueller [ctb],\n Kohske Takahashi [ctb],\n Lorenz Walthert [ctb],\n Lucas Gallindo [ctb],\n Marius Hofert [ctb],\n Martin Modrák [ctb],\n Michael Chirico [ctb],\n Michael Friendly [ctb],\n Michal Bojanowski [ctb],\n Michel Kuhlmann [ctb],\n Miller Patrick [ctb],\n Nacho Caballero [ctb],\n Nick Salkowski [ctb],\n Niels Richard Hansen [ctb],\n Noam Ross [ctb],\n Obada Mahdi [ctb],\n Pavel N. Krivitsky [ctb] (),\n Pedro Faria [ctb],\n Qiang Li [ctb],\n Ramnath Vaidyanathan [ctb],\n Richard Cotton [ctb],\n Robert Krzyzanowski [ctb],\n Rodrigo Copetti [ctb],\n Romain Francois [ctb],\n Ruaridh Williamson [ctb],\n Sagiru Mati [ctb] (),\n Scott Kostyshak [ctb],\n Sebastian Meyer [ctb],\n Sietse Brouwer [ctb],\n Simon de Bernard [ctb],\n Sylvain Rousseau [ctb],\n Taiyun Wei [ctb],\n Thibaut Assus [ctb],\n Thibaut Lamadon [ctb],\n Thomas Leeper [ctb],\n Tim Mastny [ctb],\n Tom Torsney-Weir [ctb],\n Trevor Davis [ctb],\n Viktoras Veitas [ctb],\n Weicheng Zhu [ctb],\n Wush Wu [ctb],\n Zachary Foster [ctb],\n Zhian N. Kamvar [ctb] (),\n Posit Software, PBC [cph, fnd]",
+ "Maintainer": "Yihui Xie ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-10-30 09:10:12 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 01:58:37 UTC; windows"
+ }
+ },
+ "labeling": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "labeling",
+ "Type": "Package",
+ "Title": "Axis Labeling",
+ "Version": "0.4.3",
+ "Date": "2023-08-29",
+ "Author": "Justin Talbot,",
+ "Maintainer": "Nuno Sempere ",
+ "Description": "Functions which provide a range of axis labeling algorithms. ",
+ "License": "MIT + file LICENSE | Unlimited",
+ "Collate": "'labeling.R'",
+ "NeedsCompilation": "no",
+ "Imports": "stats, graphics",
+ "Packaged": "2023-08-29 21:01:57 UTC; loki",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-08-29 22:20:02 UTC",
+ "Encoding": "UTF-8",
+ "Built": "R 4.3.0; ; 2024-01-23 03:12:29 UTC; windows"
+ }
+ },
+ "later": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "later",
+ "Type": "Package",
+ "Title": "Utilities for Scheduling Functions to Execute Later with Event\nLoops",
+ "Version": "1.3.1",
+ "Authors@R": "c(\n person(\"Winston\", \"Chang\", role = c(\"aut\", \"cre\"), email = \"winston@rstudio.com\"),\n person(\"Joe\", \"Cheng\", role = c(\"aut\"), email = \"joe@rstudio.com\"),\n person(family = \"RStudio\", role = \"cph\"),\n person(\"Marcus\", \"Geelnard\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\"),\n person(\"Evan\", \"Nemerson\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\")\n )",
+ "Description": "Executes arbitrary R or C functions some time after the current\n time, after the R execution stack has emptied. The functions are scheduled\n in an event loop.",
+ "URL": "https://r-lib.github.io/later/, https://github.com/r-lib/later",
+ "BugReports": "https://github.com/r-lib/later/issues",
+ "License": "MIT + file LICENSE",
+ "Imports": "Rcpp (>= 0.12.9), rlang",
+ "LinkingTo": "Rcpp",
+ "RoxygenNote": "7.2.3",
+ "Suggests": "knitr, rmarkdown, testthat (>= 2.1.0)",
+ "VignetteBuilder": "knitr",
+ "Encoding": "UTF-8",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-05-01 21:09:55 UTC; winston",
+ "Author": "Winston Chang [aut, cre],\n Joe Cheng [aut],\n RStudio [cph],\n Marcus Geelnard [ctb, cph] (TinyCThread library,\n https://tinycthread.github.io/),\n Evan Nemerson [ctb, cph] (TinyCThread library,\n https://tinycthread.github.io/)",
+ "Maintainer": "Winston Chang ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-05-02 18:10:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-10-18 11:46:39 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "lattice": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "lattice",
+ "Version": "0.22-5",
+ "Date": "2023-10-23",
+ "Priority": "recommended",
+ "Title": "Trellis Graphics for R",
+ "Authors@R": "c(person(\"Deepayan\", \"Sarkar\", role = c(\"aut\", \"cre\"),\n\t email = \"deepayan.sarkar@r-project.org\",\n\t\t comment = c(ORCID = \"0000-0003-4107-1553\")),\n person(\"Felix\", \"Andrews\", role = \"ctb\"),\n\t person(\"Kevin\", \"Wright\", role = \"ctb\", comment = \"documentation\"),\n\t person(\"Neil\", \"Klepeis\", role = \"ctb\"),\n\t person(\"Johan\", \"Larsson\", role = \"ctb\", comment = \"miscellaneous improvements\"),\n person(\"Zhijian (Jason)\", \"Wen\", role = \"cph\", comment = \"filled contour code\"),\n person(\"Paul\", \"Murrell\", role = \"ctb\", email = \"paul@stat.auckland.ac.nz\"),\n\t person(\"Stefan\", \"Eng\", role = \"ctb\", comment = \"violin plot improvements\"),\n\t person(\"Achim\", \"Zeileis\", role = \"ctb\", comment = \"modern colors\"),\n person(\"Alexandre\", \"Courtiol\", role = \"ctb\", comment = \"generics for larrows, lpolygon, lrect and lsegments\")\n\t )",
+ "Description": "A powerful and elegant high-level data visualization\n system inspired by Trellis graphics, with an emphasis on\n multivariate data. Lattice is sufficient for typical graphics needs,\n and is also flexible enough to handle most nonstandard requirements.\n See ?Lattice for an introduction.",
+ "Depends": "R (>= 4.0.0)",
+ "Suggests": "KernSmooth, MASS, latticeExtra, colorspace",
+ "Imports": "grid, grDevices, graphics, stats, utils",
+ "Enhances": "chron, zoo",
+ "LazyLoad": "yes",
+ "LazyData": "yes",
+ "License": "GPL (>= 2)",
+ "URL": "https://lattice.r-forge.r-project.org/",
+ "BugReports": "https://github.com/deepayan/lattice/issues",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-10-23 20:44:42 UTC; deepayan",
+ "Author": "Deepayan Sarkar [aut, cre] (),\n Felix Andrews [ctb],\n Kevin Wright [ctb] (documentation),\n Neil Klepeis [ctb],\n Johan Larsson [ctb] (miscellaneous improvements),\n Zhijian (Jason) Wen [cph] (filled contour code),\n Paul Murrell [ctb],\n Stefan Eng [ctb] (violin plot improvements),\n Achim Zeileis [ctb] (modern colors),\n Alexandre Courtiol [ctb] (generics for larrows, lpolygon, lrect and\n lsegments)",
+ "Maintainer": "Deepayan Sarkar ",
+ "Repository": "CRAN",
+ "Date/Publication": "2023-10-24 07:00:02 UTC",
+ "Built": "R 4.3.3; x86_64-w64-mingw32; 2024-02-29 11:07:43 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "lazyeval": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "lazyeval",
+ "Version": "0.2.2",
+ "Title": "Lazy (Non-Standard) Evaluation",
+ "Description": "An alternative approach to non-standard evaluation using\n formulas. Provides a full implementation of LISP style 'quasiquotation',\n making it easier to generate code with other code.",
+ "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", ,\"hadley@rstudio.com\", c(\"aut\", \"cre\")),\n person(\"RStudio\", role = \"cph\")\n )",
+ "License": "GPL-3",
+ "LazyData": "true",
+ "Depends": "R (>= 3.1.0)",
+ "Suggests": "knitr, rmarkdown (>= 0.2.65), testthat, covr",
+ "VignetteBuilder": "knitr",
+ "RoxygenNote": "6.1.1",
+ "NeedsCompilation": "yes",
+ "Packaged": "2019-03-15 14:18:01 UTC; lionel",
+ "Author": "Hadley Wickham [aut, cre],\n RStudio [cph]",
+ "Maintainer": "Hadley Wickham ",
+ "Repository": "RSPM",
+ "Date/Publication": "2019-03-15 17:50:07 UTC",
+ "Encoding": "UTF-8",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 01:53:15 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "lifecycle": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "lifecycle",
+ "Title": "Manage the Life Cycle of your Package Functions",
+ "Version": "1.0.3",
+ "Authors@R": "c(\n person(\"Lionel\", \"Henry\", , \"lionel@rstudio.com\", role = c(\"aut\", \"cre\")),\n person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = \"aut\",\n comment = c(ORCID = \"0000-0003-4757-117X\")),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "Manage the life cycle of your exported functions with shared\n conventions, documentation badges, and user-friendly deprecation\n warnings.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://lifecycle.r-lib.org/, https://github.com/r-lib/lifecycle",
+ "BugReports": "https://github.com/r-lib/lifecycle/issues",
+ "Depends": "R (>= 3.4)",
+ "Imports": "cli (>= 3.4.0), glue, rlang (>= 1.0.6)",
+ "Suggests": "covr, crayon, knitr, lintr, rmarkdown, testthat (>= 3.0.1),\ntibble, tidyverse, tools, vctrs, withr",
+ "VignetteBuilder": "knitr",
+ "Config/testthat/edition": "3",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.1",
+ "NeedsCompilation": "no",
+ "Packaged": "2022-10-07 08:50:55 UTC; lionel",
+ "Author": "Lionel Henry [aut, cre],\n Hadley Wickham [aut] (),\n RStudio [cph, fnd]",
+ "Maintainer": "Lionel Henry ",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-10-07 09:50:02 UTC",
+ "Built": "R 4.3.0; ; 2023-04-25 02:23:19 UTC; windows"
+ }
+ },
+ "magrittr": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Type": "Package",
+ "Package": "magrittr",
+ "Title": "A Forward-Pipe Operator for R",
+ "Version": "2.0.3",
+ "Authors@R": "c(\n person(\"Stefan Milton\", \"Bache\", , \"stefan@stefanbache.dk\", role = c(\"aut\", \"cph\"),\n comment = \"Original author and creator of magrittr\"),\n person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = \"aut\"),\n person(\"Lionel\", \"Henry\", , \"lionel@rstudio.com\", role = \"cre\"),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "Provides a mechanism for chaining commands with a new\n forward-pipe operator, %>%. This operator will forward a value, or the\n result of an expression, into the next function call/expression.\n There is flexible support for the type of right-hand side expressions.\n For more information, see package vignette. To quote Rene Magritte,\n \"Ceci n'est pas un pipe.\"",
+ "License": "MIT + file LICENSE",
+ "URL": "https://magrittr.tidyverse.org,\nhttps://github.com/tidyverse/magrittr",
+ "BugReports": "https://github.com/tidyverse/magrittr/issues",
+ "Depends": "R (>= 3.4.0)",
+ "Suggests": "covr, knitr, rlang, rmarkdown, testthat",
+ "VignetteBuilder": "knitr",
+ "ByteCompile": "Yes",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.1.2",
+ "NeedsCompilation": "yes",
+ "Packaged": "2022-03-29 09:34:37 UTC; lionel",
+ "Author": "Stefan Milton Bache [aut, cph] (Original author and creator of\n magrittr),\n Hadley Wickham [aut],\n Lionel Henry [cre],\n RStudio [cph, fnd]",
+ "Maintainer": "Lionel Henry ",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-03-30 07:30:09 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 02:23:43 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "memoise": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "memoise",
+ "Title": "'Memoisation' of Functions",
+ "Version": "2.0.1",
+ "Authors@R": "\n c(person(given = \"Hadley\",\n family = \"Wickham\",\n role = \"aut\",\n email = \"hadley@rstudio.com\"),\n person(given = \"Jim\",\n family = \"Hester\",\n role = \"aut\"),\n person(given = \"Winston\",\n family = \"Chang\",\n role = c(\"aut\", \"cre\"),\n email = \"winston@rstudio.com\"),\n person(given = \"Kirill\",\n family = \"Müller\",\n role = \"aut\",\n email = \"krlmlr+r@mailbox.org\"),\n person(given = \"Daniel\",\n family = \"Cook\",\n role = \"aut\",\n email = \"danielecook@gmail.com\"),\n person(given = \"Mark\",\n family = \"Edmondson\",\n role = \"ctb\",\n email = \"r@sunholo.com\"))",
+ "Description": "Cache the results of a function so that when you\n call it again with the same arguments it returns the previously computed\n value.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://memoise.r-lib.org, https://github.com/r-lib/memoise",
+ "BugReports": "https://github.com/r-lib/memoise/issues",
+ "Imports": "rlang (>= 0.4.10), cachem",
+ "Suggests": "digest, aws.s3, covr, googleAuthR, googleCloudStorageR, httr,\ntestthat",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.1.2",
+ "NeedsCompilation": "no",
+ "Packaged": "2021-11-24 21:24:50 UTC; jhester",
+ "Author": "Hadley Wickham [aut],\n Jim Hester [aut],\n Winston Chang [aut, cre],\n Kirill Müller [aut],\n Daniel Cook [aut],\n Mark Edmondson [ctb]",
+ "Maintainer": "Winston Chang ",
+ "Repository": "RSPM",
+ "Date/Publication": "2021-11-26 16:11:10 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 03:25:11 UTC; windows"
+ }
+ },
+ "mgcv": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "mgcv",
+ "Version": "1.9-0",
+ "Author": "Simon Wood ",
+ "Maintainer": "Simon Wood ",
+ "Title": "Mixed GAM Computation Vehicle with Automatic Smoothness\nEstimation",
+ "Description": "Generalized additive (mixed) models, some of their extensions and \n other generalized ridge regression with multiple smoothing \n parameter estimation by (Restricted) Marginal Likelihood, \n Generalized Cross Validation and similar, or using iterated \n nested Laplace approximation for fully Bayesian inference. See \n Wood (2017) for an overview. \n Includes a gam() function, a wide variety of smoothers, 'JAGS' \n support and distributions beyond the exponential family. ",
+ "Priority": "recommended",
+ "Depends": "R (>= 3.6.0), nlme (>= 3.1-64)",
+ "Imports": "methods, stats, graphics, Matrix, splines, utils",
+ "Suggests": "parallel, survival, MASS",
+ "LazyLoad": "yes",
+ "ByteCompile": "yes",
+ "License": "GPL (>= 2)",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-07-07 06:01:32 UTC; sw283",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-07-11 08:40:18 UTC",
+ "Encoding": "UTF-8",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-10-18 11:46:51 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "mime": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "mime",
+ "Type": "Package",
+ "Title": "Map Filenames to MIME Types",
+ "Version": "0.12",
+ "Authors@R": "c(\n person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")),\n person(\"Jeffrey\", \"Horner\", role = \"ctb\"),\n person(\"Beilei\", \"Bian\", role = \"ctb\")\n )",
+ "Description": "Guesses the MIME type from a filename extension using the data\n derived from /etc/mime.types in UNIX-type systems.",
+ "Imports": "tools",
+ "License": "GPL",
+ "URL": "https://github.com/yihui/mime",
+ "BugReports": "https://github.com/yihui/mime/issues",
+ "RoxygenNote": "7.1.1",
+ "Encoding": "UTF-8",
+ "NeedsCompilation": "yes",
+ "Packaged": "2021-09-28 02:06:04 UTC; yihui",
+ "Author": "Yihui Xie [aut, cre] (),\n Jeffrey Horner [ctb],\n Beilei Bian [ctb]",
+ "Maintainer": "Yihui Xie ",
+ "Repository": "RSPM",
+ "Date/Publication": "2021-09-28 05:00:05 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 01:26:41 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "miniUI": {
+ "Source": "CRAN",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "miniUI",
+ "Type": "Package",
+ "Title": "Shiny UI Widgets for Small Screens",
+ "Version": "0.1.1.1",
+ "Authors@R": "c(\n person(\"Joe\", \"Cheng\", role = c(\"cre\", \"aut\"), email = \"joe@rstudio.com\"),\n person(family = \"RStudio\", role = \"cph\")\n )",
+ "Description": "Provides UI widget and layout functions for writing Shiny apps\n that work well on small screens.",
+ "License": "GPL-3",
+ "LazyData": "TRUE",
+ "Imports": "shiny (>= 0.13), htmltools (>= 0.3), utils",
+ "RoxygenNote": "5.0.1",
+ "NeedsCompilation": "no",
+ "Packaged": "2018-05-18 17:00:34 UTC; jcheng",
+ "Author": "Joe Cheng [cre, aut],\n RStudio [cph]",
+ "Maintainer": "Joe Cheng ",
+ "Repository": "RSPM",
+ "Date/Publication": "2018-05-18 18:37:18 UTC",
+ "Encoding": "UTF-8",
+ "Built": "R 4.3.0; ; 2024-01-23 08:52:11 UTC; windows"
+ }
+ },
+ "munsell": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "munsell",
+ "Type": "Package",
+ "Title": "Utilities for Using Munsell Colours",
+ "Version": "0.5.0",
+ "Author": "Charlotte Wickham ",
+ "Maintainer": "Charlotte Wickham ",
+ "Description": "Provides easy access to, and manipulation of, the Munsell \n colours. Provides a mapping between Munsell's \n original notation (e.g. \"5R 5/10\") and hexadecimal strings suitable \n for use directly in R graphics. Also provides utilities \n to explore slices through the Munsell colour tree, to transform \n Munsell colours and display colour palettes.",
+ "Suggests": "ggplot2, testthat",
+ "Imports": "colorspace, methods",
+ "License": "MIT + file LICENSE",
+ "URL": "https://cran.r-project.org/package=munsell,\nhttps://github.com/cwickham/munsell/",
+ "RoxygenNote": "6.0.1",
+ "NeedsCompilation": "no",
+ "Packaged": "2018-06-11 23:15:15 UTC; wickhamc",
+ "Repository": "RSPM",
+ "Date/Publication": "2018-06-12 04:29:06 UTC",
+ "Encoding": "UTF-8",
+ "Built": "R 4.3.0; ; 2024-01-23 01:39:34 UTC; windows"
+ }
+ },
+ "nlme": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "nlme",
+ "Version": "3.1-163",
+ "Date": "2023-07-31",
+ "Priority": "recommended",
+ "Title": "Linear and Nonlinear Mixed Effects Models",
+ "Authors@R": "c(person(\"José\", \"Pinheiro\", role = \"aut\", comment = \"S version\"),\n person(\"Douglas\", \"Bates\", role = \"aut\", comment = \"up to 2007\"),\n person(\"Saikat\", \"DebRoy\", role = \"ctb\", comment = \"up to 2002\"),\n person(\"Deepayan\", \"Sarkar\", role = \"ctb\", comment = \"up to 2005\"),\n person(\"EISPACK authors\", role = \"ctb\", comment = \"src/rs.f\"),\n\t person(\"Siem\", \"Heisterkamp\", role = \"ctb\", comment = \"Author fixed sigma\"),\n person(\"Bert\", \"Van Willigen\",role = \"ctb\", comment = \"Programmer fixed sigma\"),\n person(\"Johannes\", \"Ranke\", role = \"ctb\", comment = \"varConstProp()\"),\n\t person(\"R Core Team\", email = \"R-core@R-project.org\",\n role = c(\"aut\", \"cre\")))",
+ "Contact": "see 'MailingList'",
+ "Description": "Fit and compare Gaussian linear and nonlinear mixed-effects models.",
+ "Depends": "R (>= 3.5.0)",
+ "Imports": "graphics, stats, utils, lattice",
+ "Suggests": "Hmisc, MASS, SASmixed",
+ "LazyData": "yes",
+ "Encoding": "UTF-8",
+ "License": "GPL (>= 2)",
+ "BugReports": "https://bugs.r-project.org",
+ "MailingList": "R-help@r-project.org",
+ "URL": "https://svn.r-project.org/R-packages/trunk/nlme/",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-08-02 07:04:32 UTC; maechler",
+ "Author": "José Pinheiro [aut] (S version),\n Douglas Bates [aut] (up to 2007),\n Saikat DebRoy [ctb] (up to 2002),\n Deepayan Sarkar [ctb] (up to 2005),\n EISPACK authors [ctb] (src/rs.f),\n Siem Heisterkamp [ctb] (Author fixed sigma),\n Bert Van Willigen [ctb] (Programmer fixed sigma),\n Johannes Ranke [ctb] (varConstProp()),\n R Core Team [aut, cre]",
+ "Maintainer": "R Core Team ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-08-09 11:20:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-08-10 11:31:28 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "openssl": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "openssl",
+ "Type": "Package",
+ "Title": "Toolkit for Encryption, Signatures and Certificates Based on\nOpenSSL",
+ "Version": "2.1.1",
+ "Authors@R": "c(person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroen@berkeley.edu\",\n comment = c(ORCID = \"0000-0002-4035-0289\")),\n person(\"Oliver\", \"Keyes\", role = \"ctb\"))",
+ "Description": "Bindings to OpenSSL libssl and libcrypto, plus custom SSH key parsers.\n Supports RSA, DSA and EC curves P-256, P-384, P-521, and curve25519. Cryptographic\n signatures can either be created and verified manually or via x509 certificates. \n AES can be used in cbc, ctr or gcm mode for symmetric encryption; RSA for asymmetric\n (public key) encryption or EC for Diffie Hellman. High-level envelope functions \n combine RSA and AES for encrypting arbitrary sized data. Other utilities include key\n generators, hash functions (md5, sha1, sha256, etc), base64 encoder, a secure random\n number generator, and 'bignum' math methods for manually performing crypto \n calculations on large multibyte integers.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://jeroen.r-universe.dev/openssl",
+ "BugReports": "https://github.com/jeroen/openssl/issues",
+ "SystemRequirements": "OpenSSL >= 1.0.2",
+ "VignetteBuilder": "knitr",
+ "Imports": "askpass",
+ "Suggests": "curl, testthat (>= 2.1.0), digest, knitr, rmarkdown,\njsonlite, jose, sodium",
+ "RoxygenNote": "7.2.3",
+ "Encoding": "UTF-8",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-09-25 17:30:46 UTC; jeroen",
+ "Author": "Jeroen Ooms [aut, cre] (),\n Oliver Keyes [ctb]",
+ "Maintainer": "Jeroen Ooms ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-09-25 19:10:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 01:52:33 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "pillar": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "pillar",
+ "Title": "Coloured Formatting for Columns",
+ "Version": "1.9.0",
+ "Authors@R": "\n c(person(given = \"Kirill\",\n family = \"M\\u00fcller\",\n role = c(\"aut\", \"cre\"),\n email = \"kirill@cynkra.com\",\n comment = c(ORCID = \"0000-0002-1416-3412\")),\n person(given = \"Hadley\",\n family = \"Wickham\",\n role = \"aut\"),\n person(given = \"RStudio\",\n role = \"cph\"))",
+ "Description": "Provides 'pillar' and 'colonnade' generics designed\n for formatting columns of data using the full range of colours\n provided by modern terminals.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://pillar.r-lib.org/, https://github.com/r-lib/pillar",
+ "BugReports": "https://github.com/r-lib/pillar/issues",
+ "Imports": "cli (>= 2.3.0), fansi, glue, lifecycle, rlang (>= 1.0.2), utf8\n(>= 1.1.0), utils, vctrs (>= 0.5.0)",
+ "Suggests": "bit64, DBI, debugme, DiagrammeR, dplyr, formattable, ggplot2,\nknitr, lubridate, nanotime, nycflights13, palmerpenguins,\nrmarkdown, scales, stringi, survival, testthat (>= 3.1.1),\ntibble, units (>= 0.7.2), vdiffr, withr",
+ "VignetteBuilder": "knitr",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "Config/testthat/edition": "3",
+ "Config/testthat/parallel": "true",
+ "Config/testthat/start-first": "format_multi_fuzz, format_multi_fuzz_2,\nformat_multi, ctl_colonnade, ctl_colonnade_1, ctl_colonnade_2",
+ "Config/autostyle/scope": "line_breaks",
+ "Config/autostyle/strict": "true",
+ "Config/gha/extra-packages": "DiagrammeR=?ignore-before-r=3.5.0",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-03-21 08:42:46 UTC; kirill",
+ "Author": "Kirill Müller [aut, cre] (),\n Hadley Wickham [aut],\n RStudio [cph]",
+ "Maintainer": "Kirill Müller ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-03-22 08:10:02 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 06:40:35 UTC; windows"
+ }
+ },
+ "pingr": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "pingr",
+ "Title": "Check if a Remote Computer is Up",
+ "Version": "2.0.2",
+ "Authors@R": "person(given = \"Gábor\", family = \"Csárdi\", role = c(\"aut\", \"cre\"),\n email = \"csardi.gabor@gmail.com\")",
+ "Description": "Check if a remote computer is up. It can either\n just call the system ping command, or check a specified\n TCP port.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://github.com/r-lib/pingr#readme",
+ "BugReports": "https://github.com/r-lib/pingr/issues",
+ "Suggests": "covr, testthat",
+ "Imports": "processx, utils",
+ "RoxygenNote": "7.1.0.9000",
+ "Encoding": "UTF-8",
+ "NeedsCompilation": "yes",
+ "Packaged": "2022-10-26 16:43:46 UTC; gaborcsardi",
+ "Author": "Gábor Csárdi [aut, cre]",
+ "Maintainer": "Gábor Csárdi ",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-10-26 17:12:36 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-04-25 05:30:16 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "pkgbuild": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "pkgbuild",
+ "Title": "Find Tools Needed to Build R Packages",
+ "Version": "1.4.2",
+ "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", role = \"aut\"),\n person(\"Jim\", \"Hester\", role = \"aut\"),\n person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")),\n person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "Provides functions used to build R packages. Locates\n compilers needed to build R packages on various platforms and ensures\n the PATH is configured appropriately so R can use them.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://github.com/r-lib/pkgbuild, https://pkgbuild.r-lib.org",
+ "BugReports": "https://github.com/r-lib/pkgbuild/issues",
+ "Depends": "R (>= 3.4)",
+ "Imports": "callr (>= 3.2.0), cli (>= 3.4.0), crayon, desc, prettyunits,\nprocessx, R6, rprojroot",
+ "Suggests": "covr, cpp11, knitr, mockery, Rcpp, rmarkdown, testthat (>=\n3.0.0), withr (>= 2.3.0)",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "Config/testthat/edition": "3",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-06-26 11:12:19 UTC; gaborcsardi",
+ "Author": "Hadley Wickham [aut],\n Jim Hester [aut],\n Gábor Csárdi [aut, cre],\n Posit Software, PBC [cph, fnd]",
+ "Maintainer": "Gábor Csárdi ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-06-26 11:50:02 UTC",
+ "Built": "R 4.3.0; ; 2023-11-29 12:21:14 UTC; windows"
+ }
+ },
+ "pkgconfig": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "pkgconfig",
+ "Title": "Private Configuration for 'R' Packages",
+ "Version": "2.0.3",
+ "Author": "Gábor Csárdi",
+ "Maintainer": "Gábor Csárdi ",
+ "Description": "Set configuration options on a per-package basis.\n Options set by a given package only apply to that package,\n other packages are unaffected.",
+ "License": "MIT + file LICENSE",
+ "LazyData": "true",
+ "Imports": "utils",
+ "Suggests": "covr, testthat, disposables (>= 1.0.3)",
+ "URL": "https://github.com/r-lib/pkgconfig#readme",
+ "BugReports": "https://github.com/r-lib/pkgconfig/issues",
+ "Encoding": "UTF-8",
+ "NeedsCompilation": "no",
+ "Packaged": "2019-09-22 08:42:40 UTC; gaborcsardi",
+ "Repository": "RSPM",
+ "Date/Publication": "2019-09-22 09:20:02 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 03:17:51 UTC; windows"
+ }
+ },
+ "pkgdown": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "pkgdown",
+ "Title": "Make Static HTML Documentation for a Package",
+ "Version": "2.0.7",
+ "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\"),\n comment = c(ORCID = \"0000-0003-4757-117X\")),\n person(\"Jay\", \"Hesselberth\", role = \"aut\",\n comment = c(ORCID = \"0000-0002-6299-179X\")),\n person(\"Maëlle\", \"Salmon\", role = \"aut\",\n comment = c(ORCID = \"0000-0002-2815-0399\")),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "Generate an attractive and useful website from a source\n package. 'pkgdown' converts your documentation, vignettes, 'README',\n and more to 'HTML' making it easy to share information about your\n package online.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://pkgdown.r-lib.org, https://github.com/r-lib/pkgdown",
+ "BugReports": "https://github.com/r-lib/pkgdown/issues",
+ "Depends": "R (>= 3.1.0)",
+ "Imports": "bslib (>= 0.3.1), callr (>= 3.7.3), cli, desc, digest, downlit\n(>= 0.4.0), fs (>= 1.4.0), httr (>= 1.4.2), jsonlite, magrittr,\nmemoise, purrr, ragg, rlang (>= 1.0.0), rmarkdown (>=\n1.1.9007), tibble, whisker, withr (>= 2.4.3), xml2 (>= 1.3.1),\nyaml",
+ "Suggests": "covr, diffviewer, evaluate, htmltools, htmlwidgets, knitr,\nlifecycle, methods, openssl, pkgload (>= 1.0.2), rsconnect,\nrstudioapi, rticles, sass, testthat (>= 3.1.3), tools",
+ "VignetteBuilder": "knitr",
+ "Config/testthat/edition": "3",
+ "Config/potools/style": "explicit",
+ "Config/Needs/website": "usethis, servr",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.2.9000",
+ "SystemRequirements": "pandoc",
+ "NeedsCompilation": "no",
+ "Packaged": "2022-12-06 18:05:15 UTC; hadleywickham",
+ "Author": "Hadley Wickham [aut, cre] (),\n Jay Hesselberth [aut] (),\n Maëlle Salmon [aut] (),\n RStudio [cph, fnd]",
+ "Maintainer": "Hadley Wickham ",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-12-14 11:40:06 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 08:27:11 UTC; windows"
+ }
+ },
+ "pkgload": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "pkgload",
+ "Title": "Simulate Package Installation and Attach",
+ "Version": "1.3.3",
+ "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", role = \"aut\"),\n person(\"Winston\", \"Chang\", role = \"aut\"),\n person(\"Jim\", \"Hester\", role = \"aut\"),\n person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")),\n person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")),\n person(\"R Core team\", role = \"ctb\",\n comment = \"Some namespace and vignette code extracted from base R\")\n )",
+ "Description": "Simulates the process of installing a package and then\n attaching it. This is a key part of the 'devtools' package as it\n allows you to rapidly iterate while developing a package.",
+ "License": "GPL-3",
+ "URL": "https://github.com/r-lib/pkgload, https://pkgload.r-lib.org",
+ "BugReports": "https://github.com/r-lib/pkgload/issues",
+ "Depends": "R (>= 3.4.0)",
+ "Imports": "cli (>= 3.3.0), crayon, desc, fs, glue, methods, pkgbuild,\nrlang (>= 1.1.1), rprojroot, utils, withr (>= 2.4.3)",
+ "Suggests": "bitops, covr, mathjaxr, mockr, pak, Rcpp, remotes,\nrstudioapi, testthat (>= 3.1.0)",
+ "Config/Needs/website": "tidyverse/tidytemplate, ggplot2",
+ "Config/testthat/edition": "3",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-09-22 06:20:58 UTC; lionel",
+ "Author": "Hadley Wickham [aut],\n Winston Chang [aut],\n Jim Hester [aut],\n Lionel Henry [aut, cre],\n Posit Software, PBC [cph, fnd],\n R Core team [ctb] (Some namespace and vignette code extracted from base\n R)",
+ "Maintainer": "Lionel Henry ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-09-22 07:50:02 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 06:38:39 UTC; windows"
+ }
+ },
+ "plogr": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "plogr",
+ "Title": "The 'plog' C++ Logging Library",
+ "Version": "0.2.0",
+ "Date": "2018-03-24",
+ "Authors@R": "c(\n person(\"Kirill\", \"Müller\", role = c(\"aut\", \"cre\"), email = \"krlmlr+r@mailbox.org\"),\n person(\"Sergey\", \"Podobry\", role = \"cph\", comment = \"Author of the bundled plog library\"))",
+ "Description": "\n A simple header-only logging library for C++.\n Add 'LinkingTo: plogr' to 'DESCRIPTION', and '#include ' in your C++ modules to use it.",
+ "Suggests": "Rcpp",
+ "License": "MIT + file LICENSE",
+ "Encoding": "UTF-8",
+ "LazyData": "true",
+ "URL": "https://github.com/krlmlr/plogr#readme",
+ "BugReports": "https://github.com/krlmlr/plogr/issues",
+ "RoxygenNote": "6.0.1.9000",
+ "NeedsCompilation": "no",
+ "Packaged": "2018-03-24 11:02:06 UTC; muelleki",
+ "Author": "Kirill Müller [aut, cre],\n Sergey Podobry [cph] (Author of the bundled plog library)",
+ "Maintainer": "Kirill Müller ",
+ "Repository": "RSPM",
+ "Date/Publication": "2018-03-25 15:25:27 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 01:38:58 UTC; windows"
+ }
+ },
+ "plotly": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "plotly",
+ "Title": "Create Interactive Web Graphics via 'plotly.js'",
+ "Version": "4.10.3",
+ "Authors@R": "c(person(\"Carson\", \"Sievert\", role = c(\"aut\", \"cre\"),\n email = \"cpsievert1@gmail.com\", comment = c(ORCID = \"0000-0002-4958-2844\")),\n person(\"Chris\", \"Parmer\", role = \"aut\",\n email = \"chris@plot.ly\"),\n person(\"Toby\", \"Hocking\", role = \"aut\",\n email = \"tdhock5@gmail.com\"),\n person(\"Scott\", \"Chamberlain\", role = \"aut\",\n email = \"myrmecocystus@gmail.com\"),\n person(\"Karthik\", \"Ram\", role = \"aut\",\n email = \"karthik.ram@gmail.com\"),\n person(\"Marianne\", \"Corvellec\", role = \"aut\",\n email = \"marianne.corvellec@igdore.org\", comment = c(ORCID = \"0000-0002-1994-3581\")),\n person(\"Pedro\", \"Despouy\", role = \"aut\",\n email = \"pedro@plot.ly\"),\n person(\"Salim\", \"Brüggemann\", role = \"ctb\",\n email = \"salim-b@pm.me\", comment = c(ORCID = \"0000-0002-5329-5987\")),\n person(\"Plotly Technologies Inc.\", role = \"cph\"))",
+ "License": "MIT + file LICENSE",
+ "Description": "Create interactive web graphics from 'ggplot2' graphs and/or a custom interface to the (MIT-licensed) JavaScript library 'plotly.js' inspired by the grammar of graphics.",
+ "URL": "https://plotly-r.com, https://github.com/plotly/plotly.R,\nhttps://plotly.com/r/",
+ "BugReports": "https://github.com/plotly/plotly.R/issues",
+ "Depends": "R (>= 3.2.0), ggplot2 (>= 3.0.0)",
+ "Imports": "tools, scales, httr (>= 1.3.0), jsonlite (>= 1.6), magrittr,\ndigest, viridisLite, base64enc, htmltools (>= 0.3.6),\nhtmlwidgets (>= 1.5.2.9001), tidyr (>= 1.0.0), RColorBrewer,\ndplyr, vctrs, tibble, lazyeval (>= 0.2.0), rlang (>= 0.4.10),\ncrosstalk, purrr, data.table, promises",
+ "Suggests": "MASS, maps, hexbin, ggthemes, GGally, ggalluvial, testthat,\nknitr, shiny (>= 1.1.0), shinytest (>= 1.3.0), curl, rmarkdown,\nCairo, broom, webshot, listviewer, dendextend, sf, png,\nIRdisplay, processx, plotlyGeoAssets, forcats, withr,\npalmerpenguins, rversions, reticulate, rsvg",
+ "LazyData": "true",
+ "RoxygenNote": "7.2.3",
+ "Encoding": "UTF-8",
+ "Config/Needs/check": "tidyverse/ggplot2, rcmdcheck, devtools, reshape2",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-10-20 21:40:32 UTC; cpsievert",
+ "Author": "Carson Sievert [aut, cre] (),\n Chris Parmer [aut],\n Toby Hocking [aut],\n Scott Chamberlain [aut],\n Karthik Ram [aut],\n Marianne Corvellec [aut] (),\n Pedro Despouy [aut],\n Salim Brüggemann [ctb] (),\n Plotly Technologies Inc. [cph]",
+ "Maintainer": "Carson Sievert ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-10-21 22:50:09 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 08:13:33 UTC; windows"
+ }
+ },
+ "praise": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "praise",
+ "Title": "Praise Users",
+ "Version": "1.0.0",
+ "Author": "Gabor Csardi, Sindre Sorhus",
+ "Maintainer": "Gabor Csardi ",
+ "Description": "Build friendly R packages that\n praise their users if they have done something\n good, or they just need it to feel better.",
+ "License": "MIT + file LICENSE",
+ "LazyData": "true",
+ "URL": "https://github.com/gaborcsardi/praise",
+ "BugReports": "https://github.com/gaborcsardi/praise/issues",
+ "Suggests": "testthat",
+ "Collate": "'adjective.R' 'adverb.R' 'exclamation.R' 'verb.R' 'rpackage.R'\n'package.R'",
+ "NeedsCompilation": "no",
+ "Packaged": "2015-08-11 02:01:43 UTC; gaborcsardi",
+ "Repository": "RSPM",
+ "Date/Publication": "2015-08-11 08:22:28",
+ "Encoding": "UTF-8",
+ "Built": "R 4.3.0; ; 2024-01-23 01:29:27 UTC; windows"
+ }
+ },
+ "prettyunits": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "prettyunits",
+ "Title": "Pretty, Human Readable Formatting of Quantities",
+ "Version": "1.2.0",
+ "Authors@R": "c(\n person(\"Gabor\", \"Csardi\", email=\"csardi.gabor@gmail.com\", role=c(\"aut\", \"cre\")),\n person(\"Bill\", \"Denney\", email=\"wdenney@humanpredictions.com\", role=c(\"ctb\"), comment=c(ORCID=\"0000-0002-5759-428X\")),\n person(\"Christophe\", \"Regouby\", email=\"christophe.regouby@free.fr\", role=c(\"ctb\"))\n )",
+ "Description": "Pretty, human readable formatting of quantities.\n Time intervals: '1337000' -> '15d 11h 23m 20s'.\n Vague time intervals: '2674000' -> 'about a month ago'.\n Bytes: '1337' -> '1.34 kB'.\n Rounding: '99' with 3 significant digits -> '99.0'\n p-values: '0.00001' -> '<0.0001'.\n Colors: '#FF0000' -> 'red'.\n Quantities: '1239437' -> '1.24 M'.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://github.com/r-lib/prettyunits",
+ "BugReports": "https://github.com/r-lib/prettyunits/issues",
+ "Depends": "R(>= 2.10)",
+ "Suggests": "codetools, covr, testthat",
+ "RoxygenNote": "7.2.3",
+ "Encoding": "UTF-8",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-09-24 10:53:19 UTC; gaborcsardi",
+ "Author": "Gabor Csardi [aut, cre],\n Bill Denney [ctb] (),\n Christophe Regouby [ctb]",
+ "Maintainer": "Gabor Csardi ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-09-24 21:10:02 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 02:11:41 UTC; windows"
+ }
+ },
+ "processx": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "processx",
+ "Title": "Execute and Control System Processes",
+ "Version": "3.8.2",
+ "Authors@R": "c(\n person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\", \"cph\"),\n comment = c(ORCID = \"0000-0001-7098-9676\")),\n person(\"Winston\", \"Chang\", role = \"aut\"),\n person(\"RStudio\", role = c(\"cph\", \"fnd\")),\n person(\"Mango Solutions\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "Tools to run system processes in the background. It can\n check if a background process is running; wait on a background process\n to finish; get the exit status of finished processes; kill background\n processes. It can read the standard output and error of the processes,\n using non-blocking connections. 'processx' can poll a process for\n standard output or error, with a timeout. It can also poll several\n processes at once.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://processx.r-lib.org,\nhttps://github.com/r-lib/processx#readme",
+ "BugReports": "https://github.com/r-lib/processx/issues",
+ "Depends": "R (>= 3.4.0)",
+ "Imports": "ps (>= 1.2.0), R6, utils",
+ "Suggests": "callr (>= 3.7.3), cli (>= 3.3.0), codetools, covr, curl,\ndebugme, parallel, rlang (>= 1.0.2), testthat (>= 3.0.0),\nwebfakes, withr",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.0",
+ "Config/testthat/edition": "3",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-06-30 10:01:10 UTC; gaborcsardi",
+ "Author": "Gábor Csárdi [aut, cre, cph] (),\n Winston Chang [aut],\n RStudio [cph, fnd],\n Mango Solutions [cph, fnd]",
+ "Maintainer": "Gábor Csárdi ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-06-30 20:40:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-07-03 12:24:34 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "profvis": {
+ "Source": "CRAN",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "profvis",
+ "Title": "Interactive Visualizations for Profiling R Code",
+ "Version": "0.3.8",
+ "Authors@R": "c(\n person(\"Winston\", \"Chang\", email = \"winston@rstudio.com\", role = c(\"aut\", \"cre\")),\n person(\"Javier\", \"Luraschi\", email = \"javier@rstudio.com\", role = \"aut\"),\n person(\"Timothy\", \"Mastny\", role = \"aut\"),\n person(family = \"RStudio\", role = \"cph\"),\n person(family = \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library\"),\n person(family = \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt\"),\n person(\"Mike\", \"Bostock\", role = c(\"ctb\", \"cph\"), comment = \"D3 library\"),\n person(family = \"D3 contributors\", role = \"ctb\", comment = \"D3 library\"),\n person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\")\n )",
+ "Description": "Interactive visualizations for profiling R code.",
+ "Depends": "R (>= 3.0)",
+ "Imports": "htmlwidgets (>= 0.3.2), purrr, rlang (>= 0.4.9), stringr,\nvctrs",
+ "License": "GPL-3 | file LICENSE",
+ "Suggests": "knitr, ggplot2, rmarkdown, testthat (>= 3.0.0), devtools,\nshiny, htmltools",
+ "RoxygenNote": "7.2.3",
+ "URL": "https://rstudio.github.io/profvis/",
+ "Encoding": "UTF-8",
+ "Config/testthat/edition": "3",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-05-01 20:58:47 UTC; winston",
+ "Author": "Winston Chang [aut, cre],\n Javier Luraschi [aut],\n Timothy Mastny [aut],\n RStudio [cph],\n jQuery Foundation [cph] (jQuery library),\n jQuery contributors [ctb, cph] (jQuery library; authors listed in\n inst/www/shared/jquery-AUTHORS.txt),\n Mike Bostock [ctb, cph] (D3 library),\n D3 contributors [ctb] (D3 library),\n Ivan Sagalaev [ctb, cph] (highlight.js library)",
+ "Maintainer": "Winston Chang ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-05-02 18:00:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 08:42:55 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "progress": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "progress",
+ "Title": "Terminal Progress Bars",
+ "Version": "1.2.2",
+ "Author": "Gábor Csárdi [aut, cre], Rich FitzJohn [aut]",
+ "Maintainer": "Gábor Csárdi ",
+ "Description": "Configurable Progress bars, they may include percentage,\n elapsed time, and/or the estimated completion time. They work in\n terminals, in 'Emacs' 'ESS', 'RStudio', 'Windows' 'Rgui' and the\n 'macOS' 'R.app'. The package also provides a 'C++' 'API', that works\n with or without 'Rcpp'.",
+ "License": "MIT + file LICENSE",
+ "LazyData": "true",
+ "URL": "https://github.com/r-lib/progress#readme",
+ "BugReports": "https://github.com/r-lib/progress/issues",
+ "Imports": "hms, prettyunits, R6, crayon",
+ "Suggests": "Rcpp, testthat, withr",
+ "RoxygenNote": "6.1.0",
+ "Encoding": "UTF-8",
+ "NeedsCompilation": "no",
+ "Packaged": "2019-05-15 20:28:47 UTC; gaborcsardi",
+ "Repository": "RSPM",
+ "Date/Publication": "2019-05-16 21:30:03 UTC",
+ "Built": "R 4.3.0; ; 2023-05-29 16:26:12 UTC; windows"
+ }
+ },
+ "promises": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Type": "Package",
+ "Package": "promises",
+ "Title": "Abstractions for Promise-Based Asynchronous Programming",
+ "Version": "1.2.1",
+ "Authors@R": "c(\n person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = c(\"aut\", \"cre\")),\n person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "Provides fundamental abstractions for doing asynchronous\n programming in R using promises. Asynchronous programming is useful\n for allowing a single R process to orchestrate multiple tasks in the\n background while also attending to something else. Semantics are\n similar to 'JavaScript' promises, but with a syntax that is idiomatic\n R.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://rstudio.github.io/promises/,\nhttps://github.com/rstudio/promises",
+ "BugReports": "https://github.com/rstudio/promises/issues",
+ "Imports": "fastmap (>= 1.1.0), later, magrittr (>= 1.5), R6, Rcpp, rlang,\nstats",
+ "Suggests": "future (>= 1.21.0), knitr, purrr, rmarkdown, spelling,\ntestthat, vembedr",
+ "LinkingTo": "later, Rcpp",
+ "VignetteBuilder": "knitr",
+ "Config/Needs/website": "rsconnect",
+ "Encoding": "UTF-8",
+ "Language": "en-US",
+ "RoxygenNote": "7.2.3",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-08-09 20:29:25 UTC; garrick",
+ "Author": "Joe Cheng [aut, cre],\n Posit Software, PBC [cph, fnd]",
+ "Maintainer": "Joe Cheng ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-08-10 16:00:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-08-11 11:29:14 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "ps": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "ps",
+ "Title": "List, Query, Manipulate System Processes",
+ "Version": "1.7.5",
+ "Authors@R": "c(\n person(\"Jay\", \"Loden\", role = \"aut\"),\n person(\"Dave\", \"Daeschler\", role = \"aut\"),\n person(\"Giampaolo\", \"Rodola'\", role = \"aut\"),\n person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "List, query and manipulate all system processes, on\n 'Windows', 'Linux' and 'macOS'.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://github.com/r-lib/ps#readme, https://ps.r-lib.org/",
+ "BugReports": "https://github.com/r-lib/ps/issues",
+ "Depends": "R (>= 3.4)",
+ "Imports": "utils",
+ "Suggests": "callr, covr, curl, pillar, pingr, processx (>= 3.1.0), R6,\nrlang, testthat (>= 3.0.0), webfakes",
+ "Biarch": "true",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.1",
+ "Config/testthat/edition": "3",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-04-18 14:27:32 UTC; gaborcsardi",
+ "Author": "Jay Loden [aut],\n Dave Daeschler [aut],\n Giampaolo Rodola' [aut],\n Gábor Csárdi [aut, cre],\n RStudio [cph, fnd]",
+ "Maintainer": "Gábor Csárdi ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-04-18 19:30:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 02:26:35 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "purrr": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "purrr",
+ "Title": "Functional Programming Tools",
+ "Version": "1.0.2",
+ "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\"),\n comment = c(ORCID = \"0000-0003-4757-117X\")),\n person(\"Lionel\", \"Henry\", , \"lionel@rstudio.com\", role = \"aut\"),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "A complete and consistent functional programming toolkit for\n R.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://purrr.tidyverse.org/, https://github.com/tidyverse/purrr",
+ "BugReports": "https://github.com/tidyverse/purrr/issues",
+ "Depends": "R (>= 3.5.0)",
+ "Imports": "cli (>= 3.6.1), lifecycle (>= 1.0.3), magrittr (>= 1.5.0),\nrlang (>= 1.1.1), vctrs (>= 0.6.3)",
+ "Suggests": "covr, dplyr (>= 0.7.8), httr, knitr, lubridate, rmarkdown,\ntestthat (>= 3.0.0), tibble, tidyselect",
+ "LinkingTo": "cli",
+ "VignetteBuilder": "knitr",
+ "Biarch": "true",
+ "Config/Needs/website": "tidyverse/tidytemplate, tidyr",
+ "Config/testthat/edition": "3",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-08-08 16:13:31 UTC; hadleywickham",
+ "Author": "Hadley Wickham [aut, cre] (),\n Lionel Henry [aut],\n RStudio [cph, fnd]",
+ "Maintainer": "Hadley Wickham ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-08-10 08:20:07 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 06:41:05 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "ragg": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Type": "Package",
+ "Package": "ragg",
+ "Title": "Graphic Devices Based on AGG",
+ "Version": "1.2.6",
+ "Authors@R": "c(\n person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"cre\", \"aut\"),\n comment = c(ORCID = \"0000-0002-5147-4711\")),\n person(\"Maxim\", \"Shemanarev\", role = c(\"aut\", \"cph\"),\n comment = \"Author of AGG\"),\n person(\"Tony\", \"Juricic\", , \"tonygeek@yahoo.com\", role = c(\"ctb\", \"cph\"),\n comment = \"Contributor to AGG\"),\n person(\"Milan\", \"Marusinec\", , \"milan@marusinec.sk\", role = c(\"ctb\", \"cph\"),\n comment = \"Contributor to AGG\"),\n person(\"Spencer\", \"Garrett\", role = \"ctb\",\n comment = \"Contributor to AGG\"),\n person(\"Posit, PBC\", role = c(\"cph\", \"fnd\"))\n )",
+ "Maintainer": "Thomas Lin Pedersen ",
+ "Description": "Anti-Grain Geometry (AGG) is a high-quality and\n high-performance 2D drawing library. The 'ragg' package provides a set\n of graphic devices based on AGG to use as alternative to the raster\n devices provided through the 'grDevices' package.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://ragg.r-lib.org, https://github.com/r-lib/ragg",
+ "BugReports": "https://github.com/r-lib/ragg/issues",
+ "Imports": "systemfonts (>= 1.0.3), textshaping (>= 0.3.0)",
+ "Suggests": "covr, graphics, grid, testthat (>= 3.0.0)",
+ "LinkingTo": "systemfonts, textshaping",
+ "Config/Needs/website": "ggplot2, devoid, magick, bench, tidyr, ggridges,\nhexbin, sessioninfo, pkgdown, tidyverse/tidytemplate",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "SystemRequirements": "freetype2, libpng, libtiff, libjpeg",
+ "Config/testthat/edition": "3",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-10-10 07:24:50 UTC; thomas",
+ "Author": "Thomas Lin Pedersen [cre, aut]\n (),\n Maxim Shemanarev [aut, cph] (Author of AGG),\n Tony Juricic [ctb, cph] (Contributor to AGG),\n Milan Marusinec [ctb, cph] (Contributor to AGG),\n Spencer Garrett [ctb] (Contributor to AGG),\n Posit, PBC [cph, fnd]",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-10-10 08:20:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-10-11 11:39:31 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "rappdirs": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Type": "Package",
+ "Package": "rappdirs",
+ "Title": "Application Directories: Determine Where to Save Data, Caches,\nand Logs",
+ "Version": "0.3.3",
+ "Authors@R": "\n c(person(given = \"Hadley\",\n family = \"Wickham\",\n role = c(\"trl\", \"cre\", \"cph\"),\n email = \"hadley@rstudio.com\"),\n person(given = \"RStudio\",\n role = \"cph\"),\n person(given = \"Sridhar\",\n family = \"Ratnakumar\",\n role = \"aut\"),\n person(given = \"Trent\",\n family = \"Mick\",\n role = \"aut\"),\n person(given = \"ActiveState\",\n role = \"cph\",\n comment = \"R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs\"),\n person(given = \"Eddy\",\n family = \"Petrisor\",\n role = \"ctb\"),\n person(given = \"Trevor\",\n family = \"Davis\",\n role = c(\"trl\", \"aut\")),\n person(given = \"Gabor\",\n family = \"Csardi\",\n role = \"ctb\"),\n person(given = \"Gregory\",\n family = \"Jefferis\",\n role = \"ctb\"))",
+ "Description": "An easy way to determine which directories on the\n users computer you should use to save data, caches and logs. A port of\n Python's 'Appdirs' () to\n 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 (>= 3.2)",
+ "Suggests": "roxygen2, testthat (>= 3.0.0), covr, withr",
+ "Copyright": "Original python appdirs module copyright (c) 2010\nActiveState Software Inc. R port copyright Hadley Wickham,\nRStudio. See file LICENSE for details.",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.1.1",
+ "Config/testthat/edition": "3",
+ "NeedsCompilation": "yes",
+ "Packaged": "2021-01-28 22:29:57 UTC; hadley",
+ "Author": "Hadley Wickham [trl, cre, cph],\n RStudio [cph],\n Sridhar Ratnakumar [aut],\n Trent Mick [aut],\n ActiveState [cph] (R/appdir.r, R/cache.r, R/data.r, R/log.r translated\n from appdirs),\n Eddy Petrisor [ctb],\n Trevor Davis [trl, aut],\n Gabor Csardi [ctb],\n Gregory Jefferis [ctb]",
+ "Maintainer": "Hadley Wickham ",
+ "Repository": "RSPM",
+ "Date/Publication": "2021-01-31 05:40:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-02-29 11:44:47 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "rcmdcheck": {
+ "Source": "CRAN",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "rcmdcheck",
+ "Title": "Run 'R CMD check' from 'R' and Capture Results",
+ "Version": "1.4.0",
+ "Authors@R": "\n person(given = \"Gábor\",\n family = \"Csárdi\",\n role = c(\"cre\", \"aut\"),\n email = \"csardi.gabor@gmail.com\")",
+ "Description": "Run 'R CMD check' from 'R' and capture the results\n of the individual checks. Supports running checks in the background,\n timeouts, pretty printing and comparing check results.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://r-lib.github.io/rcmdcheck/,\nhttps://github.com/r-Lib/rcmdcheck#readme",
+ "BugReports": "https://github.com/r-Lib/rcmdcheck/issues",
+ "Imports": "callr (>= 3.1.1.9000), cli (>= 3.0.0), curl, desc (>= 1.2.0),\ndigest, pkgbuild, prettyunits, R6, rprojroot, sessioninfo (>=\n1.1.1), utils, withr, xopen",
+ "Suggests": "covr, knitr, mockery, processx, ps, rmarkdown, svglite,\ntestthat, webfakes",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.1.2",
+ "Config/testthat/edition": "3",
+ "NeedsCompilation": "no",
+ "Packaged": "2021-09-23 11:13:42 UTC; gaborcsardi",
+ "Author": "Gábor Csárdi [cre, aut]",
+ "Maintainer": "Gábor Csárdi ",
+ "Repository": "RSPM",
+ "Date/Publication": "2021-09-27 15:10:02 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 06:38:31 UTC; windows"
+ }
+ },
+ "readr": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "readr",
+ "Title": "Read Rectangular Text Data",
+ "Version": "2.1.4",
+ "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"),\n person(\"Jim\", \"Hester\", role = \"aut\"),\n person(\"Romain\", \"Francois\", role = \"ctb\"),\n person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"),\n comment = c(ORCID = \"0000-0002-6983-2759\")),\n person(\"Shelby\", \"Bearrows\", role = \"ctb\"),\n person(\"Posit, PBC\", role = c(\"cph\", \"fnd\")),\n person(\"https://github.com/mandreyel/\", role = \"cph\",\n comment = \"mio library\"),\n person(\"Jukka\", \"Jylänki\", role = c(\"ctb\", \"cph\"),\n comment = \"grisu3 implementation\"),\n person(\"Mikkel\", \"Jørgensen\", role = c(\"ctb\", \"cph\"),\n comment = \"grisu3 implementation\")\n )",
+ "Description": "The goal of 'readr' is to provide a fast and friendly way to\n read rectangular data (like 'csv', 'tsv', and 'fwf'). It is designed\n to flexibly parse many types of data found in the wild, while still\n 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 (>= 3.5)",
+ "Imports": "cli (>= 3.2.0), clipr, crayon, hms (>= 0.4.1), lifecycle (>=\n0.2.0), methods, R6, rlang, tibble, utils, vroom (>= 1.6.0)",
+ "Suggests": "covr, curl, datasets, knitr, rmarkdown, spelling, stringi,\ntestthat (>= 3.1.2), tzdb (>= 0.1.1), waldo, withr, xml2",
+ "LinkingTo": "cpp11, tzdb (>= 0.1.1)",
+ "VignetteBuilder": "knitr",
+ "Config/Needs/website": "tidyverse, tidyverse/tidytemplate",
+ "Config/testthat/edition": "3",
+ "Config/testthat/parallel": "false",
+ "Encoding": "UTF-8",
+ "Language": "en-US",
+ "RoxygenNote": "7.2.3",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-02-10 00:05:55 UTC; jenny",
+ "Author": "Hadley Wickham [aut],\n Jim Hester [aut],\n Romain Francois [ctb],\n Jennifer Bryan [aut, cre] (),\n Shelby Bearrows [ctb],\n Posit, PBC [cph, fnd],\n https://github.com/mandreyel/ [cph] (mio library),\n Jukka Jylänki [ctb, cph] (grisu3 implementation),\n Mikkel Jørgensen [ctb, cph] (grisu3 implementation)",
+ "Maintainer": "Jennifer Bryan ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-02-10 09:20:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-08-12 03:51:09 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "readxl": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "readxl",
+ "Title": "Read Excel Files",
+ "Version": "1.4.3",
+ "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\",\n comment = c(ORCID = \"0000-0003-4757-117X\")),\n person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"),\n comment = c(ORCID = \"0000-0002-6983-2759\")),\n person(\"Posit, PBC\", role = c(\"cph\", \"fnd\"),\n comment = \"Copyright holder of all R code and all C/C++ code without explicit copyright attribution\"),\n person(\"Marcin\", \"Kalicinski\", role = c(\"ctb\", \"cph\"),\n comment = \"Author of included RapidXML code\"),\n person(\"Komarov Valery\", role = c(\"ctb\", \"cph\"),\n comment = \"Author of included libxls code\"),\n person(\"Christophe Leitienne\", role = c(\"ctb\", \"cph\"),\n comment = \"Author of included libxls code\"),\n person(\"Bob Colbert\", role = c(\"ctb\", \"cph\"),\n comment = \"Author of included libxls code\"),\n person(\"David Hoerl\", role = c(\"ctb\", \"cph\"),\n comment = \"Author of included libxls code\"),\n person(\"Evan Miller\", role = c(\"ctb\", \"cph\"),\n comment = \"Author of included libxls code\")\n )",
+ "Description": "Import excel files into R. Supports '.xls' via the embedded\n 'libxls' C library and '.xlsx' via\n the embedded 'RapidXML' C++ library .\n Works on Windows, Mac and Linux without external dependencies.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://readxl.tidyverse.org, https://github.com/tidyverse/readxl",
+ "BugReports": "https://github.com/tidyverse/readxl/issues",
+ "Depends": "R (>= 3.6)",
+ "Imports": "cellranger, tibble (>= 2.0.1), utils",
+ "Suggests": "covr, knitr, rmarkdown, testthat (>= 3.1.6), withr",
+ "LinkingTo": "cpp11 (>= 0.4.0), progress",
+ "VignetteBuilder": "knitr",
+ "Config/Needs/website": "tidyverse/tidytemplate, tidyverse",
+ "Config/testthat/edition": "3",
+ "Encoding": "UTF-8",
+ "Note": "libxls v1.6.2 (patched) 45abe77",
+ "RoxygenNote": "7.2.3",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-07-05 19:59:43 UTC; jenny",
+ "Author": "Hadley Wickham [aut] (),\n Jennifer Bryan [aut, cre] (),\n Posit, PBC [cph, fnd] (Copyright holder of all R code and all C/C++\n code without explicit copyright attribution),\n Marcin Kalicinski [ctb, cph] (Author of included RapidXML code),\n Komarov Valery [ctb, cph] (Author of included libxls code),\n Christophe Leitienne [ctb, cph] (Author of included libxls code),\n Bob Colbert [ctb, cph] (Author of included libxls code),\n David Hoerl [ctb, cph] (Author of included libxls code),\n Evan Miller [ctb, cph] (Author of included libxls code)",
+ "Maintainer": "Jennifer Bryan ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-07-06 22:00:09 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2024-01-23 07:59:18 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "rematch": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "rematch",
+ "Title": "Match Regular Expressions with a Nicer 'API'",
+ "Version": "2.0.0",
+ "Author": "Gabor Csardi",
+ "Maintainer": "Gabor Csardi ",
+ "Description": "A small wrapper on 'regexpr' to extract the matches and\n captured groups from the match of a regular expression to a character\n vector.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://github.com/gaborcsardi/rematch",
+ "BugReports": "https://github.com/gaborcsardi/rematch/issues",
+ "RoxygenNote": "5.0.1.9000",
+ "Suggests": "covr, testthat",
+ "Encoding": "UTF-8",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-08-30 12:10:51 UTC; gaborcsardi",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-08-30 16:50:02 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 01:25:55 UTC; windows"
+ }
+ },
+ "rematch2": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "rematch2",
+ "Title": "Tidy Output from Regular Expression Matching",
+ "Version": "2.1.2",
+ "Authors@R": "c(\n person(\"Gábor\", \"Csárdi\", email = \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")),\n person(\"Matthew\", \"Lincoln\", email = \"matthew.d.lincoln@gmail.com\", role = c(\"ctb\")))",
+ "Description": "Wrappers on 'regexpr' and 'gregexpr' to return the match\n results in tidy data frames.",
+ "License": "MIT + file LICENSE",
+ "LazyData": "true",
+ "URL": "https://github.com/r-lib/rematch2#readme",
+ "BugReports": "https://github.com/r-lib/rematch2/issues",
+ "RoxygenNote": "7.1.0",
+ "Imports": "tibble",
+ "Suggests": "covr, testthat",
+ "Encoding": "UTF-8",
+ "NeedsCompilation": "no",
+ "Packaged": "2020-04-30 10:31:13 UTC; gaborcsardi",
+ "Author": "Gábor Csárdi [aut, cre],\n Matthew Lincoln [ctb]",
+ "Maintainer": "Gábor Csárdi ",
+ "Repository": "RSPM",
+ "Date/Publication": "2020-05-01 06:50:02 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 06:56:32 UTC; windows"
+ }
+ },
+ "remotes": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "remotes",
+ "Title": "R Package Installation from Remote Repositories, Including\n'GitHub'",
+ "Version": "2.4.2.1",
+ "Authors@R": "c(\n person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")),\n person(\"Jim\", \"Hester\", , \"jim.hester@rstudio.com\", role = \"aut\"),\n person(\"Hadley\", \"Wickham\", role = c(\"aut\")),\n person(\"Winston\", \"Chang\", role = \"aut\"),\n person(\"RStudio\", role = \"cph\"),\n person(\"Martin\", \"Morgan\", role = \"aut\"),\n person(\"Dan\", \"Tenenbaum\", role = \"aut\"),\n person(\"Mango Solutions\", role = \"cph\")\n )",
+ "Description": "Download and install R packages stored in 'GitHub', 'GitLab', \n 'Bitbucket', 'Bioconductor', or plain 'subversion' or 'git' repositories. \n This package provides the 'install_*' functions in 'devtools'. Indeed most \n of the code was copied over from 'devtools'.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://remotes.r-lib.org, https://github.com/r-lib/remotes#readme",
+ "BugReports": "https://github.com/r-lib/remotes/issues",
+ "Imports": "methods, stats, tools, utils",
+ "Suggests": "brew, callr, codetools, curl, covr, git2r (>= 0.23.0), knitr,\nmockery, pkgbuild (>= 1.0.1), pingr, rmarkdown, rprojroot,\ntestthat, webfakes, withr",
+ "Depends": "R (>= 3.0.0)",
+ "VignetteBuilder": "knitr",
+ "RoxygenNote": "7.1.2",
+ "SystemRequirements": "Subversion for install_svn, git for install_git",
+ "Encoding": "UTF-8",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-07-18 12:27:30 UTC; hornik",
+ "Author": "Gábor Csárdi [aut, cre],\n Jim Hester [aut],\n Hadley Wickham [aut],\n Winston Chang [aut],\n RStudio [cph],\n Martin Morgan [aut],\n Dan Tenenbaum [aut],\n Mango Solutions [cph]",
+ "Maintainer": "Gábor Csárdi ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-07-18 13:49:25 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 01:49:35 UTC; windows"
+ }
+ },
+ "renv": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "renv",
+ "Type": "Package",
+ "Title": "Project Environments",
+ "Version": "1.0.3",
+ "Authors@R": "c(\n person(\"Kevin\", \"Ushey\", role = c(\"aut\", \"cre\"), email = \"kevin@rstudio.com\",\n comment = c(ORCID = \"0000-0003-2880-7407\")),\n person(\"Hadley\", \"Wickham\", role = c(\"aut\"), email = \"hadley@rstudio.com\",\n comment = c(ORCID = \"0000-0003-4757-117X\")),\n person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "A dependency management toolkit for R. Using 'renv', you can create\n and manage project-local R libraries, save the state of these libraries to\n a 'lockfile', and later restore your library as required. Together, these\n tools can help make your projects more isolated, portable, and reproducible.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://rstudio.github.io/renv/, https://github.com/rstudio/renv",
+ "BugReports": "https://github.com/rstudio/renv/issues",
+ "Imports": "utils",
+ "Suggests": "BiocManager, cli, covr, cpp11, devtools, gitcreds, jsonlite,\nknitr, miniUI, packrat, pak, R6, remotes, reticulate,\nrmarkdown, rstudioapi, shiny, testthat, uuid, waldo, yaml,\nwebfakes",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "VignetteBuilder": "knitr",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "Config/testthat/edition": "3",
+ "Config/testthat/parallel": "true",
+ "Config/testthat/start-first": "bioconductor,python,install,restore,snapshot,retrieve,remotes",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-09-18 18:18:27 UTC; kevin",
+ "Author": "Kevin Ushey [aut, cre] (),\n Hadley Wickham [aut] (),\n Posit Software, PBC [cph, fnd]",
+ "Maintainer": "Kevin Ushey ",
+ "Repository": "CRAN",
+ "Date/Publication": "2023-09-19 08:10:02 UTC",
+ "Built": "R 4.3.3; ; 2024-05-21 17:24:46 UTC; windows"
+ }
+ },
+ "rex": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Type": "Package",
+ "Package": "rex",
+ "Title": "Friendly Regular Expressions",
+ "Version": "1.2.1",
+ "Authors@R": "c(\n person(\"Kevin\", \"Ushey\", , \"kevinushey@gmail.com\", role = c(\"aut\", \"cre\")),\n person(\"Jim\", \"Hester\", , \"james.f.hester@gmail.com\", role = \"aut\"),\n person(\"Robert\", \"Krzyzanowski\", , \"rkrzyzanowski@gmail.com\", role = \"aut\")\n )",
+ "Description": "A friendly interface for the construction of regular\n expressions.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://github.com/kevinushey/rex",
+ "BugReports": "https://github.com/kevinushey/rex/issues",
+ "Imports": "lazyeval",
+ "Suggests": "covr, dplyr, ggplot2, Hmisc, knitr, magrittr, rmarkdown,\nroxygen2, rvest, stringr, testthat",
+ "VignetteBuilder": "knitr",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.1.2",
+ "Collate": "'aaa.R' 'utils.R' 'escape.R' 'capture.R' 'character_class.R'\n'counts.R' 'lookarounds.R' 'match.R' 'or.R' 'rex-mode.R'\n'rex.R' 'shortcuts.R' 'wildcards.R' 'zzz.R'",
+ "NeedsCompilation": "no",
+ "Packaged": "2021-11-24 20:51:05 UTC; jhester",
+ "Author": "Kevin Ushey [aut, cre],\n Jim Hester [aut],\n Robert Krzyzanowski [aut]",
+ "Maintainer": "Kevin Ushey ",
+ "Repository": "RSPM",
+ "Date/Publication": "2021-11-26 16:11:02 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 03:26:59 UTC; windows"
+ }
+ },
+ "rlang": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "rlang",
+ "Version": "1.1.1",
+ "Title": "Functions for Base Types and Core R and 'Tidyverse' Features",
+ "Description": "A toolbox for working with base types, core R features\n like the condition system, and core 'Tidyverse' features like tidy\n evaluation.",
+ "Authors@R": "c(\n person(\"Lionel\", \"Henry\", ,\"lionel@posit.co\", c(\"aut\", \"cre\")),\n person(\"Hadley\", \"Wickham\", ,\"hadley@posit.co\", \"aut\"),\n person(given = \"mikefc\",\n email = \"mikefc@coolbutuseless.com\", \n role = \"cph\", \n comment = \"Hash implementation based on Mike's xxhashlite\"),\n person(given = \"Yann\",\n family = \"Collet\",\n role = \"cph\", \n comment = \"Author of the embedded xxHash library\"),\n person(given = \"Posit, PBC\", role = c(\"cph\", \"fnd\"))\n )",
+ "License": "MIT + file LICENSE",
+ "ByteCompile": "true",
+ "Biarch": "true",
+ "Depends": "R (>= 3.5.0)",
+ "Imports": "utils",
+ "Suggests": "cli (>= 3.1.0), covr, crayon, fs, glue, knitr, magrittr,\nmethods, pillar, rmarkdown, stats, testthat (>= 3.0.0), tibble,\nusethis, vctrs (>= 0.2.3), withr",
+ "Enhances": "winch",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "URL": "https://rlang.r-lib.org, https://github.com/r-lib/rlang",
+ "BugReports": "https://github.com/r-lib/rlang/issues",
+ "Config/testthat/edition": "3",
+ "Config/Needs/website": "dplyr, tidyverse/tidytemplate",
+ "NeedsCompilation": "yes",
+ "Packaged": "2023-04-28 10:48:43 UTC; lionel",
+ "Author": "Lionel Henry [aut, cre],\n Hadley Wickham [aut],\n mikefc [cph] (Hash implementation based on Mike's xxhashlite),\n Yann Collet [cph] (Author of the embedded xxHash library),\n Posit, PBC [cph, fnd]",
+ "Maintainer": "Lionel Henry ",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-04-28 22:30:03 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-05-01 18:49:57 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "rmarkdown": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Type": "Package",
+ "Package": "rmarkdown",
+ "Title": "Dynamic Documents for R",
+ "Version": "2.25",
+ "Authors@R": "c(\n person(\"JJ\", \"Allaire\", , \"jj@posit.co\", role = \"aut\"),\n person(\"Yihui\", \"Xie\", , \"xie@yihui.name\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-0645-5666\")),\n person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4474-2498\")),\n person(\"Jonathan\", \"McPherson\", , \"jonathan@posit.co\", role = \"aut\"),\n person(\"Javier\", \"Luraschi\", role = \"aut\"),\n person(\"Kevin\", \"Ushey\", , \"kevin@posit.co\", role = \"aut\"),\n person(\"Aron\", \"Atkins\", , \"aron@posit.co\", role = \"aut\"),\n person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"),\n person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"),\n person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\"),\n person(\"Richard\", \"Iannone\", , \"rich@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-3925-190X\")),\n person(\"Andrew\", \"Dunning\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0464-5036\")),\n person(\"Atsushi\", \"Yasumoto\", role = c(\"ctb\", \"cph\"), comment = c(ORCID = \"0000-0002-8335-495X\", cph = \"Number sections Lua filter\")),\n person(\"Barret\", \"Schloerke\", role = \"ctb\"),\n person(\"Carson\", \"Sievert\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4958-2844\")), \n person(\"Devon\", \"Ryan\", , \"dpryan79@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8549-0971\")),\n person(\"Frederik\", \"Aust\", , \"frederik.aust@uni-koeln.de\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4900-788X\")),\n person(\"Jeff\", \"Allen\", , \"jeff@posit.co\", role = \"ctb\"), \n person(\"JooYoung\", \"Seo\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4064-6012\")),\n person(\"Malcolm\", \"Barrett\", role = \"ctb\"),\n person(\"Rob\", \"Hyndman\", , \"Rob.Hyndman@monash.edu\", role = \"ctb\"),\n person(\"Romain\", \"Lesur\", role = \"ctb\"),\n person(\"Roy\", \"Storey\", role = \"ctb\"),\n person(\"Ruben\", \"Arslan\", , \"ruben.arslan@uni-goettingen.de\", role = \"ctb\"),\n person(\"Sergio\", \"Oller\", role = \"ctb\"),\n person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")),\n person(, \"jQuery UI contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery UI library; authors listed in inst/rmd/h/jqueryui/AUTHORS.txt\"),\n person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"),\n person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"),\n person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"),\n person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"),\n person(\"Alexander\", \"Farkas\", role = c(\"ctb\", \"cph\"), comment = \"html5shiv library\"),\n person(\"Scott\", \"Jehl\", role = c(\"ctb\", \"cph\"), comment = \"Respond.js library\"),\n person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\"),\n person(\"Greg\", \"Franko\", role = c(\"ctb\", \"cph\"), comment = \"tocify library\"),\n person(\"John\", \"MacFarlane\", role = c(\"ctb\", \"cph\"), comment = \"Pandoc templates\"),\n person(, \"Google, Inc.\", role = c(\"ctb\", \"cph\"), comment = \"ioslides library\"),\n person(\"Dave\", \"Raggett\", role = \"ctb\", comment = \"slidy library\"),\n person(, \"W3C\", role = \"cph\", comment = \"slidy library\"),\n person(\"Dave\", \"Gandy\", role = c(\"ctb\", \"cph\"), comment = \"Font-Awesome\"),\n person(\"Ben\", \"Sperry\", role = \"ctb\", comment = \"Ionicons\"),\n person(, \"Drifty\", role = \"cph\", comment = \"Ionicons\"),\n person(\"Aidan\", \"Lister\", role = c(\"ctb\", \"cph\"), comment = \"jQuery StickyTabs\"),\n person(\"Benct Philip\", \"Jonsson\", role = c(\"ctb\", \"cph\"), comment = \"pagebreak Lua filter\"),\n person(\"Albert\", \"Krewinkel\", role = c(\"ctb\", \"cph\"), comment = \"pagebreak Lua filter\")\n )",
+ "Maintainer": "Yihui Xie ",
+ "Description": "Convert R Markdown documents into a variety of formats.",
+ "License": "GPL-3",
+ "URL": "https://github.com/rstudio/rmarkdown,\nhttps://pkgs.rstudio.com/rmarkdown/",
+ "BugReports": "https://github.com/rstudio/rmarkdown/issues",
+ "Depends": "R (>= 3.0)",
+ "Imports": "bslib (>= 0.2.5.1), evaluate (>= 0.13), fontawesome (>=\n0.5.0), htmltools (>= 0.5.1), jquerylib, jsonlite, knitr (>=\n1.22), methods, stringr (>= 1.2.0), tinytex (>= 0.31), tools,\nutils, xfun (>= 0.36), yaml (>= 2.1.19)",
+ "Suggests": "digest, dygraphs, fs, rsconnect, downlit (>= 0.4.0), katex\n(>= 1.4.0), sass (>= 0.4.0), shiny (>= 1.6.0), testthat (>=\n3.0.3), tibble, vctrs, cleanrmd, withr (>= 2.4.2)",
+ "VignetteBuilder": "knitr",
+ "Config/Needs/website": "rstudio/quillt, pkgdown",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.2.3",
+ "SystemRequirements": "pandoc (>= 1.14) - http://pandoc.org",
+ "NeedsCompilation": "no",
+ "Packaged": "2023-09-15 16:52:22 UTC; yihui",
+ "Author": "JJ Allaire [aut],\n Yihui Xie [aut, cre] (),\n Christophe Dervieux [aut] (),\n Jonathan McPherson [aut],\n Javier Luraschi [aut],\n Kevin Ushey [aut],\n Aron Atkins [aut],\n Hadley Wickham [aut],\n Joe Cheng [aut],\n Winston Chang [aut],\n Richard Iannone [aut] (),\n Andrew Dunning [ctb] (),\n Atsushi Yasumoto [ctb, cph] (,\n Number sections Lua filter),\n Barret Schloerke [ctb],\n Carson Sievert [ctb] (),\n Devon Ryan [ctb] (),\n Frederik Aust [ctb] (),\n Jeff Allen [ctb],\n JooYoung Seo [ctb] (),\n Malcolm Barrett [ctb],\n Rob Hyndman [ctb],\n Romain Lesur [ctb],\n Roy Storey [ctb],\n Ruben Arslan [ctb],\n Sergio Oller [ctb],\n Posit Software, PBC [cph, fnd],\n jQuery UI contributors [ctb, cph] (jQuery UI library; authors listed in\n inst/rmd/h/jqueryui/AUTHORS.txt),\n Mark Otto [ctb] (Bootstrap library),\n Jacob Thornton [ctb] (Bootstrap library),\n Bootstrap contributors [ctb] (Bootstrap library),\n Twitter, Inc [cph] (Bootstrap library),\n Alexander Farkas [ctb, cph] (html5shiv library),\n Scott Jehl [ctb, cph] (Respond.js library),\n Ivan Sagalaev [ctb, cph] (highlight.js library),\n Greg Franko [ctb, cph] (tocify library),\n John MacFarlane [ctb, cph] (Pandoc templates),\n Google, Inc. [ctb, cph] (ioslides library),\n Dave Raggett [ctb] (slidy library),\n W3C [cph] (slidy library),\n Dave Gandy [ctb, cph] (Font-Awesome),\n Ben Sperry [ctb] (Ionicons),\n Drifty [cph] (Ionicons),\n Aidan Lister [ctb, cph] (jQuery StickyTabs),\n Benct Philip Jonsson [ctb, cph] (pagebreak Lua filter),\n Albert Krewinkel [ctb, cph] (pagebreak Lua filter)",
+ "Repository": "RSPM",
+ "Date/Publication": "2023-09-18 09:30:02 UTC",
+ "Built": "R 4.3.0; ; 2024-01-23 07:50:36 UTC; windows"
+ }
+ },
+ "roxygen2": {
+ "Source": "CRAN",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "roxygen2",
+ "Title": "In-Line Documentation for R",
+ "Version": "7.2.3",
+ "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\", \"cph\"),\n comment = c(ORCID = \"0000-0003-4757-117X\")),\n person(\"Peter\", \"Danenberg\", , \"pcd@roxygen.org\", role = c(\"aut\", \"cph\")),\n person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = \"aut\"),\n person(\"Manuel\", \"Eugster\", role = c(\"aut\", \"cph\")),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )",
+ "Description": "Generate your Rd documentation, 'NAMESPACE' file, and\n collation field using specially formatted comments. Writing\n documentation in-line with code makes it easier to keep your\n documentation up-to-date as your requirements change. 'roxygen2' is\n inspired by the 'Doxygen' system for C++.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://roxygen2.r-lib.org/, https://github.com/r-lib/roxygen2",
+ "BugReports": "https://github.com/r-lib/roxygen2/issues",
+ "Depends": "R (>= 3.3)",
+ "Imports": "brew, cli (>= 3.3.0), commonmark, desc (>= 1.2.0), knitr,\nmethods, pkgload (>= 1.0.2), purrr (>= 0.3.3), R6 (>= 2.1.2),\nrlang (>= 1.0.6), stringi, stringr (>= 1.0.0), utils, withr,\nxml2",
+ "Suggests": "covr, R.methodsS3, R.oo, rmarkdown (>= 2.16), testthat (>=\n3.1.2), yaml",
+ "LinkingTo": "cpp11",
+ "VignetteBuilder": "knitr",
+ "Config/Needs/website": "tidyverse/tidytemplate",
+ "Config/testthat/edition": "3",
+ "Encoding": "UTF-8",
+ "Language": "en-GB",
+ "RoxygenNote": "7.2.2.9000",
+ "SystemRequirements": "C++11",
+ "NeedsCompilation": "yes",
+ "Packaged": "2022-12-08 22:26:19 UTC; hadleywickham",
+ "Author": "Hadley Wickham [aut, cre, cph]\n (),\n Peter Danenberg [aut, cph],\n Gábor Csárdi [aut],\n Manuel Eugster [aut, cph],\n RStudio [cph, fnd]",
+ "Maintainer": "Hadley Wickham ",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-12-08 23:40:02 UTC",
+ "Built": "R 4.3.0; x86_64-w64-mingw32; 2023-08-12 03:10:13 UTC; windows",
+ "Archs": "x64"
+ }
+ },
+ "rprojroot": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "rprojroot",
+ "Title": "Finding Files in Project Subdirectories",
+ "Version": "2.0.3",
+ "Authors@R": "\n person(given = \"Kirill\",\n family = \"M\\u00fcller\",\n role = c(\"aut\", \"cre\"),\n email = \"krlmlr+r@mailbox.org\",\n comment = c(ORCID = \"0000-0002-1416-3412\"))",
+ "Description": "Robust, reliable and flexible paths to files below\n a project root. The 'root' of a project is defined as a directory that\n matches a certain criterion, e.g., it contains a certain regular file.",
+ "License": "MIT + file LICENSE",
+ "URL": "https://rprojroot.r-lib.org/, https://github.com/r-lib/rprojroot",
+ "BugReports": "https://github.com/r-lib/rprojroot/issues",
+ "Depends": "R (>= 3.0.0)",
+ "Suggests": "covr, knitr, lifecycle, mockr, rmarkdown, testthat (>=\n3.0.0), withr",
+ "VignetteBuilder": "knitr",
+ "Config/testthat/edition": "3",
+ "Encoding": "UTF-8",
+ "RoxygenNote": "7.1.2",
+ "NeedsCompilation": "no",
+ "Packaged": "2022-04-02 16:14:00 UTC; kirill",
+ "Author": "Kirill Müller [aut, cre] ()",
+ "Maintainer": "Kirill Müller ",
+ "Repository": "RSPM",
+ "Date/Publication": "2022-04-02 16:40:02 UTC",
+ "Built": "R 4.3.0; ; 2023-04-24 19:12:25 UTC; windows"
+ }
+ },
+ "rstudioapi": {
+ "Source": "RSPM",
+ "Repository": "https://packagemanager.posit.co/cran/2023-11-01",
+ "description": {
+ "Package": "rstudioapi",
+ "Title": "Safely Access the RStudio API",
+ "Description": "Access the RStudio API (if available) and provide informative error\n messages when it's not.",
+ "Version": "0.15.0",
+ "Authors@R": "c(\n person(\"Kevin\", \"Ushey\", role = c(\"aut\", \"cre\"), email = \"kevin@rstudio.com\"),\n person(\"JJ\", \"Allaire\", role = c(\"aut\"), email = \"jj@posit.co\"),\n person(\"Hadley\", \"Wickham\", role = c(\"aut\"), email = \"hadley@posit.co\"),\n person(\"Gary\", \"Ritchie\", role = c(\"aut\"), email = \"gary@posit.co\"),\n person(family = \"RStudio\", role = \"cph\")\n )",
+ "Maintainer": "Kevin Ushey