diff --git a/DESCRIPTION b/DESCRIPTION index 950cc1f..85fe7e6 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -19,7 +19,7 @@ Authors@R: c( ) Description: Access chemical, hazard, bioactivity, and exposure data from the Computational Toxicology and Exposure ('CTX') APIs - . 'ccdR' was developed to streamline the + . 'ctxR' was developed to streamline the process of accessing the information available through the 'CTX' APIs without requiring prior knowledge of how to use APIs. Most data is also available on the CompTox Chemical Dashboard ('CCD') @@ -54,8 +54,8 @@ Suggests: rmarkdown, testthat (>= 3.0.0), XML -URL: https://github.com/USEPA/ccdR -BugReports: https://github.com/USEPA/ccdR/issues +URL: https://github.com/USEPA/ctxR +BugReports: https://github.com/USEPA/ctxR/issues VignetteBuilder: knitr Config/testthat/edition: 3 Depends: diff --git a/NAMESPACE b/NAMESPACE index 788106c..dcaff97 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,14 +1,14 @@ # Generated by roxygen2: do not edit by hand S3method(print,ctx_credentials) -export(ccdr_hide_api_key) -export(ccdr_show_api_key) export(chemical_contains) export(chemical_contains_batch) export(chemical_equal) export(chemical_equal_batch) export(chemical_starts_with) export(chemical_starts_with_batch) +export(ctxR_hide_api_key) +export(ctxR_show_api_key) export(ctx_key) export(get_all_assays) export(get_all_public_chemical_lists) @@ -81,9 +81,9 @@ export(get_public_chemical_list_by_name_batch) export(get_skin_eye_hazard) export(get_skin_eye_hazard_batch) export(get_smiles) -export(has_ccdr_option) -export(has_ccdr_options) +export(has_ctxR_option) +export(has_ctxR_options) export(has_ctx_key) -export(register_ccdr) -export(set_ccdr_option) +export(register_ctx_api_key) +export(set_ctxR_option) export(showing_key) diff --git a/NEWS.md b/NEWS.md index 473da60..390c28c 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,6 +1,5 @@ -# ccdR 1.0.0 +# ctxR 1.0.0 -# ccdR 0.1.0 +* Initial release. Renamed package from `ccdR` package for better alignment +with US EPA CTX APIs. -* Added a `NEWS.md` file to track changes to the package. -* Initial release. diff --git a/R/attach.R b/R/attach.R index bd4099b..7c2cf22 100644 --- a/R/attach.R +++ b/R/attach.R @@ -11,7 +11,7 @@ cite <- paste0( cli::col_green(cli::symbol$info), ' ', - 'Please cite ', cli::col_blue('ccdR'), ' if you use it! Use `citation(\'ccdR\')` for details.' + 'Please cite ', cli::col_blue('ctxR'), ' if you use it! Use `citation(\'ctxR\')` for details.' ) rlang::inform( @@ -20,18 +20,18 @@ ) .getKeyIntoPkgEnv(silent = FALSE) - bootstrap_ccdr() + bootstrap_ctxR() } .onLoad <- function(...) { .getKeyIntoPkgEnv(silent = TRUE) - bootstrap_ccdr() + bootstrap_ctxR() } -bootstrap_ccdr <- function() { - set_ccdr_option( +bootstrap_ctxR <- function() { + set_ctxR_option( 'ctx' = structure( list( @@ -46,9 +46,9 @@ bootstrap_ccdr <- function() { .defaultFile <- function() { if (getRversion() >= "4.0.0") { - ccdRdir <- tools::R_user_dir("ccdR") - if (dir.exists(ccdRdir)) { - fname <- file.path(ccdRdir, "api.dcf") + ctxRdir <- tools::R_user_dir("ctxR") + if (dir.exists(ctxRdir)) { + fname <- file.path(ctxRdir, "api.dcf") if (file.exists(fname)) { return(fname) } diff --git a/R/ccdr_options.R b/R/ccdr_options.R deleted file mode 100644 index 43c5101..0000000 --- a/R/ccdr_options.R +++ /dev/null @@ -1,86 +0,0 @@ -#' ccdr Options -#' -#' ccdr stores options as a named list in R's global options, i.e. -#' `getOption('ccdr')`. It currently stores two such options, one for CCTE -#' credentialing and one to suppress private API information in the URLs printed -#' to the screen when web queries are placed. For both of those, see -#' [register_ccdr()]. -#' -#' @param ... a named listing of options to set -#' @param option a specific option to query, e.g. `display_api_key` -#' @name ccdr_options -#' @returns -#' * `set_ccdr_option()` does not have a return value but has the side effect -#' of setting options used by other functions. -#' -#' * `has_ccdr_option()` returns a Boolean. -#' -#' * `has_ccdr_options()` returns a Boolean. -#' @seealso [register_ccdr()] -#' -#' -#' - - - - - - -#' @rdname ccdr_options -#' @export -#' @examplesIf has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY') -#' # Set ccdr options -#' set_ccdr_option('display_api_key' = FALSE) -set_ccdr_option <- function(...) { - - # if there is no ccdr option create the list with the arguments and return - if (!has_ccdr_options()) { - options('ccdr' = list(...)) - return(invisible()) - } - - # otherwise, go through arguments sequentially and add/update - # them in the list ccdr options - ccdr <- getOption('ccdr') - arg_list <- lapply(as.list(match.call())[-1], eval, envir = parent.frame()) - for (k in seq_along(arg_list)) { - if (names(arg_list)[k] %in% names(ccdr)) { - ccdr[names(arg_list)[k]] <- arg_list[k] - } else { - ccdr <- c(ccdr, arg_list[k]) - } - } - - # set new ccdr - options('ccdr' = ccdr) - - # return - invisible() -} - - - -#' @rdname ccdr_options -#' @export -#' @examplesIf has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY') -#' # Check if there are options registered to 'ccdr' -#' has_ccdr_options() - -has_ccdr_options <- function() { - !is.null(getOption('ccdr')) -} - -#' @rdname ccdr_options -#' @export -#' @examplesIf has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY') -#' # Check if a specific option is registered for 'ccdr' -#' has_ccdr_option('display_api_key') - -has_ccdr_option <- function(option) { - - if (has_ccdr_options()){ - option %in% names(getOption('ccdr')) - } else { - FALSE - } -} diff --git a/R/chemical-APIs.R b/R/chemical-APIs.R index f1758d8..29a85ce 100644 --- a/R/chemical-APIs.R +++ b/R/chemical-APIs.R @@ -619,7 +619,7 @@ get_chem_info <- function(DTXSID = NULL, #' @param Server The root address for the API endpoint #' @param verbose A logical indicating if some “progress report” should be given. #' -#' @return @return A data.frame containing chemical information for the chemical with +#' @return A data.frame containing chemical information for the chemical with #' DTXSID matching the input parameter. #' @export #' @examplesIf has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY') diff --git a/R/ctxr_options.R b/R/ctxr_options.R new file mode 100644 index 0000000..d605cb0 --- /dev/null +++ b/R/ctxr_options.R @@ -0,0 +1,86 @@ +#' ctxR Options +#' +#' ctxR stores options as a named list in R's global options, i.e. +#' `getOption('ctxR')`. It currently stores two such options, one for CCTE +#' credentialing and one to suppress private API information in the URLs printed +#' to the screen when web queries are placed. For both of those, see +#' [register_ctx_api_key()]. +#' +#' @param ... a named listing of options to set +#' @param option a specific option to query, e.g. `display_api_key` +#' @name ctxR_options +#' @returns +#' * `set_ctxR_option()` does not have a return value but has the side effect +#' of setting options used by other functions. +#' +#' * `has_ctxR_option()` returns a Boolean. +#' +#' * `has_ctxR_options()` returns a Boolean. +#' @seealso [register_ctx_api_key()] +#' +#' +#' + + + + + + +#' @rdname ctxR_options +#' @export +#' @examplesIf has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY') +#' # Set ctxR options +#' set_ctxR_option('display_api_key' = FALSE) +set_ctxR_option <- function(...) { + + # if there is no ctxR option create the list with the arguments and return + if (!has_ctxR_options()) { + options('ctxR' = list(...)) + return(invisible()) + } + + # otherwise, go through arguments sequentially and add/update + # them in the list ctxR options + ctxR <- getOption('ctxR') + arg_list <- lapply(as.list(match.call())[-1], eval, envir = parent.frame()) + for (k in seq_along(arg_list)) { + if (names(arg_list)[k] %in% names(ctxR)) { + ctxR[names(arg_list)[k]] <- arg_list[k] + } else { + ctxR <- c(ctxR, arg_list[k]) + } + } + + # set new ctxR + options('ctxR' = ctxR) + + # return + invisible() +} + + + +#' @rdname ctxR_options +#' @export +#' @examplesIf has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY') +#' # Check if there are options registered to 'ctxR' +#' has_ctxR_options() + +has_ctxR_options <- function() { + !is.null(getOption('ctxR')) +} + +#' @rdname ctxR_options +#' @export +#' @examplesIf has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY') +#' # Check if a specific option is registered for 'ctxR' +#' has_ctxR_option('display_api_key') + +has_ctxR_option <- function(option) { + + if (has_ctxR_options()){ + option %in% names(getOption('ctxR')) + } else { + FALSE + } +} diff --git a/R/register_ctx.R b/R/register_ctx.R index b4817e4..d8d9198 100644 --- a/R/register_ctx.R +++ b/R/register_ctx.R @@ -1,4 +1,4 @@ -#' Register a CTX API +#' Register CTX API Key for ctxR #' #' This page contains documentation tools related to enabling CTX API services #' in R. @@ -9,27 +9,27 @@ #' CTX APIs. #' -#' To tell ccdR about your API key, use [register_ccdr()], e.g. -#' `register_ccdr(key = 'grbwigbwoginrowgbwibgdibdvinrginiwgo')` (that's a fake +#' To tell ctxR about your API key, use [register_ctx_api_key()], e.g. +#' `register_ctx_api_key(key = 'grbwigbwoginrowgbwibgdibdvinrginiwgo')` (that's a fake #' key). This will set your API key for the current session, but if you restart #' R, you'll need to do it again. You can set it permanently by setting `write = #' TRUE`m see the examples. If you set it permanently it will be stored in a -#' local file, and that will be accessed by ccdR persistently across +#' local file, and that will be accessed by ctxR persistently across #' sessions. #' #' Users should be aware that the API key, a string of garbled #' characters/numbers/symbols, is a PRIVATE key - it uniquely identifies and #' authenticates you to CTX's services. If anyone gets your API key, they can #' use it to masquerade as you to CTX. To mitigate against users inadvertently -#' sharing their keys, by default ccdR never displays a user's key in messages +#' sharing their keys, by default ctxR never displays a user's key in messages #' displayed to the console. #' -#' Users should be aware that ccdR has no mechanism with which to safeguard the +#' Users should be aware that ctxR has no mechanism with which to safeguard the #' private key once registered with R. That is to say, once you register your -#' API key, any R function will have access to it. As a consequence, ccdR will +#' API key, any R function will have access to it. As a consequence, ctxR will #' not know if another function, potentially from a compromised package, #' accesses the key and uploads it to a third party. For this reason, when using -#' ccdR we recommend a heightened sense of security and self-awareness: only use +#' ctxR we recommend a heightened sense of security and self-awareness: only use #' trusted packages, do not save the API keys in script files, etc. #' #' @param key an API key @@ -38,13 +38,13 @@ #' @returns #' * `showing_key` returns a Boolean. #' -#' * `ccdr_show_api_key()` has no return value but has the side effect of +#' * `ctxR_show_api_key()` has no return value but has the side effect of #' changing the display settings of the API key. #' -#' * `ccdr_hide_api_key()` has no return value but has the side effect of +#' * `ctxR_hide_api_key()` has no return value but has the side effect of #' changing the display settings of the API key. #' -#' * `register_ccdr()` has no return value but has the side effect of +#' * `register_ctx_api_key()` has no return value but has the side effect of #' storing the API key. #' #' * `print.ctx_credentials()` has no return value and is an S3 method for @@ -54,11 +54,11 @@ #' \code{NA_character_}. #' #' * `has_ctx_key()` returns a Boolean. -#' @name register_ccdr +#' @name register_ctx_api_key -#' @rdname register_ccdr +#' @rdname register_ctx_api_key #' @export #' @examplesIf has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY') #' # Check if API key is showing @@ -66,8 +66,8 @@ showing_key <- function() { - if (has_ccdr_option('display_api_key')) { - getOption('ccdr')$display_api_key + if (has_ctxR_option('display_api_key')) { + getOption('ctxR')$display_api_key } else { FALSE } @@ -75,51 +75,51 @@ showing_key <- function() { -#' @rdname register_ccdr +#' @rdname register_ctx_api_key #' @export #' @examplesIf has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY') #' # Toggle API key to display -#' ccdr_show_api_key() +#' ctxR_show_api_key() -ccdr_show_api_key <- function() { - set_ccdr_option('display_api_key' = TRUE) - cli::cli_alert_warning('ccdR will now display PRIVATE API keys in the console.') +ctxR_show_api_key <- function() { + set_ctxR_option('display_api_key' = TRUE) + cli::cli_alert_warning('ctxR will now display PRIVATE API keys in the console.') invisible() } -#' @rdname register_ccdr +#' @rdname register_ctx_api_key #' @export #' @examplesIf has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY') #' # Toggle API key to be hidden -#' ccdr_hide_api_key() +#' ctxR_hide_api_key() -ccdr_hide_api_key <- function() { - set_ccdr_option('display_api_key' = FALSE) - cli::cli_alert_info('ccdR will now suppress private API keys in the console.') +ctxR_hide_api_key <- function() { + set_ctxR_option('display_api_key' = FALSE) + cli::cli_alert_info('ctxR will now suppress private API keys in the console.') invisible() } -#' @rdname register_ccdr +#' @rdname register_ctx_api_key #' @export #' @examplesIf has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY') #' # Register key for this session -#' register_ccdr(key = 'YOUR API KEY') +#' register_ctx_api_key(key = 'YOUR API KEY') #' # Register key over sessions -#' register_ccdr(key = 'YOUR API KEY', write = TRUE) +#' register_ctx_api_key(key = 'YOUR API KEY', write = TRUE) -register_ccdr <- function(key, write = FALSE) { +register_ctx_api_key <- function(key, write = FALSE) { - # allow register_ccdr to work when ccdR not loaded + # allow register_ctx_api_key to work when ctxR not loaded # # FILL in details # # get current options - options <- getOption('ccdr') + options <- getOption('ctxR') # deal with API key @@ -128,11 +128,11 @@ register_ccdr <- function(key, write = FALSE) { if (R.version.string < "4.0.0"){ warning("This function relies on R version 4.0.0 or later. Cannot store API key over multiple sessions.") } else { - ccdrdir <- tools::R_user_dir("ccdR") - if (!dir.exists(ccdrdir)){ - dir.create(ccdrdir, recursive = TRUE) + ctxRdir <- tools::R_user_dir("ctxR") + if (!dir.exists(ctxRdir)){ + dir.create(ctxRdir, recursive = TRUE) } - fname <- file.path(ccdrdir, "api.dcf") + fname <- file.path(ctxRdir, "api.dcf") if (file.exists(fname)) { warning("Existing file found, so overwriting") } @@ -183,10 +183,10 @@ register_ccdr <- function(key, write = FALSE) { } # class - class(options) <- 'ccdr_credentials' + class(options) <- 'ctxR_credentials' # set new options - options(ccdr = options) + options(ctxR = options) # return invisible(NULL) @@ -196,7 +196,7 @@ register_ccdr <- function(key, write = FALSE) { -#' @rdname register_ccdr +#' @rdname register_ctx_api_key #' @export #' @examplesIf has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY') #' # Print function for ctx_credentials class @@ -208,7 +208,7 @@ print.ctx_credentials <- function(...) { -#' @rdname register_ccdr +#' @rdname register_ctx_api_key #' @export #' @examplesIf has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY') #' # Display ctx API key @@ -225,7 +225,7 @@ ctx_key <- function() { } -#' @rdname register_ccdr +#' @rdname register_ctx_api_key #' @export #' @examplesIf has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY') #' # Check whether API key is registered diff --git a/README.Rmd b/README.Rmd index b62b553..9b0cffc 100644 --- a/README.Rmd +++ b/README.Rmd @@ -13,19 +13,17 @@ knitr::opts_chunk$set( ) ``` -# ccdR +# ctxR -[![CRAN_Status_Badge](https://www.r-pkg.org/badges/version/ccdR)](https://cran.r-project.org/package=ccdR) -[![Monthly Downloads](https://cranlogs.r-pkg.org/badges/last-month/ccdR?color=7BAFD4)](https://cranlogs.r-pkg.org/badges/last-month/ccdR?color=7BAFD4) -The goal of ccdR is to provide R users a set of functions to access the [CTX APIs](https://www.epa.gov/comptox-tools/computational-toxicology-and-exposure-apis) +The goal of ctxR is to provide R users a set of functions to access the [CTX APIs](https://www.epa.gov/comptox-tools/computational-toxicology-and-exposure-apis) without requiring extensive experience interacting directly with APIs. ## Installation -You can install the development version of ccdR like so: +You can install the development version of ctxR like so: ``` r if (!library(devtools, logical.return = TRUE)){ @@ -33,13 +31,13 @@ if (!library(devtools, logical.return = TRUE)){ library(devtools) } -devtools::install_gitub("USEPA/ccdR") +devtools::install_gitub("USEPA/ctxR") ``` You can install from CRAN using the following: ```r -install.packages('ccdR') +install.packages('ctxR') ``` -Disclaimer: You won't need a API key to install the ccdR package, but will need to supply an API key to use ccdR. Please visit [CTX APIs](https://www.epa.gov/comptox-tools/computational-toxicology-and-exposure-apis) to request an API key. +Disclaimer: You won't need a API key to install the ctxR package, but will need to supply an API key to use ctxR. Please visit [CTX APIs](https://www.epa.gov/comptox-tools/computational-toxicology-and-exposure-apis) to request an API key. diff --git a/README.md b/README.md index 58f9c86..d04166d 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,19 @@ -# ccdR +# ctxR - -[![CRAN_Status_Badge](https://www.r-pkg.org/badges/version/ccdR)](https://cran.r-project.org/package=ccdR) -[![Monthly -Downloads](https://cranlogs.r-pkg.org/badges/last-month/ccdR?color=7BAFD4)](https://cranlogs.r-pkg.org/badges/last-month/ccdR?color=7BAFD4) -The goal of ccdR is to provide R users a set of functions to access the +The goal of ctxR is to provide R users a set of functions to access the [CTX APIs](https://www.epa.gov/comptox-tools/computational-toxicology-and-exposure-apis) without requiring extensive experience interacting directly with APIs. ## Installation -You can install the development version of ccdR like so: +You can install the development version of ctxR like so: ``` r if (!library(devtools, logical.return = TRUE)){ @@ -25,16 +21,16 @@ if (!library(devtools, logical.return = TRUE)){ library(devtools) } -devtools::install_gitub("USEPA/ccdR") +devtools::install_gitub("USEPA/ctxR") ``` You can install from CRAN using the following: ``` r -install.packages('ccdR') +install.packages('ctxR') ``` -Disclaimer: You won’t need a API key to install the ccdR package, but -will need to supply an API key to use ccdR. Please visit [CTX +Disclaimer: You won’t need a API key to install the ctxR package, but +will need to supply an API key to use ctxR. Please visit [CTX APIs](https://www.epa.gov/comptox-tools/computational-toxicology-and-exposure-apis) to request an API key. diff --git a/cran-comments.md b/cran-comments.md index b9c260c..079fc53 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,86 +1,28 @@ -## Resubmission -This is a resubmission. In this version I have: - -* Addressed CRAN comments to fix Description file misuse of quotations, adjusted -the title, adjusted spacing. -* Added missing documentation to ccdr_options.Rd, register_ccte.Rd -* Rewrote vignettes, functions, tests to not write to user's home filespace -* Reset user's options in examples, vignettes, and demos -* Reduced the size of the vignettes and associated saved httptest responses -* Updated the unit tests and reduced the size of the associated saved httptest -responses - ## Test environments -* local Windows 10 install, R 4.2.1 -* R Under development (unstable) (2024-03-19 r86153 ucrt) -* Rhub Windows Server 2022, R-devel, 64 bit -* Rhub Fedora Linux, R-devel, clang, gfortran -* Rhub Ubuntu Linux 20.04.1 LTS, R-release, GCC -* Mac mini, Apple M1, macOS 13.3.1 (22E261) - -## mac release results +* local Windows 10 install, R 4.4.0 +* R Under development (unstable) (2024-06-27 r86847 ucrt), +Windows Server 2022 x64 (build 20348) -Passed all checks. - -Status: OK -* using check arguments '--no-clean-on-error ' -* elapsed time (check, wall clock): 0:37 +* Rhub/actions Windows Server 2022 x64 (build 20348) +* Rhub/actions Ubuntu 22.04.4 LTS, clang-asan, R-devel (2024-06-27 r86847) +* Rhub/actions macos-13 on GitHub, Apple clang version 14.0.0 +(clang-1400.0.29.202), GNU Fortran (GCC) 12.2.0, macOS Venture 13.6.7 ## rhub CMD check results -- Most notes appear to be related to testing (rhub) environment -Possibly misspelled words in DESCRIPTION: - APIs (3:50, 21:51, 23:70, 24:52) - bioactivity (20:43) - CompTox (25:21) - -* checking for non-standard things in the check directory ... NOTE -Found the following files/directories: - ''NULL'' -* checking for detritus in the temp directory ... NOTE -Found the following files/directories: - 'lastMiKTeXException' - -Found the following (possibly) invalid URLs: - URL: https://comptox.epa.gov/dashboard/ - From: DESCRIPTION - inst/doc/Introduction.html - Status: Error - Message: libcurl error code 35: - error:0A000152:SSL routines::unsafe legacy renegotiation disabled - URL: https://comptox.epa.gov/dashboard/batch-search - From: inst/doc/Introduction.html - Status: Error - Message: libcurl error code 35: - error:0A000152:SSL routines::unsafe legacy renegotiation disabled - URL: https://comptox.epa.gov/dashboard/chemical-lists/CCL4 - From: inst/doc/Chemical.html - inst/doc/Hazard.html - Status: Error - Message: libcurl error code 35: - error:0A000152:SSL routines::unsafe legacy renegotiation disabled - URL: https://comptox.epa.gov/dashboard/chemical-lists/NATADB - From: inst/doc/Chemical.html - inst/doc/Hazard.html - Status: Error - Message: libcurl error code 35: - error:0A000152:SSL routines::unsafe legacy renegotiation disabled - URL: https://comptox.epa.gov/dashboard/chemical/invitrodb/DTXSID7020182 - From: inst/doc/Introduction.html - Status: Error - Message: libcurl error code 35: - error:0A000152:SSL routines::unsafe legacy renegotiation disabled - -* checking HTML version of manual ... NOTE -Skipping checking HTML validation: no command 'tidy' found +Status: OK +* elapsed time (Windows Server 2022 x64) : 1:50 +* elapsed time (Ubuntu 22.04.4 LTS) : 0:56 +* elapsed time (macos-13 on GitHub) : 1:50 ## win devel check results 1 NOTE - CRAN incoming feasibility -Indicated possibly misspelled words in DESCRIPTION (APIs, CompTox, bioactivity). These are all correctly spelled. +Indicated possibly misspelled words in DESCRIPTION (APIs, CompTox, bioactivity). +These are all correctly spelled. ## local R CMD check results @@ -93,4 +35,16 @@ Indicated possibly misspelled words in DESCRIPTION (APIs, CompTox, bioactivity). 0 errors | 0 warnings | 1 note -* This is a new release. +* This is a new release. It is a renamed version of the ccdR 1.0.0 package. +There are a few reasons for renaming this package. ccdR was developed when the +APIs it wraps were primarily pulling data from the CompTox Chemicals Dashboard +(CCD) and named to reflect that. More data is now available from the APIs than +is represented by the CCD. The APIs have been renamed to be the +Computational Toxicology and Exposure (CTX) APIs, which is a stable name that +more appropriately represents the data domain and area of research the tools +and resources related to the data represent. ctxR is much more representative +than ccdR of the current APIs and data. Additionally, the US EPA is +coordinating several API clients written in different languages to use the +consistent package name ctx_, where '_' is used to represent the language in +which a client is developed (e.g. ctxR for R, ctxPy for Python). Renaming ccdR +to ctxR reflects this harmonization of CTX API clients across languages. diff --git a/man/ccdr_options.Rd b/man/ctxR_options.Rd similarity index 52% rename from man/ccdr_options.Rd rename to man/ctxR_options.Rd index bf97fe8..1842991 100644 --- a/man/ccdr_options.Rd +++ b/man/ctxR_options.Rd @@ -1,17 +1,17 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/ccdr_options.R -\name{ccdr_options} -\alias{ccdr_options} -\alias{set_ccdr_option} -\alias{has_ccdr_options} -\alias{has_ccdr_option} -\title{ccdr Options} +% Please edit documentation in R/ctxr_options.R +\name{ctxR_options} +\alias{ctxR_options} +\alias{set_ctxR_option} +\alias{has_ctxR_options} +\alias{has_ctxR_option} +\title{ctxR Options} \usage{ -set_ccdr_option(...) +set_ctxR_option(...) -has_ccdr_options() +has_ctxR_options() -has_ccdr_option(option) +has_ctxR_option(option) } \arguments{ \item{...}{a named listing of options to set} @@ -20,33 +20,33 @@ has_ccdr_option(option) } \value{ \itemize{ -\item \code{set_ccdr_option()} does not have a return value but has the side effect +\item \code{set_ctxR_option()} does not have a return value but has the side effect of setting options used by other functions. -\item \code{has_ccdr_option()} returns a Boolean. -\item \code{has_ccdr_options()} returns a Boolean. +\item \code{has_ctxR_option()} returns a Boolean. +\item \code{has_ctxR_options()} returns a Boolean. } } \description{ -ccdr stores options as a named list in R's global options, i.e. -\code{getOption('ccdr')}. It currently stores two such options, one for CCTE +ctxR stores options as a named list in R's global options, i.e. +\code{getOption('ctxR')}. It currently stores two such options, one for CCTE credentialing and one to suppress private API information in the URLs printed to the screen when web queries are placed. For both of those, see -\code{\link[=register_ccdr]{register_ccdr()}}. +\code{\link[=register_ctx_api_key]{register_ctx_api_key()}}. } \examples{ \dontshow{if (has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY')) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} -# Set ccdr options -set_ccdr_option('display_api_key' = FALSE) +# Set ctxR options +set_ctxR_option('display_api_key' = FALSE) \dontshow{\}) # examplesIf} \dontshow{if (has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY')) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} -# Check if there are options registered to 'ccdr' -has_ccdr_options() +# Check if there are options registered to 'ctxR' +has_ctxR_options() \dontshow{\}) # examplesIf} \dontshow{if (has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY')) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} -# Check if a specific option is registered for 'ccdr' -has_ccdr_option('display_api_key') +# Check if a specific option is registered for 'ctxR' +has_ctxR_option('display_api_key') \dontshow{\}) # examplesIf} } \seealso{ -\code{\link[=register_ccdr]{register_ccdr()}} +\code{\link[=register_ctx_api_key]{register_ctx_api_key()}} } diff --git a/man/get_fate_by_dtxsid.Rd b/man/get_fate_by_dtxsid.Rd index f10382e..a941d72 100644 --- a/man/get_fate_by_dtxsid.Rd +++ b/man/get_fate_by_dtxsid.Rd @@ -21,7 +21,7 @@ get_fate_by_dtxsid( \item{verbose}{A logical indicating if some “progress report” should be given.} } \value{ -@return A data.frame containing chemical information for the chemical with +A data.frame containing chemical information for the chemical with DTXSID matching the input parameter. } \description{ diff --git a/man/register_ccdr.Rd b/man/register_ctx_api_key.Rd similarity index 77% rename from man/register_ccdr.Rd rename to man/register_ctx_api_key.Rd index 35695bd..be99e11 100644 --- a/man/register_ccdr.Rd +++ b/man/register_ctx_api_key.Rd @@ -1,22 +1,22 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/register_ctx.R -\name{register_ccdr} -\alias{register_ccdr} +\name{register_ctx_api_key} +\alias{register_ctx_api_key} \alias{showing_key} -\alias{ccdr_show_api_key} -\alias{ccdr_hide_api_key} +\alias{ctxR_show_api_key} +\alias{ctxR_hide_api_key} \alias{print.ctx_credentials} \alias{ctx_key} \alias{has_ctx_key} -\title{Register a CTX API} +\title{Register CTX API Key for ctxR} \usage{ showing_key() -ccdr_show_api_key() +ctxR_show_api_key() -ccdr_hide_api_key() +ctxR_hide_api_key() -register_ccdr(key, write = FALSE) +register_ctx_api_key(key, write = FALSE) \method{print}{ctx_credentials}(...) @@ -34,11 +34,11 @@ has_ctx_key() \value{ \itemize{ \item \code{showing_key} returns a Boolean. -\item \code{ccdr_show_api_key()} has no return value but has the side effect of +\item \code{ctxR_show_api_key()} has no return value but has the side effect of changing the display settings of the API key. -\item \code{ccdr_hide_api_key()} has no return value but has the side effect of +\item \code{ctxR_hide_api_key()} has no return value but has the side effect of changing the display settings of the API key. -\item \code{register_ccdr()} has no return value but has the side effect of +\item \code{register_ctx_api_key()} has no return value but has the side effect of storing the API key. \item \code{print.ctx_credentials()} has no return value and is an S3 method for printing the \code{ctx_credentials} class. @@ -57,26 +57,26 @@ To obtain an API key and enable services, go to This documentation shows you how to obtain an API key to allow access to the CTX APIs. -To tell ccdR about your API key, use \code{\link[=register_ccdr]{register_ccdr()}}, e.g. -\code{register_ccdr(key = 'grbwigbwoginrowgbwibgdibdvinrginiwgo')} (that's a fake +To tell ctxR about your API key, use \code{\link[=register_ctx_api_key]{register_ctx_api_key()}}, e.g. +\code{register_ctx_api_key(key = 'grbwigbwoginrowgbwibgdibdvinrginiwgo')} (that's a fake key). This will set your API key for the current session, but if you restart R, you'll need to do it again. You can set it permanently by setting \code{write = TRUE}m see the examples. If you set it permanently it will be stored in a -local file, and that will be accessed by ccdR persistently across +local file, and that will be accessed by ctxR persistently across sessions. Users should be aware that the API key, a string of garbled characters/numbers/symbols, is a PRIVATE key - it uniquely identifies and authenticates you to CTX's services. If anyone gets your API key, they can use it to masquerade as you to CTX. To mitigate against users inadvertently -sharing their keys, by default ccdR never displays a user's key in messages +sharing their keys, by default ctxR never displays a user's key in messages displayed to the console. -Users should be aware that ccdR has no mechanism with which to safeguard the +Users should be aware that ctxR has no mechanism with which to safeguard the private key once registered with R. That is to say, once you register your -API key, any R function will have access to it. As a consequence, ccdR will +API key, any R function will have access to it. As a consequence, ctxR will not know if another function, potentially from a compromised package, accesses the key and uploads it to a third party. For this reason, when using -ccdR we recommend a heightened sense of security and self-awareness: only use +ctxR we recommend a heightened sense of security and self-awareness: only use trusted packages, do not save the API keys in script files, etc. } \examples{ @@ -86,17 +86,17 @@ showing_key() \dontshow{\}) # examplesIf} \dontshow{if (has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY')) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Toggle API key to display -ccdr_show_api_key() +ctxR_show_api_key() \dontshow{\}) # examplesIf} \dontshow{if (has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY')) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Toggle API key to be hidden -ccdr_hide_api_key() +ctxR_hide_api_key() \dontshow{\}) # examplesIf} \dontshow{if (has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY')) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Register key for this session -register_ccdr(key = 'YOUR API KEY') +register_ctx_api_key(key = 'YOUR API KEY') # Register key over sessions -register_ccdr(key = 'YOUR API KEY', write = TRUE) +register_ctx_api_key(key = 'YOUR API KEY', write = TRUE) \dontshow{\}) # examplesIf} \dontshow{if (has_ctx_key() & is.na(ctx_key() == 'FAKE_KEY')) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Print function for ctx_credentials class diff --git a/tests/testthat.R b/tests/testthat.R index 88814ce..297794d 100644 --- a/tests/testthat.R +++ b/tests/testthat.R @@ -7,6 +7,6 @@ # * https://testthat.r-lib.org/reference/test_package.html#special-files library(testthat) -library(ccdR) +library(ctxR) -test_check("ccdR") +test_check("ctxR") diff --git a/tests/testthat/test-bioactivity-APIs-batch.R b/tests/testthat/test-bioactivity-APIs-batch.R index 534980d..4859d9d 100644 --- a/tests/testthat/test-bioactivity-APIs-batch.R +++ b/tests/testthat/test-bioactivity-APIs-batch.R @@ -1,6 +1,6 @@ with_mock_dir("bioactivity-batch",{ # test_that("catch missing API", { -# # Run register_ccdr(key = 'YOUR KEY', write = TRUE) prior to running tests +# # Run register_ctxR(key = 'YOUR KEY', write = TRUE) prior to running tests # # #store env variable so tests don't overwrite # #tmp <- Sys.getenv("CTX_API_KEY") diff --git a/tests/testthat/test-bioactivity-APIs.R b/tests/testthat/test-bioactivity-APIs.R index 810c0fa..8a83026 100644 --- a/tests/testthat/test-bioactivity-APIs.R +++ b/tests/testthat/test-bioactivity-APIs.R @@ -1,7 +1,7 @@ with_mock_dir("bioactivity",{ # test_that("Catch missing API", { -# # Run register_ccdr(key = 'YOUR KEY', write = TRUE) prior to running tests +# # Run register_ctxR(key = 'YOUR KEY', write = TRUE) prior to running tests # #store env variable so tests don't overwrite # # tmp <- Sys.getenv("CTX_API_KEY") # # on.exit(Sys.setenv("CTX_API_KEY" = tmp)) diff --git a/tests/testthat/test-chemical-APIs-batch.R b/tests/testthat/test-chemical-APIs-batch.R index 95b33e7..763497b 100644 --- a/tests/testthat/test-chemical-APIs-batch.R +++ b/tests/testthat/test-chemical-APIs-batch.R @@ -7,7 +7,7 @@ with_mock_dir("chemical-batch",{ # # #set env variable temporarily for testing # # Sys.setenv("CTX_API_KEY" = "stored_api_key") # # } -# # Run register_ccdr(key = 'YOUR KEY', write = TRUE) prior to running tests +# # Run register_ctxR(key = 'YOUR KEY', write = TRUE) prior to running tests # expect_message(get_chemical_details_batch(DTXSID = c('DTXSID7020182'), verbose = TRUE), 'Using stored API key!') # expect_message(get_chemical_details_batch(DTXSID = c('DTXSID7020182'), API_key = 1, verbose = TRUE), 'Using stored API key!') # # expect_message(get_chemical_by_property_range_batch(), 'Using stored API key!') diff --git a/tests/testthat/test-chemical-APIs.R b/tests/testthat/test-chemical-APIs.R index 5e119fe..b67ad61 100644 --- a/tests/testthat/test-chemical-APIs.R +++ b/tests/testthat/test-chemical-APIs.R @@ -1,6 +1,6 @@ with_mock_dir("chemical",{ # test_that("catch missing API", { -# # Run register_ccdr(key = 'YOUR KEY', write = TRUE) prior to running tests +# # Run register_ctxR(key = 'YOUR KEY', write = TRUE) prior to running tests # # #store env variable so tests don't overwrite # # tmp <- Sys.getenv("CTX_API_KEY") diff --git a/tests/testthat/test-hazard-APIs-batch.R b/tests/testthat/test-hazard-APIs-batch.R index 8df5cd7..fe658ce 100644 --- a/tests/testthat/test-hazard-APIs-batch.R +++ b/tests/testthat/test-hazard-APIs-batch.R @@ -7,7 +7,7 @@ with_mock_dir("hazard-batch",{ # # #set env variable temporarily for testing # # Sys.setenv("CTX_API_KEY" = "stored_api_key") # # } -# # Run register_ccdr(key = 'YOUR KEY', write = TRUE) prior to running tests +# # Run register_ctxR(key = 'YOUR KEY', write = TRUE) prior to running tests # expect_message(get_hazard_by_dtxsid_batch(DTXSID = c('DTXSID7020182'), verbose = TRUE), 'Using stored API key!') # expect_message(get_hazard_by_dtxsid_batch(DTXSID = c('DTXSID7020182'), API_key = 1, verbose = TRUE), 'Using stored API key!') # expect_message(get_human_hazard_by_dtxsid_batch(DTXSID = c('DTXSID7020182'), verbose = TRUE), 'Using stored API key!') diff --git a/tests/testthat/test-hazard-APIs.R b/tests/testthat/test-hazard-APIs.R index 0feaf30..3fb1117 100644 --- a/tests/testthat/test-hazard-APIs.R +++ b/tests/testthat/test-hazard-APIs.R @@ -1,6 +1,6 @@ with_mock_dir("hazard",{ # test_that("catch missing API", { -# # Run register_ccdr(key = 'YOUR KEY', write = TRUE) prior to running tests +# # Run register_ctxR(key = 'YOUR KEY', write = TRUE) prior to running tests # #store env variable so tests don't overwrite # # tmp <- Sys.getenv("CTX_API_KEY") # # on.exit(Sys.setenv("CTX_API_KEY" = tmp)) diff --git a/vignettes/Bioactivity.Rmd b/vignettes/Bioactivity.Rmd index 4b5cecf..00b16e0 100644 --- a/vignettes/Bioactivity.Rmd +++ b/vignettes/Bioactivity.Rmd @@ -36,16 +36,17 @@ start_vignette("4") ``` ```{r setup, echo=FALSE, message=FALSE, warning=FALSE} -if (!library(ccdR, logical.return = TRUE)){ +if (!library(ctxR, logical.return = TRUE)){ devtools::load_all() } +old_options <- options("width") ``` ```{r setup-print, echo = FALSE} # Redefining the knit_print method to truncate character values to 25 characters # in each column and to truncate the columns in the print call to prevent # wrapping tables with several columns. -#library(ccdR) +#library(ctxR) knit_print.data.table = function(x, ...) { y <- data.table::copy(x) y <- y[, lapply(.SD, function(t){ @@ -75,7 +76,7 @@ In this vignette, [CTX Bioactivity API](https://api-ccte.epa.gov/docs/bioactivit ::: {.noticebox data-latex=""} -**NOTE:** Please see the introductory vignette for an overview of the *ccdR* package and initial set up instruction with API key storage. +**NOTE:** Please see the introductory vignette for an overview of the *ctxR* package and initial set up instruction with API key storage. ::: @@ -97,12 +98,12 @@ The Bioactivity API endpoints are organized into two different resources, "Assay "Data" resource endpoints are split into summary data (by 'aeid') and bioactivity data by 'm4id' (i.e. both 'aeid' and 'spid'). The summary endpoint returns the number of active hits and total multi- and single-concentration chemicals tested for specific 'aeids'. The other endpoints return chemical information, level 3 concentration-response values, level 4 fit parameters, level 5 hit parameters, and level 6 flags for individual chemicals tested for given 'AEIDs', 'm4ids', 'SPIDs', or 'DTXSIDs'. -Regular ToxCast/invitrodb users may find it easier to use [tcpl](https://CRAN.R-project.org/package=tcpl), which has integrated ccdR's bioactivity functions to make the API data retrievable in a familiar format. See the [tcpl](https://CRAN.R-project.org/package=tcpl) vignette regarding data retrieval via API for more information. +Regular ToxCast/invitrodb users may find it easier to use [tcpl](https://CRAN.R-project.org/package=tcpl), which has integrated ctxR's bioactivity functions to make the API data retrievable in a familiar format. See the [tcpl](https://CRAN.R-project.org/package=tcpl) vignette regarding data retrieval via API for more information. # Functions -Several ccdR functions are used to access the CTX Bioactivity API data. +Several ctxR functions are used to access the CTX Bioactivity API data. ## Bioactivity Assay Resource @@ -114,7 +115,7 @@ Specific assays may be searched as well as all available assays that have data u `get_annotation_by_aeid()` retrieves annotation for a specific assay endpoint id (aeid). -```{r ccdR annotation by aeid, message=FALSE} +```{r ctxR annotation by aeid, message=FALSE} assay <- get_annotation_by_aeid(AEID = "891") ``` @@ -124,14 +125,14 @@ printFormattedTable(assay, c(4, 18, 33, 51)) # printed using custom formatted ta `get_annotation_by_aeid_batch()` retrieves annotation for a list (or vector) of assay endpoint ids (aeids). -```{r ccdR annotation by aeid batch, message=FALSE} +```{r ctxR annotation by aeid batch, message=FALSE} assays <- get_annotation_by_aeid_batch(AEID = c(759,700,891)) # return is in list form by aeid, convert to table for output assays <- data.table::rbindlist(assays) ``` -```{r ccdR-all-assays, message=FALSE, eval=FALSE} +```{r ctxR-all-assays, message=FALSE, eval=FALSE} printFormattedTable(assays, c(4, 18, 19, 33, 51)) # printed using custom formatted table ``` @@ -139,7 +140,7 @@ printFormattedTable(assays, c(4, 18, 19, 33, 51)) # printed using custom formatt `get_all_assays()` retrieves all annotations for all assays available. -```{r ccdR all assays, message=FALSE, eval=FALSE} +```{r ctxR all assays, message=FALSE, eval=FALSE} all_assays <- get_all_assays() ``` @@ -152,7 +153,7 @@ There are several resources for retrieving bioactivity data associated with a va `get_bioactivity_summary()` retrieves a summary of the number of active hits compared to the total number tested for both multiple and single concentration by aeid. -```{r ccdR summary by aeid, message=FALSE} +```{r ctxR summary by aeid, message=FALSE} summary <- get_bioactivity_summary(AEID = "891") ``` @@ -163,7 +164,7 @@ printFormattedTable(summary) # printed using custom formatted table `get_bioactivity_summary_batch()` retrieves a summary for a list (or vector) of assay endpoint ids (aeids). -```{r ccdR summary by aeid batch, message=FALSE} +```{r ctxR summary by aeid batch, message=FALSE} summary <- get_bioactivity_summary_batch(AEID = c(759,700,891)) summary <- data.table::rbindlist(summary) ``` @@ -177,7 +178,7 @@ printFormattedTable(summary) # printed using custom formatted table `get_bioactivity_details()` can retrieve all available multiple concentration data by assay endpoint id (aeid), sample id (spid), Level 4 ID (m4id), or chemical DTXSID. Returned is chemical information, level 3 concentration-response values, level 4 fit parameters, level 5 hit parameters, and level 6 flags for individual chemicals tested. An example for each request parameter is provided below: -```{r ccdR data by spid, message=FALSE, results = FALSE} +```{r ctxR data by spid, message=FALSE, results = FALSE} # By spid spid_data <- get_bioactivity_details(SPID = 'TP0000904H05') ``` @@ -186,7 +187,7 @@ spid_data <- get_bioactivity_details(SPID = 'TP0000904H05') printFormattedTable(head(spid_data), c(ncol(spid_data)-2)) # printed using custom formatted table ``` -```{r ccdR data by m4id, message=FALSE, results = FALSE} +```{r ctxR data by m4id, message=FALSE, results = FALSE} # By m4id m4id_data <- get_bioactivity_details(m4id = 739695) ``` @@ -196,7 +197,7 @@ printFormattedTable(m4id_data, c(ncol(m4id_data) - 2)) # printed using custom fo ``` -```{r ccdR data by dtxsid, message=FALSE, results = FALSE} +```{r ctxR data by dtxsid, message=FALSE, results = FALSE} # By DTXSID dtxsid_data <- get_bioactivity_details(DTXSID = "DTXSID30944145") ``` @@ -206,7 +207,7 @@ printFormattedTable(dtxsid_data, c(ncol(dtxsid_data)-2)) # printed using custom ``` -```{r ccdR data by aeid, message=FALSE, results = FALSE} +```{r ctxR data by aeid, message=FALSE, results = FALSE} # By aeid aeid_data <- get_bioactivity_details(AEID = 704) ``` @@ -217,7 +218,7 @@ printFormattedTable(head(aeid_data), c(ncol(aeid_data)-2)) # printed using custo Similar to the other `_batch` functions, `get_bioactivity_details_batch()` retrieves data for a list (or vector) of assay endpoint ids (aeid), sample ids (spid), Level 4 IDs (m4id), or chemical DTXSIDs. -```{r ccdR data by aeid batch, message=FALSE, eval=FALSE} +```{r ctxR data by aeid batch, message=FALSE, eval=FALSE} aeid_data_batch <- get_bioactivity_details_batch(AEID = c(759,700,891)) aeid_data_batch <- data.table::rbindlist(aeid_data_batch, fill = TRUE) ``` @@ -225,7 +226,7 @@ aeid_data_batch <- data.table::rbindlist(aeid_data_batch, fill = TRUE) # Conclusion -In this vignette, a variety of functions that access different types of data found in the `Bioactivity` endpoints of the CTX APIs were listed. We encourage the reader to explore the data accessible through these endpoints work with it to get a better understanding of what data is available. Additionally, experienced ToxCast/invitrodb users may find it easier to continue to use [tcpl](https://CRAN.R-project.org/package=tcpl), which has integrated ccdR's bioactivity functions to make the API data retrievable in a familiar format. +In this vignette, a variety of functions that access different types of data found in the `Bioactivity` endpoints of the CTX APIs were listed. We encourage the reader to explore the data accessible through these endpoints work with it to get a better understanding of what data is available. Additionally, experienced ToxCast/invitrodb users may find it easier to continue to use [tcpl](https://CRAN.R-project.org/package=tcpl), which has integrated ctxR's bioactivity functions to make the API data retrievable in a familiar format. ```{r breakdown, echo = FALSE, results = 'hide'} @@ -239,6 +240,8 @@ registerS3method( "knit_print", "data.table", knit_print.data.table, envir = asNamespace("knitr") ) + +options(old_options) ``` ```{r, include=FALSE} diff --git a/vignettes/Chemical.Rmd b/vignettes/Chemical.Rmd index 08df781..86a0420 100644 --- a/vignettes/Chemical.Rmd +++ b/vignettes/Chemical.Rmd @@ -41,7 +41,7 @@ start_vignette("2") ``` ```{r setup, echo=FALSE, message=FALSE, warning=FALSE} -if (!library(ccdR, logical.return = TRUE)){ +if (!library(ctxR, logical.return = TRUE)){ devtools::load_all() } old_options <- options("width") @@ -57,7 +57,7 @@ library(gridExtra) # Redefining the knit_print method to truncate character values to 25 characters # in each column and to truncate the columns in the print call to prevent # wrapping tables with several columns. -#library(ccdR) +#library(ctxR) knit_print.data.table = function(x, ...) { y <- data.table::copy(x) y <- y[, lapply(.SD, function(t){ @@ -81,7 +81,7 @@ In this vignette, [CTX Chemical API](https://api-ccte.epa.gov/docs/chemical.html ::: {.noticebox data-latex=""} -**NOTE:** Please see the introductory vignette for an overview of the *ccdR* package and initial set up instruction with API key storage. +**NOTE:** Please see the introductory vignette for an overview of the *ctxR* package and initial set up instruction with API key storage. ::: @@ -96,7 +96,7 @@ More information on Chemicals and Chemistry Data can be found here: