AMR/R/zzz.R

243 lines
11 KiB
R
Raw Normal View History

# ==================================================================== #
# TITLE: #
2022-10-05 09:12:22 +02:00
# AMR: An R Package for Working with Antimicrobial Resistance Data #
# #
# SOURCE CODE: #
2020-07-08 14:48:06 +02:00
# https://github.com/msberends/AMR #
# #
# PLEASE CITE THIS SOFTWARE AS: #
# Berends MS, Luz CF, Friedrich AW, et al. (2022). #
# AMR: An R Package for Working with Antimicrobial Resistance Data. #
# Journal of Statistical Software, 104(3), 1-31. #
2023-05-27 10:39:22 +02:00
# https://doi.org/10.18637/jss.v104.i03 #
2022-10-05 09:12:22 +02:00
# #
2022-12-27 15:16:15 +01:00
# Developed at the University of Groningen and the University Medical #
# Center Groningen in The Netherlands, in collaboration with many #
# colleagues from around the world, see our website. #
# #
2019-01-02 23:24:07 +01:00
# This R package is free software; you can freely use and distribute #
# it for both personal and commercial purposes under the terms of the #
# GNU General Public License version 2.0 (GNU GPL-2), as published by #
# the Free Software Foundation. #
# We created this package for both routine data analysis and academic #
# research and it was publicly released in the hope that it will be #
# useful, but it comes WITHOUT ANY WARRANTY OR LIABILITY. #
2020-10-08 11:16:03 +02:00
# #
# Visit our website for the full manual and a complete tutorial about #
# how to conduct AMR data analysis: https://msberends.github.io/AMR/ #
# ==================================================================== #
2020-12-29 21:23:01 +01:00
# set up package environment, used by numerous AMR functions
2022-10-05 09:12:22 +02:00
AMR_env <- new.env(hash = FALSE)
AMR_env$mo_uncertainties <- data.frame(
original_input = character(0),
input = character(0),
fullname = character(0),
mo = character(0),
candidates = character(0),
minimum_matching_score = integer(0),
keep_synonyms = logical(0),
stringsAsFactors = FALSE
)
AMR_env$mo_renamed <- list()
AMR_env$mo_previously_coerced <- data.frame(
x = character(0),
mo = character(0),
stringsAsFactors = FALSE
2022-08-28 10:31:50 +02:00
)
2022-10-10 15:44:59 +02:00
AMR_env$ab_previously_coerced <- data.frame(
x = character(0),
ab = character(0),
stringsAsFactors = FALSE
)
AMR_env$av_previously_coerced <- data.frame(
x = character(0),
av = character(0),
stringsAsFactors = FALSE
)
2023-01-21 23:47:20 +01:00
AMR_env$sir_interpretation_history <- data.frame(
2022-09-01 15:20:57 +02:00
datetime = Sys.time()[0],
index = integer(0),
ab_given = character(0),
mo_given = character(0),
host_given = character(0),
2023-07-11 09:50:45 +02:00
ab = set_clean_class(character(0), c("ab", "character")),
mo = set_clean_class(character(0), c("mo", "character")),
host = character(0),
method = character(0),
2022-09-01 15:20:57 +02:00
input = double(0),
2023-03-16 08:55:37 +01:00
outcome = NA_sir_[0],
notes = character(0),
guideline = character(0),
2023-07-11 09:50:45 +02:00
ref_table = character(0),
uti = logical(0),
breakpoint_S_R = character(0),
2022-09-01 15:20:57 +02:00
stringsAsFactors = FALSE
)
2023-07-11 09:50:45 +02:00
AMR_env$custom_ab_codes <- character(0)
2022-12-27 15:16:15 +01:00
AMR_env$custom_mo_codes <- character(0)
2022-10-30 21:05:46 +01:00
AMR_env$is_dark_theme <- NULL
AMR_env$chmatch <- import_fn("chmatch", "data.table", error_on_fail = FALSE)
AMR_env$chin <- import_fn("%chin%", "data.table", error_on_fail = FALSE)
2020-12-29 21:23:01 +01:00
# take cli symbols and error function if available
2024-04-19 10:18:21 +02:00
AMR_env$info_icon <- import_fn("symbol", "cli", error_on_fail = FALSE)$info %or% "i"
AMR_env$bullet_icon <- import_fn("symbol", "cli", error_on_fail = FALSE)$bullet %or% "*"
AMR_env$dots <- import_fn("symbol", "cli", error_on_fail = FALSE)$ellipsis %or% "..."
AMR_env$sup_1_icon <- import_fn("symbol", "cli", error_on_fail = FALSE)$sup_1 %or% "*"
AMR_env$cli_abort <- import_fn("cli_abort", "cli", error_on_fail = FALSE)
2021-05-12 18:15:03 +02:00
2022-10-05 09:12:22 +02:00
.onLoad <- function(lib, pkg) {
# Support for tibble headers (type_sum) and tibble columns content (pillar_shaft)
2022-08-28 10:31:50 +02:00
# without the need to depend on other packages. This was suggested by the
# developers of the vctrs package:
# https://github.com/r-lib/vctrs/blob/05968ce8e669f73213e3e894b5f4424af4f46316/R/register-s3.R
s3_register("pillar::pillar_shaft", "ab")
s3_register("pillar::pillar_shaft", "av")
2020-08-26 11:33:54 +02:00
s3_register("pillar::pillar_shaft", "mo")
2023-01-21 23:47:20 +01:00
s3_register("pillar::pillar_shaft", "sir")
2020-08-26 11:33:54 +02:00
s3_register("pillar::pillar_shaft", "mic")
s3_register("pillar::pillar_shaft", "disk")
# no type_sum of disk, that's now in vctrs::vec_ptype_full
2022-11-24 20:29:00 +01:00
s3_register("pillar::type_sum", "ab")
s3_register("pillar::type_sum", "av")
s3_register("pillar::type_sum", "mo")
2023-01-21 23:47:20 +01:00
s3_register("pillar::type_sum", "sir")
2022-11-24 20:29:00 +01:00
s3_register("pillar::type_sum", "mic")
s3_register("pillar::tbl_sum", "antibiogram")
s3_register("pillar::tbl_format_footer", "antibiogram")
# Support for frequency tables from the cleaner package
s3_register("cleaner::freq", "mo")
2023-01-21 23:47:20 +01:00
s3_register("cleaner::freq", "sir")
# Support for skim() from the skimr package
2023-02-18 14:56:06 +01:00
if (pkg_is_available("skimr", min_version = "2.0.0")) {
s3_register("skimr::get_skimmers", "mo")
2023-01-21 23:47:20 +01:00
s3_register("skimr::get_skimmers", "sir")
s3_register("skimr::get_skimmers", "mic")
s3_register("skimr::get_skimmers", "disk")
}
# Support for autoplot() from the ggplot2 package
2023-01-21 23:47:20 +01:00
s3_register("ggplot2::autoplot", "sir")
s3_register("ggplot2::autoplot", "mic")
s3_register("ggplot2::autoplot", "disk")
s3_register("ggplot2::autoplot", "resistance_predict")
s3_register("ggplot2::autoplot", "antibiogram")
2021-11-01 13:51:13 +01:00
# Support for fortify from the ggplot2 package
2023-01-21 23:47:20 +01:00
s3_register("ggplot2::fortify", "sir")
2021-11-01 13:51:13 +01:00
s3_register("ggplot2::fortify", "mic")
s3_register("ggplot2::fortify", "disk")
2023-02-24 09:43:10 +01:00
# Support for knitr (R Markdown/Quarto)
2023-02-23 16:27:40 +01:00
s3_register("knitr::knit_print", "antibiogram")
2023-02-24 09:43:10 +01:00
s3_register("knitr::knit_print", "formatted_bug_drug_combinations")
# Support vctrs package for use in e.g. dplyr verbs
# NOTE 2024-02-22 this is the right way - it should be 2 S3 classes in the second argument
2022-10-31 11:19:06 +01:00
# S3: ab_selector
2024-02-24 18:51:37 +01:00
s3_register("vctrs::vec_ptype2", "character.ab_selector")
s3_register("vctrs::vec_ptype2", "ab_selector.character")
s3_register("vctrs::vec_cast", "character.ab_selector")
2022-10-31 11:19:06 +01:00
# S3: ab_selector_any_all
2024-02-24 18:51:37 +01:00
s3_register("vctrs::vec_ptype2", "logical.ab_selector_any_all")
s3_register("vctrs::vec_ptype2", "ab_selector_any_all.logical")
2022-08-21 16:37:20 +02:00
s3_register("vctrs::vec_cast", "logical.ab_selector_any_all")
2022-10-31 11:19:06 +01:00
# S3: ab
s3_register("vctrs::vec_ptype2", "ab.default")
s3_register("vctrs::vec_ptype2", "ab.ab")
2022-10-31 11:19:06 +01:00
s3_register("vctrs::vec_cast", "character.ab")
s3_register("vctrs::vec_cast", "ab.character")
# S3: av
s3_register("vctrs::vec_ptype2", "av.default")
s3_register("vctrs::vec_ptype2", "av.av")
s3_register("vctrs::vec_cast", "character.av")
s3_register("vctrs::vec_cast", "av.character")
2022-10-31 11:19:06 +01:00
# S3: mo
s3_register("vctrs::vec_ptype2", "mo.default")
s3_register("vctrs::vec_ptype2", "mo.mo")
2022-10-31 11:19:06 +01:00
s3_register("vctrs::vec_cast", "character.mo")
s3_register("vctrs::vec_cast", "mo.character")
# S3: disk
2024-04-07 20:22:59 +02:00
s3_register("vctrs::vec_ptype_full", "disk")
s3_register("vctrs::vec_ptype_abbr", "disk")
s3_register("vctrs::vec_ptype2", "disk.default")
s3_register("vctrs::vec_ptype2", "disk.disk")
s3_register("vctrs::vec_cast", "disk.disk")
s3_register("vctrs::vec_cast", "integer.disk")
2022-10-31 11:19:06 +01:00
s3_register("vctrs::vec_cast", "disk.integer")
s3_register("vctrs::vec_cast", "double.disk")
s3_register("vctrs::vec_cast", "disk.double")
s3_register("vctrs::vec_cast", "character.disk")
s3_register("vctrs::vec_cast", "disk.character")
# S3: mic
s3_register("vctrs::vec_ptype2", "mic.default")
s3_register("vctrs::vec_ptype2", "mic.mic")
2022-08-30 21:48:02 +02:00
s3_register("vctrs::vec_cast", "character.mic")
s3_register("vctrs::vec_cast", "double.mic")
s3_register("vctrs::vec_cast", "integer.mic")
2024-04-07 20:22:59 +02:00
s3_register("vctrs::vec_cast", "factor.mic")
2022-10-31 11:19:06 +01:00
s3_register("vctrs::vec_cast", "mic.character")
s3_register("vctrs::vec_cast", "mic.double")
s3_register("vctrs::vec_cast", "mic.integer")
2024-04-07 20:22:59 +02:00
s3_register("vctrs::vec_cast", "mic.factor")
2024-04-05 16:44:43 +02:00
s3_register("vctrs::vec_cast", "mic.mic")
2022-08-30 21:48:02 +02:00
s3_register("vctrs::vec_math", "mic")
s3_register("vctrs::vec_arith", "mic")
2023-01-21 23:47:20 +01:00
# S3: sir
s3_register("vctrs::vec_ptype2", "sir.default")
s3_register("vctrs::vec_ptype2", "sir.sir")
2024-06-13 20:55:17 +02:00
s3_register("vctrs::vec_ptype2", "character.sir")
2023-01-21 23:47:20 +01:00
s3_register("vctrs::vec_cast", "character.sir")
s3_register("vctrs::vec_cast", "sir.character")
s3_register("vctrs::vec_cast", "sir.sir")
2022-08-28 10:31:50 +02:00
# if mo source exists, fire it up (see mo_source())
2022-10-05 09:12:22 +02:00
if (tryCatch(file.exists(getOption("AMR_mo_source", "~/mo_source.rds")), error = function(e) FALSE)) {
2022-12-27 15:16:15 +01:00
try(invisible(get_mo_source()), silent = TRUE)
2022-10-05 09:12:22 +02:00
}
2022-08-27 20:49:37 +02:00
# be sure to print tibbles as tibbles
2023-02-18 14:56:06 +01:00
if (pkg_is_available("tibble")) {
2022-12-27 15:16:15 +01:00
try(loadNamespace("tibble"), silent = TRUE)
2022-08-27 20:49:37 +02:00
}
2023-02-09 13:07:39 +01:00
# reference data - they have additional data to improve algorithm speed
2022-08-27 20:49:37 +02:00
# they cannot be part of R/sysdata.rda since CRAN thinks it would make the package too large (+3 MB)
2023-01-21 23:47:20 +01:00
AMR_env$AB_lookup <- cbind(AMR::antibiotics, AB_LOOKUP)
AMR_env$AV_lookup <- cbind(AMR::antivirals, AV_LOOKUP)
2024-02-24 18:14:50 +01:00
AMR_env$host_preferred_order <- names(sort(table(AMR::clinical_breakpoints$host[!AMR::clinical_breakpoints$host %in% AMR::clinical_breakpoints$type]), decreasing = TRUE))
2022-12-29 16:23:57 +01:00
}
.onAttach <- function(lib, pkg) {
2022-12-27 15:16:15 +01:00
# if custom ab option is available, load it
if (!is.null(getOption("AMR_custom_ab")) && file.exists(getOption("AMR_custom_ab", default = ""))) {
if (getOption("AMR_custom_ab") %unlike% "[.]rds$") {
packageStartupMessage("The file with custom antimicrobials must be an RDS file. Set the option `AMR_custom_ab` to another path.")
} else {
packageStartupMessage("Adding custom antimicrobials from '", getOption("AMR_custom_ab"), "'...", appendLF = FALSE)
x <- readRDS_AMR(getOption("AMR_custom_ab"))
tryCatch(
{
suppressWarnings(suppressMessages(add_custom_antimicrobials(x)))
packageStartupMessage("OK.")
},
error = function(e) packageStartupMessage("Failed: ", e$message)
)
}
2022-12-27 15:16:15 +01:00
}
# if custom mo option is available, load it
if (!is.null(getOption("AMR_custom_mo")) && file.exists(getOption("AMR_custom_mo", default = ""))) {
if (getOption("AMR_custom_mo") %unlike% "[.]rds$") {
packageStartupMessage("The file with custom microorganisms must be an RDS file. Set the option `AMR_custom_mo` to another path.")
} else {
packageStartupMessage("Adding custom microorganisms from '", getOption("AMR_custom_mo"), "'...", appendLF = FALSE)
x <- readRDS_AMR(getOption("AMR_custom_mo"))
tryCatch(
{
suppressWarnings(suppressMessages(add_custom_microorganisms(x)))
packageStartupMessage("OK.")
},
error = function(e) packageStartupMessage("Failed: ", e$message)
)
}
2022-12-27 15:16:15 +01:00
}
2021-05-30 22:14:38 +02:00
}