diff --git a/DESCRIPTION b/DESCRIPTION index 47472a1..b72de73 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -17,3 +17,4 @@ Imports: omopgenerics, here Config/roxygen2/version: 8.0.0 +RoxygenNote: 7.3.3 diff --git a/NAMESPACE b/NAMESPACE index 8f00d47..63fde48 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -12,16 +12,27 @@ importFrom(CohortConstructor,requireIsFirstEntry) importFrom(CohortConstructor,requireSex) importFrom(CohortConstructor,requireTableIntersect) importFrom(ParallelLogger,logInfo) +importFrom(PatientProfiles,addConceptIntersectDate) +importFrom(checkmate,assertChoice) +importFrom(checkmate,assertDataFrame) importFrom(checkmate,assertDirectoryExists) +importFrom(checkmate,assertFileExists) +importFrom(checkmate,assertTRUE) importFrom(dplyr,collect) importFrom(dplyr,filter) +importFrom(dplyr,mutate) +importFrom(dplyr,pick) importFrom(dplyr,pull) +importFrom(dplyr,rowwise) importFrom(dplyr,select) +importFrom(dplyr,select_if) importFrom(glue,glue) importFrom(here,here) importFrom(omopgenerics,assertList) -importFrom(omopgenerics,assertTable) importFrom(omopgenerics,importConceptSetExpression) importFrom(omopgenerics,newCodelist) importFrom(omopgenerics,settings) +importFrom(omopgenerics,validateCdmArgument) +importFrom(omopgenerics,validateCohortArgument) importFrom(stringr,str_detect) +importFrom(tidyselect,any_of) diff --git a/R/TNMRules.R b/R/TNMRules.R new file mode 100644 index 0000000..62d003b --- /dev/null +++ b/R/TNMRules.R @@ -0,0 +1,90 @@ +#' Documentation of TNM staging rules +#' +#' Internal auxiliary files used to determine cancer stage. +#' +#' @details +#' The package stores three rule sets derived from UICC guidelines for the +#' TNM staging system. The rules stored in these files are differentiated by +#' cancer **site** (bladder, breast, colorectal, lung, oesophageal, prostate, +#' skin), classification **type** (clinical, pathological, base) and +#' classification **edition** (7th, 8th, unspecified). The files are: +#' +#' \enumerate{ +#' \item `tnm_concepts.csv`: contains information about the individual TNM +#' components and their concept ids, differentiated by type and edition. +#' There are \eqn{393} total concepts for \eqn{44} unique components: +#' ``` +#' TX, T0, Tis, Ta, T1, T1a, T1b, T1c, T1mi, T2, T2a, T2b, T2c, T3, T3a, +#' T3b, T4, T4a, T4b, T4c, T4d, NX, N0, N1, N1a, N1b, N1c, N1mi, N2, N2a, +#' N2b, N2c, N3, N3a, N3b, N3c, M0, M1, M1a, M1b, M1c, M1c1, M1c2, M1d. +#' ``` +#' These components have different versions according to: +#' \itemize{ +#' \item Edition: \eqn{131} concepts for 7th, \eqn{131} for 8th, \eqn{131} +#' for unspecified; +#' \item Type: \eqn{132} concepts for base, \eqn{132} for clinical, \eqn{129} +#' for pathological (the `M0` component is not valid in the pathological +#' setting, for any of the editions). +#' } +#' +#' \item `tnm_stage_mapping.csv`: contains the rules to determine the cancer +#' stage based on a combination of individual TNM components, differentiated +#' by cancer site, type (clinical, pathological, base) and by edition (7th, +#' 8th, 9th). Each rule refers to a specific source page of the UICC guidelines. +#' +#' The currently available rules support the following concept categories. +#' +#' For `bladder` cancer: +#' \itemize{ +#' \item Edition: 7th, 8th, 9th available; +#' \item Type: only "base" is available, for all editions. +#' } +#' For `breast` cancer: +#' \itemize{ +#' \item Edition: 7th, 8th, 9th available; +#' \item Type: only "base" is available, for all editions. +#' } +#' For `colorectal` cancer: +#' \itemize{ +#' \item Edition: 7th, 8th, 9th available; +#' \item Type: only "base" is available, for all editions. +#' } +#' For `lung` cancer: +#' \itemize{ +#' \item Edition: 7th, 8th, 9th available; +#' \item Type: only "base" is available, for all editions. +#' } +#' For `oesophageal` cancer: +#' \itemize{ +#' \item For 7th edition, only "base" type is available; +#' \item For 8th edition, only "clinical" and "pathological" types are available but not "base". +#' \item For 9th edition, only "clinical" and "pathological" types are available but not "base". +#' } +#' For `prostate` cancer: +#' \itemize{ +#' \item For 7th edition, only "base" type is available; +#' \item For 8th edition, only "clinical" type is available; +#' \item For 9th edition, only "clinical" and "pathological" types are available but not "base". +#' } +#' For `skin` cancer: +#' \itemize{ +#' \item For 7th edition, only "pathological" type is available; +#' \item For 8th edition, only "clinical" and "pathological" types are available but not "base". +#' \item For 9th edition, only "clinical" and "pathological" types are available but not "base". +#' } +#' +#' \item `tnm_stage_shortcut_mapping.csv`: contains some more general rules to +#' determine the cancer stage based on a subset of individual TNM components, +#' differentiated by cancer site, type and edition. In fact, there are some +#' special cases in which the value of one or two components +#' is enough to determine the stage, independently of the others. +#' Each rule refers to a specific source page of the UICC guidelines. +#' } +#' +#' These files are meant for internal use and are not intended +#' to be modified by users. +#' +#' @name tnm_rules_docs +#' @source UICC_7th edition.pdf; UICC_8th edition.pdf corroborated by nhs/*.pdf; uicc/UICC_9th edition.pdf +#' @keywords internal +NULL diff --git a/R/addStages.R b/R/addStages.R index dc9cb38..b930fbf 100644 --- a/R/addStages.R +++ b/R/addStages.R @@ -1,23 +1,23 @@ #' `addStages()` to a cohort #' -#' It uses a codelist to date intersect with a cancer cohort. +#' It uses a codelist to date intersect with a cancer cohort. #' Imposes a predefined or custom set of rules to identify #' summary stages. #' -#' @param cohort A cohort table with cancer patients from a +#' @param cohort A cohort table with cancer patients from a #' cdm reference object. #' @param cdm A cdm reference object. -#' @param cancer In character, the affected site, a choice of: +#' @param cancer In character, the affected site, a choice of: #' "bladder", "breast", "colorectal", "lung", "melanoma", "oesophagus" #' and "prostate". #' @param window to look up stages codes. #' @param edition A choice of "unspecified", "7th" and "8th". #' @param type A choice from "base", "clinical" or "pathological". -#' @param order A choice from "first" or "last". If more that one code +#' @param order A choice from "first" or "last". If more than one code #' intersected, the order defines which code to intersect in the window. -#' @param showTnm If TRUE, the cohort will show the date intersects +#' @param showTnm If TRUE, the cohort will show the date intersects #' for each matching code. Default FALSE. -#' @importFrom omopgenerics validateCohortArgument validateCdmArgument assertList newCodelist +#' @importFrom omopgenerics validateCohortArgument validateCdmArgument assertList newCodelist #' @importFrom checkmate assertChoice assertFileExists assertTRUE assertDataFrame #' @importFrom dplyr filter pull rowwise select_if mutate pick select #' @importFrom PatientProfiles addConceptIntersectDate @@ -35,28 +35,28 @@ addStages <- function( order = "last", showTnm = FALSE ) { - + # Assert parameters --------------------------------- cohort |> omopgenerics::validateCohortArgument() - cdm |> + cdm |> omopgenerics::validateCdmArgument() - window |> + window |> omopgenerics::assertList() - edition |> + edition |> checkmate::assertChoice( c("unspecified", "7th", "8th") ) - type |> + type |> checkmate::assertChoice( c("base", "clinical", "pathological") ) - + # Read stages rules data ---------------------------- tnm_files_data <- system.file( "tnm_files", package = "oncomop" - ) |> + ) |> list.files( full.names = TRUE ) |> @@ -69,17 +69,17 @@ addStages <- function( .edition = edition, .type = type ) - + # Extract ruleset ----------------------------------- - ruleset <- tnm_files_data$tnm_stage_mapping |> + ruleset <- tnm_files_data$tnm_stage_mapping |> extractStageRuleset( .cancer = cancer, .edition = edition, .type = "base" - ) - + ) + # .addColumnRules() --------------------------------- - # General function to analyse if it can be reused for + # General function to analyse if it can be reused for # subtypes and progression cancer_stage_cohort <- cohort |> .addColumnRules( @@ -93,10 +93,10 @@ addStages <- function( nameStyle = "{concept_name}", name = NULL, ruleset = ruleset - ) - + ) + if (isFALSE(showTnm)) { - cancer_stage_cohort |> + cancer_stage_cohort |> dplyr::select( cohort_definition_id, subject_id, @@ -110,13 +110,13 @@ addStages <- function( } readStagesRDS <- function(tnm_files) { - tnm_files |> - checkmate::assertFileExists() |> - basename() |> + tnm_files |> + checkmate::assertFileExists() |> + basename() |> identical( c( "tnm_concepts.rds", "tnm_stage_mapping.rds", - "tnm_stage_shortcut_mapping.rds")) |> + "tnm_stage_shortcut_mapping.rds")) |> checkmate::assertTRUE() setNames( lapply(tnm_files, readRDS), @@ -131,16 +131,16 @@ extractStageRuleset <- function( .type ) { checkmate::assertDataFrame(tnm_stage_mapping) - tnm_stage_mapping |> + tnm_stage_mapping |> dplyr::filter( edition == .edition - ) |> + ) |> dplyr::filter( site == .cancer - ) |> + ) |> dplyr::filter( stage_grouping_scope == .type - ) |> + ) |> dplyr::select( rule_id, T, N, M, uicc_stage ) @@ -157,10 +157,10 @@ createTNMCodelist <- function( .data$classification_version == .edition, .data$type == .type, ) |> - dplyr::filter( + dplyr::filter( !is.na(.data$concept_id) - ) - tnm_codelist <- tnm_stages_concept |> + ) + tnm_codelist <- tnm_stages_concept |> dplyr::pull( concept_id ) |> lapply( @@ -169,7 +169,7 @@ createTNMCodelist <- function( } ) |> setNames( tnm_stages_concept$component_tnm - ) |> + ) |> omopgenerics::newCodelist() return(tnm_codelist) } @@ -188,7 +188,7 @@ createTNMCodelist <- function( ruleset ) { omopgenerics::validateCohortArgument(cohort) - cohort |> + cohort |> PatientProfiles::addConceptIntersectDate( conceptSet, indexDate = "cohort_start_date", @@ -199,7 +199,7 @@ createTNMCodelist <- function( inObservation = TRUE, nameStyle = "{concept_name}", name = NULL - ) |> + ) |> .mapRules(ruleset) } @@ -210,29 +210,29 @@ createTNMCodelist <- function( omopgenerics::validateCohortArgument(cohort) checkmate::assertDataFrame(ruleset) cohort |> - dplyr::collect() |> + dplyr::collect() |> dplyr::rowwise() |> - dplyr::select_if(~ !all(is.na(.))) |> + dplyr::select_if(~ !all(is.na(.))) |> dplyr::mutate( cancer_stage = { - rowStages <- dplyr::pick(tidyselect::any_of(tolower(unique(c(ruleset$T, ruleset$N, ruleset$M))))) |> + rowStages <- dplyr::pick(tidyselect::any_of(tolower(unique(c(ruleset$T, ruleset$N, ruleset$M))))) |> dplyr::select_if(~ !any(is.na(.))) stageCombination <- names(rowStages) rowStageT <- stageCombination[names(rowStages) |> stringr::str_detect("t")] rowStageN <- stageCombination[names(rowStages) |> stringr::str_detect("n")] rowStageM <- stageCombination[names(rowStages) |> stringr::str_detect("m")] - stage <- ruleset |> + stage <- ruleset |> dplyr::select( T, N, M, uicc_stage - ) |> + ) |> dplyr::filter( tolower(T) == rowStageT, tolower(N) == rowStageN, tolower(M) == rowStageM, - ) |> + ) |> dplyr::pull(uicc_stage) } - ) + ) } filterStageConcepts <- function( diff --git a/man/addStages.Rd b/man/addStages.Rd index 7e95853..85f76b0 100644 --- a/man/addStages.Rd +++ b/man/addStages.Rd @@ -2,28 +2,40 @@ % Please edit documentation in R/addStages.R \name{addStages} \alias{addStages} -\title{addCancerStages() information to a cohort} +\title{\code{addStages()} to a cohort} \usage{ addStages( cohort, cdm, cancer, - window = c(0, 0), - edition = "eight", + window = list(c(0, 0)), + edition = "8th", type = "base", - order = "last" + order = "last", + showTnm = FALSE ) } \arguments{ -\item{cohort}{A cohort table from a cdm reference object.} +\item{cohort}{A cohort table with cancer patients from a +cdm reference object.} -\item{cdm}{A cdm reference.} +\item{cdm}{A cdm reference object.} -\item{stageConcepts}{A concept-set list containing cancer -stage concepts.} +\item{cancer}{In character, the affected site, a choice of: +"bladder", "breast", "colorectal", "lung", "melanoma", "oesophagus" +and "prostate".} -\item{ruleSet}{A set of rules in list format that -corresponds to each element of the stageConcepts codelist.} +\item{window}{to look up stages codes.} + +\item{edition}{A choice of "unspecified", "7th" and "8th".} + +\item{type}{A choice from "base", "clinical" or "pathological".} + +\item{order}{A choice from "first" or "last". If more that one code +intersected, the order defines which code to intersect in the window.} + +\item{showTnm}{If TRUE, the cohort will show the date intersects +for each matching code. Default FALSE.} } \value{ A cohort table containing the identified cancer stages. diff --git a/man/saveTNMRules.Rd b/man/saveTNMRules.Rd index 87262e8..a5903b6 100644 --- a/man/saveTNMRules.Rd +++ b/man/saveTNMRules.Rd @@ -4,7 +4,10 @@ \alias{saveTNMRules} \title{Save TNM staging rules to RDS file} \usage{ -saveTNMRules(path = here::here("extras"), results_path = here::here("inst")) +saveTNMRules( + path = here::here("extras"), + results_path = system.file("tnm_files", package = "oncomop") +) } \arguments{ \item{path}{Character directory where the original .csv files are stored.} diff --git a/man/tnm_rules_docs.Rd b/man/tnm_rules_docs.Rd new file mode 100644 index 0000000..1114ff4 --- /dev/null +++ b/man/tnm_rules_docs.Rd @@ -0,0 +1,95 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/TNMRules.R +\name{tnm_rules_docs} +\alias{tnm_rules_docs} +\title{Documentation of TNM staging rules} +\source{ +UICC_7th edition.pdf; UICC_8th edition.pdf corroborated by nhs/*.pdf; uicc/UICC_9th edition.pdf +} +\description{ +Internal auxiliary files used to determine cancer stage. +} +\details{ +The package stores three rule sets derived from UICC guidelines for the +TNM staging system. The rules stored in these files are differentiated by +cancer \strong{site} (bladder, breast, colorectal, lung, oesophageal, prostate, +skin), classification \strong{type} (clinical, pathological, base) and +classification \strong{edition} (7th, 8th, unspecified). The files are: + +\enumerate{ +\item \code{tnm_concepts.csv}: contains information about the individual TNM +components and their concept ids, differentiated by type and edition. +There are \eqn{393} total concepts for \eqn{44} unique components: + +\if{html}{\out{
}}\preformatted{TX, T0, Tis, Ta, T1, T1a, T1b, T1c, T1mi, T2, T2a, T2b, T2c, T3, T3a, +T3b, T4, T4a, T4b, T4c, T4d, NX, N0, N1, N1a, N1b, N1c, N1mi, N2, N2a, +N2b, N2c, N3, N3a, N3b, N3c, M0, M1, M1a, M1b, M1c, M1c1, M1c2, M1d. +}\if{html}{\out{
}} + +These components have different versions according to: +\itemize{ +\item Edition: \eqn{131} concepts for 7th, \eqn{131} for 8th, \eqn{131} +for unspecified; +\item Type: \eqn{132} concepts for base, \eqn{132} for clinical, \eqn{129} +for pathological (the \code{M0} component is not valid in the pathological +setting, for any of the editions). +} + +\item \code{tnm_stage_mapping.csv}: contains the rules to determine the cancer +stage based on a combination of individual TNM components, differentiated +by cancer site, type (clinical, pathological, base) and by edition (7th, +8th, 9th). Each rule refers to a specific source page of the UICC guidelines. + +The currently available rules support the following concept categories. + +For \code{bladder} cancer: +\itemize{ +\item Edition: 7th, 8th, 9th available; +\item Type: only "base" is available, for all editions. +} +For \code{breast} cancer: +\itemize{ +\item Edition: 7th, 8th, 9th available; +\item Type: only "base" is available, for all editions. +} +For \code{colorectal} cancer: +\itemize{ +\item Edition: 7th, 8th, 9th available; +\item Type: only "base" is available, for all editions. +} +For \code{lung} cancer: +\itemize{ +\item Edition: 7th, 8th, 9th available; +\item Type: only "base" is available, for all editions. +} +For \code{oesophageal} cancer: +\itemize{ +\item For 7th edition, only "base" type is available; +\item For 8th edition, only "clinical" and "pathological" types are available but not "base". +\item For 9th edition, only "clinical" and "pathological" types are available but not "base". +} +For \code{prostate} cancer: +\itemize{ +\item For 7th edition, only "base" type is available; +\item For 8th edition, only "clinical" type is available; +\item For 9th edition, only "clinical" and "pathological" types are available but not "base". +} +For \code{skin} cancer: +\itemize{ +\item For 7th edition, only "pathological" type is available; +\item For 8th edition, only "clinical" and "pathological" types are available but not "base". +\item For 9th edition, only "clinical" and "pathological" types are available but not "base". +} + +\item \code{tnm_stage_shortcut_mapping.csv}: contains some more general rules to +determine the cancer stage based on a subset of individual TNM components, +differentiated by cancer site, type and edition. In fact, there are some +special cases in which the value of one or two components +is enough to determine the stage, independently of the others. +Each rule refers to a specific source page of the UICC guidelines. +} + +These files are meant for internal use and are not intended +to be modified by users. +} +\keyword{internal} diff --git a/renv.lock b/renv.lock index 3689ccc..ce2ea99 100644 --- a/renv.lock +++ b/renv.lock @@ -405,8 +405,7 @@ "Description": "Provides color schemes for maps (and other graphics) designed by Cynthia Brewer as described at http://colorbrewer2.org.", "License": "Apache License 2.0", "NeedsCompilation": "no", - "Repository": "RSPM", - "Encoding": "UTF-8" + "Repository": "CRAN" }, "RPostgres": { "Package": "RPostgres", @@ -541,7 +540,6 @@ "Description": "An R interface to load testing data in the 'OMOP' Common Data Model ('CDM'). An input file, csv or xlsx, can be converted to a 'CDMConnector' object. This object can be used to execute and test studies that use the 'CDM' .", "License": "Apache License (>= 2)", "Encoding": "UTF-8", - "LazyData": "true", "RoxygenNote": "7.3.3", "Depends": [ "R (>= 4.1.0)" @@ -586,13 +584,14 @@ "Config/testthat/edition": "3", "URL": "https://github.com/darwin-eu/TestGenerator, https://darwin-eu.github.io/TestGenerator/", "BugReports": "https://github.com/darwin-eu/TestGenerator/issues", - "Author": "Cesar Barboza [aut, cre] (), Ioanna Nika [aut], Ger Inberg [aut] (), Adam Black [aut] ()", "RemoteType": "github", "RemoteHost": "api.github.com", - "RemoteUsername": "darwin-eu-dev", "RemoteRepo": "TestGenerator", + "RemoteUsername": "darwin-eu-dev", "RemoteRef": "develop", - "RemoteSha": "85ed5c8d19f0015c4806bd8b2e34625feb25bba3" + "RemoteSha": "85ed5c8d19f0015c4806bd8b2e34625feb25bba3", + "NeedsCompilation": "no", + "Author": "Cesar Barboza [aut, cre] (), Ioanna Nika [aut], Ger Inberg [aut] (), Adam Black [aut] ()" }, "UpSetR": { "Package": "UpSetR", @@ -741,8 +740,7 @@ "NeedsCompilation": "no", "Author": "Hadley Wickham [aut, cre]", "Maintainer": "Hadley Wickham ", - "Repository": "https://packagemanager.posit.co/cran/latest", - "Encoding": "UTF-8" + "Repository": "CRAN" }, "backports": { "Package": "backports", @@ -785,8 +783,7 @@ "URL": "https://www.rforge.net/base64enc", "BugReports": "https://github.com/s-u/base64enc/issues", "NeedsCompilation": "yes", - "Repository": "https://packagemanager.posit.co/cran/latest", - "Encoding": "UTF-8" + "Repository": "CRAN" }, "bit": { "Package": "bit", @@ -913,7 +910,7 @@ "NeedsCompilation": "yes", "Author": "Jim Hester [aut] (), Gábor Csárdi [aut, cre], Posit Software, PBC [cph, fnd]", "Maintainer": "Gábor Csárdi ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "bslib": { "Package": "bslib", @@ -1000,7 +997,7 @@ "NeedsCompilation": "yes", "Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd]", "Maintainer": "Winston Chang ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "callr": { "Package": "callr", @@ -1194,7 +1191,7 @@ "NeedsCompilation": "no", "Author": "Matthew Lincoln [aut, cre] (ORCID: ), Louis Maddox [ctb], Steve Simpson [ctb], Jennifer Bryan [ctb]", "Maintainer": "Matthew Lincoln ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "clock": { "Package": "clock", @@ -1264,7 +1261,7 @@ "NeedsCompilation": "yes", "Author": "Jeroen Ooms [aut, cre] (ORCID: ), John MacFarlane [cph] (Author of cmark)", "Maintainer": "Jeroen Ooms ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "cpp11": { "Package": "cpp11", @@ -1374,7 +1371,7 @@ "NeedsCompilation": "no", "Author": "Jeroen Ooms [aut, cre] (ORCID: )", "Maintainer": "Jeroen Ooms ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "curl": { "Package": "curl", @@ -1507,7 +1504,7 @@ "Collate": "'assertions.R' 'authors-at-r.R' 'built.R' 'classes.R' 'collate.R' 'constants.R' 'deps.R' 'desc-package.R' 'description.R' 'encoding.R' 'find-package-root.R' 'latex.R' 'non-oo-api.R' 'package-archives.R' 'read.R' 'remotes.R' 'str.R' 'syntax_checks.R' 'urls.R' 'utils.R' 'validate.R' 'version.R'", "NeedsCompilation": "no", "Author": "Gábor Csárdi [aut, cre], Kirill Müller [aut], Jim Hester [aut], Maëlle Salmon [ctb] (), Posit Software, PBC [cph, fnd]", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "diffobj": { "Package": "diffobj", @@ -1541,7 +1538,7 @@ "NeedsCompilation": "yes", "Author": "Brodie Gaslam [aut, cre], Michael B. Allen [ctb, cph] (Original C implementation of Myers Diff Algorithm)", "Maintainer": "Brodie Gaslam ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "digest": { "Package": "digest", @@ -1570,7 +1567,7 @@ "NeedsCompilation": "yes", "Author": "Dirk Eddelbuettel [aut, cre] (ORCID: ), Antoine Lucas [ctb] (ORCID: ), Jarek Tuszynski [ctb], Henrik Bengtsson [ctb] (ORCID: ), Simon Urbanek [ctb] (ORCID: ), Mario Frasca [ctb], Bryan Lewis [ctb], Murray Stokely [ctb], Hannes Muehleisen [ctb] (ORCID: ), Duncan Murdoch [ctb], Jim Hester [ctb] (ORCID: ), Wush Wu [ctb] (ORCID: ), Qiang Kou [ctb] (ORCID: ), Thierry Onkelinx [ctb] (ORCID: ), Michel Lang [ctb] (ORCID: ), Viliam Simko [ctb], Kurt Hornik [ctb] (ORCID: ), Radford Neal [ctb] (ORCID: ), Kendon Bell [ctb] (ORCID: ), Matthew de Queljoe [ctb], Dmitry Selivanov [ctb] (ORCID: ), Ion Suruceanu [ctb] (ORCID: ), Bill Denney [ctb] (ORCID: ), Dirk Schumacher [ctb], András Svraka [ctb] (ORCID: ), Sergey Fedorov [ctb] (ORCID: ), Will Landau [ctb] (ORCID: ), Floris Vanderhaeghe [ctb] (ORCID: ), Kevin Tappe [ctb], Harris McGehee [ctb], Tim Mastny [ctb], Aaron Peikert [ctb] (ORCID: ), Mark van der Loo [ctb] (ORCID: ), Chris Muir [ctb] (ORCID: ), Moritz Beller [ctb] (ORCID: ), Sebastian Campbell [ctb] (ORCID: ), Winston Chang [ctb] (ORCID: ), Dean Attali [ctb] (ORCID: ), Michael Chirico [ctb] (ORCID: ), Kevin Ushey [ctb] (ORCID: ), Carl Pearson [ctb] (ORCID: )", "Maintainer": "Dirk Eddelbuettel ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "dplyr": { "Package": "dplyr", @@ -1757,7 +1754,7 @@ "NeedsCompilation": "yes", "Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd], Tessil [cph] (hopscotch_map library)", "Maintainer": "Winston Chang ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "fontawesome": { "Package": "fontawesome", @@ -1792,7 +1789,7 @@ "NeedsCompilation": "no", "Author": "Richard Iannone [aut, cre] (), Christophe Dervieux [ctb] (), Winston Chang [ctb], Dave Gandy [ctb, cph] (Font-Awesome font), Posit Software, PBC [cph, fnd]", "Maintainer": "Richard Iannone ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "fs": { "Package": "fs", @@ -1834,7 +1831,7 @@ "NeedsCompilation": "yes", "Author": "Jim Hester [aut], Hadley Wickham [aut], Gábor Csárdi [aut], Jeroen Ooms [cre], libuv project contributors [cph] (libuv library), Joyent, Inc. and other Node contributors [cph] (libuv library), Posit Software, PBC [cph, fnd] (ROR: )", "Maintainer": "Jeroen Ooms ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "generics": { "Package": "generics", @@ -1901,7 +1898,7 @@ "NeedsCompilation": "yes", "Author": "Jeroen Ooms [aut, cre] (ORCID: ), Jennifer Bryan [ctb] (ORCID: )", "Maintainer": "Jeroen Ooms ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "ggplot2": { "Package": "ggplot2", @@ -2055,7 +2052,7 @@ "NeedsCompilation": "no", "Author": "Gábor Csárdi [aut, cre], RStudio [cph, fnd]", "Maintainer": "Gábor Csárdi ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "glue": { "Package": "glue", @@ -2126,7 +2123,8 @@ "NeedsCompilation": "no", "Author": "Baptiste Auguie [aut, cre], Anton Antonov [ctb]", "Maintainer": "Baptiste Auguie ", - "Repository": "CRAN" + "Repository": "https://packagemanager.posit.co/cran/latest", + "Encoding": "UTF-8" }, "gtable": { "Package": "gtable", @@ -2168,6 +2166,44 @@ "Maintainer": "Thomas Lin Pedersen ", "Repository": "https://packagemanager.posit.co/cran/latest" }, + "here": { + "Package": "here", + "Version": "1.0.2", + "Source": "Repository", + "Title": "A Simpler Way to Find Your Files", + "Date": "2025-09-06", + "Authors@R": "c(person(given = \"Kirill\", family = \"M\\u00fcller\", role = c(\"aut\", \"cre\"), email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(given = \"Jennifer\", family = \"Bryan\", role = \"ctb\", email = \"jenny@rstudio.com\", comment = c(ORCID = \"0000-0002-6983-2759\")))", + "Description": "Constructs paths to your project's files. Declare the relative path of a file within your project with 'i_am()'. Use the 'here()' function as a drop-in replacement for 'file.path()', 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.1.0)" + ], + "Suggests": [ + "conflicted", + "covr", + "fs", + "knitr", + "palmerpenguins", + "plyr", + "readr", + "rlang", + "rmarkdown", + "testthat", + "uuid", + "withr" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "Config/testthat/edition": "3", + "Config/Needs/website": "tidyverse/tidytemplate", + "NeedsCompilation": "no", + "Author": "Kirill Müller [aut, cre] (ORCID: ), Jennifer Bryan [ctb] (ORCID: )", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" + }, "highr": { "Package": "highr", "Version": "0.12", @@ -2273,7 +2309,7 @@ "NeedsCompilation": "yes", "Author": "Joe Cheng [aut], Carson Sievert [aut, cre] (ORCID: ), Barret Schloerke [aut] (ORCID: ), Winston Chang [aut] (ORCID: ), Yihui Xie [aut], Jeff Allen [aut], Posit Software, PBC [cph, fnd]", "Maintainer": "Carson Sievert ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "httpuv": { "Package": "httpuv", @@ -2317,7 +2353,7 @@ "NeedsCompilation": "yes", "Author": "Joe Cheng [aut], Winston Chang [aut, cre], Posit, PBC [cph, fnd] (ROR: ), Hector Corrada Bravo [ctb], Jeroen Ooms [ctb], Andrzej Krzemienski [cph] (optional.hpp), libuv project contributors [cph] (libuv library, see src/libuv/AUTHORS file), Joyent, Inc. and other Node contributors [cph] (libuv library, see src/libuv/AUTHORS file; and http-parser library, see src/http-parser/AUTHORS file), Niels Provos [cph] (libuv subcomponent: tree.h), Internet Systems Consortium, Inc. [cph] (libuv subcomponent: inet_pton and inet_ntop, contained in src/libuv/src/inet.c), Alexander Chemeris [cph] (libuv subcomponent: stdint-msvc2008.h (from msinttypes)), Google, Inc. [cph] (libuv subcomponent: pthread-fixes.c), Sony Mobile Communcations AB [cph] (libuv subcomponent: pthread-fixes.c), Berkeley Software Design Inc. [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Kenneth MacKay [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Emergya (Cloud4all, FP7/2007-2013, grant agreement no 289016) [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Steve Reid [aut] (SHA-1 implementation), James Brown [aut] (SHA-1 implementation), Bob Trower [aut] (base64 implementation), Alexander Peslyak [aut] (MD5 implementation), Trantor Standard Systems [cph] (base64 implementation), Igor Sysoev [cph] (http-parser)", "Maintainer": "Winston Chang ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "httr2": { "Package": "httr2", @@ -2399,8 +2435,7 @@ "testthat" ], "NeedsCompilation": "no", - "Repository": "https://packagemanager.posit.co/cran/latest", - "Encoding": "UTF-8" + "Repository": "CRAN" }, "isoband": { "Package": "isoband", @@ -2464,7 +2499,7 @@ "NeedsCompilation": "no", "Author": "Carson Sievert [aut, cre] (), Joe Cheng [aut], RStudio [cph], jQuery Foundation [cph] (jQuery library and jQuery UI library), jQuery contributors [ctb, cph] (jQuery library; authors listed in inst/lib/jquery-AUTHORS.txt)", "Maintainer": "Carson Sievert ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "jsonlite": { "Package": "jsonlite", @@ -2578,8 +2613,7 @@ "stats", "graphics" ], - "Repository": "RSPM", - "Encoding": "UTF-8" + "Repository": "CRAN" }, "later": { "Package": "later", @@ -2619,7 +2653,7 @@ "NeedsCompilation": "yes", "Author": "Winston Chang [aut] (ORCID: ), Joe Cheng [aut], Charlie Gao [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: ), Marcus Geelnard [ctb, cph] (TinyCThread library, https://tinycthread.github.io/), Evan Nemerson [ctb, cph] (TinyCThread library, https://tinycthread.github.io/)", "Maintainer": "Charlie Gao ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "lifecycle": { "Package": "lifecycle", @@ -2766,7 +2800,7 @@ "NeedsCompilation": "no", "Author": "Hadley Wickham [aut], Jim Hester [aut], Winston Chang [aut, cre], Kirill Müller [aut], Daniel Cook [aut], Mark Edmondson [ctb]", "Maintainer": "Winston Chang ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "memuse": { "Package": "memuse", @@ -2981,7 +3015,7 @@ "NeedsCompilation": "no", "Author": "Gábor Csárdi [aut, cre]", "Maintainer": "Gábor Csárdi ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "pillar": { "Package": "pillar", @@ -3206,8 +3240,7 @@ ], "Collate": "'adjective.R' 'adverb.R' 'exclamation.R' 'verb.R' 'rpackage.R' 'package.R'", "NeedsCompilation": "no", - "Repository": "https://packagemanager.posit.co/cran/latest", - "Encoding": "UTF-8" + "Repository": "CRAN" }, "prettyunits": { "Package": "prettyunits", @@ -3273,7 +3306,7 @@ "NeedsCompilation": "yes", "Author": "Gábor Csárdi [aut, cre, cph] (ORCID: ), Winston Chang [aut], Posit Software, PBC [cph, fnd] (ROR: ), Ascent Digital Services [cph, fnd]", "Maintainer": "Gábor Csárdi ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "progress": { "Package": "progress", @@ -3353,7 +3386,7 @@ "NeedsCompilation": "no", "Author": "Joe Cheng [aut], Barret Schloerke [aut, cre] (ORCID: ), Winston Chang [aut] (ORCID: ), Charlie Gao [aut] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", "Maintainer": "Barret Schloerke ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "ps": { "Package": "ps", @@ -3818,7 +3851,7 @@ "Config/roxygen2/version": "8.0.0", "NeedsCompilation": "no", "Author": "Kevin Ushey [aut, cre], JJ Allaire [aut], Hadley Wickham [aut], Gary Ritchie [aut], RStudio [cph]", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "sass": { "Package": "sass", @@ -3854,7 +3887,7 @@ "NeedsCompilation": "yes", "Author": "Joe Cheng [aut], Timothy Mastny [aut], Richard Iannone [aut] (), Barret Schloerke [aut] (), Carson Sievert [aut, cre] (), Christophe Dervieux [ctb] (), RStudio [cph, fnd], Sass Open Source Foundation [ctb, cph] (LibSass library), Greter Marcel [ctb, cph] (LibSass library), Mifsud Michael [ctb, cph] (LibSass library), Hampton Catlin [ctb, cph] (LibSass library), Natalie Weizenbaum [ctb, cph] (LibSass library), Chris Eppstein [ctb, cph] (LibSass library), Adams Joseph [ctb, cph] (json.cpp), Trifunovic Nemanja [ctb, cph] (utf8.h)", "Maintainer": "Carson Sievert ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "scales": { "Package": "scales", @@ -4251,7 +4284,7 @@ "NeedsCompilation": "yes", "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd], R Core team [ctb] (Implementation of utils::recover())", "Maintainer": "Hadley Wickham ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "tibble": { "Package": "tibble", @@ -4554,7 +4587,7 @@ "NeedsCompilation": "no", "Author": "Hadley Wickham [aut] (ORCID: ), Jennifer Bryan [aut, cre] (ORCID: ), Malcolm Barrett [aut] (ORCID: ), Andy Teucher [aut] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", "Maintainer": "Jennifer Bryan ", - "Repository": "https://packagemanager.posit.co/cran/latest" + "Repository": "CRAN" }, "utf8": { "Package": "utf8", @@ -4791,8 +4824,7 @@ ], "RoxygenNote": "6.1.1", "NeedsCompilation": "no", - "Repository": "https://packagemanager.posit.co/cran/latest", - "Encoding": "UTF-8" + "Repository": "CRAN" }, "withr": { "Package": "withr", @@ -4947,10 +4979,9 @@ "R (>= 2.10.0)" ], "License": "GPL (>= 2)", - "Repository": "https://packagemanager.posit.co/cran/latest", + "Repository": "CRAN", "NeedsCompilation": "no", - "Author": "David B. Dahl [aut], David Scott [aut, cre], Charles Roosen [aut], Arni Magnusson [aut], Jonathan Swinton [aut], Ajay Shah [ctb], Arne Henningsen [ctb], Benno Puetz [ctb], Bernhard Pfaff [ctb], Claudio Agostinelli [ctb], Claudius Loehnert [ctb], David Mitchell [ctb], David Whiting [ctb], Fernando da Rosa [ctb], Guido Gay [ctb], Guido Schulz [ctb], Ian Fellows [ctb], Jeff Laake [ctb], John Walker [ctb], Jun Yan [ctb], Liviu Andronic [ctb], Markus Loecher [ctb], Martin Gubri [ctb], Matthieu Stigler [ctb], Robert Castelo [ctb], Seth Falcon [ctb], Stefan Edwards [ctb], Sven Garbade [ctb], Uwe Ligges [ctb]", - "Encoding": "UTF-8" + "Author": "David B. Dahl [aut], David Scott [aut, cre], Charles Roosen [aut], Arni Magnusson [aut], Jonathan Swinton [aut], Ajay Shah [ctb], Arne Henningsen [ctb], Benno Puetz [ctb], Bernhard Pfaff [ctb], Claudio Agostinelli [ctb], Claudius Loehnert [ctb], David Mitchell [ctb], David Whiting [ctb], Fernando da Rosa [ctb], Guido Gay [ctb], Guido Schulz [ctb], Ian Fellows [ctb], Jeff Laake [ctb], John Walker [ctb], Jun Yan [ctb], Liviu Andronic [ctb], Markus Loecher [ctb], Martin Gubri [ctb], Matthieu Stigler [ctb], Robert Castelo [ctb], Seth Falcon [ctb], Stefan Edwards [ctb], Sven Garbade [ctb], Uwe Ligges [ctb]" }, "yaml": { "Package": "yaml",