diff --git a/DESCRIPTION b/DESCRIPTION index 79d28bcfe..6b00169a1 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: AMR -Version: 3.0.1.9023 -Date: 2026-03-03 +Version: 3.0.1.9026 +Date: 2026-03-06 Title: Antimicrobial Resistance Data Analysis Description: Functions to simplify and standardise antimicrobial resistance (AMR) data analysis and to work with microbial and antimicrobial properties by diff --git a/NAMESPACE b/NAMESPACE index 0d6c49322..f46c1a138 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -133,8 +133,10 @@ export("%like%") export("%like_case%") export("%unlike%") export("%unlike_case%") +export(NA_ab_) export(NA_disk_) export(NA_mic_) +export(NA_mo_) export(NA_sir_) export(ab_atc) export(ab_atc_group1) diff --git a/NEWS.md b/NEWS.md index fbbdc9da7..fe031531a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# AMR 3.0.1.9023 +# AMR 3.0.1.9026 ### New * Integration with the **tidymodels** framework to allow seamless use of SIR, MIC and disk data in modelling pipelines via `recipes` @@ -9,13 +9,13 @@ - `all_disk()`, `all_disk_predictors()` * Data set `esbl_isolates` to practise with AMR modelling * AMR selectors `peptides()`, `phosphonics()` and `spiropyrimidinetriones()` -* Antimicrobials in the `antimicrobials` data set: ceftibuten/avibactam (`CTA`), kasugamycin (`KAS`), ostreogrycin (`OST`), thiostrepton (`THS`), xeruborbactam (`XER`), zorbamycin (`ZOR`) * Support for Wildtype (WT) / Non-wildtype (NWT) in `as.sir()`, all plotting functions, and all susceptibility/resistance functions. - `as.sir()` gained an argument `as_wt_nwt`, which defaults to `TRUE` only when `breakpoint_type = "ECOFF"` (#254) - This transforms the output from S/R to WT/NWT - Functions such as `susceptibility()` count WT as S and NWT as R * `interpretive_rules()`, which allows future implementation of CLSI interpretive rules (#235) - - `eucast_rules()` has become a wrapper around that function. + - `eucast_rules()` has become a wrapper around that function +* Two new `NA` objects, `NA_ab_` and `NA_mo_`, analogous to base R's `NA_character_` and `NA_integer_`, for use in pipelines that require typed missing values ### Fixes * Fixed a bug in `as.ab()` where certain AB codes containing "PH" or "TH" (such as `ETH`, `MTH`, `PHE`, `PHN`, `STH`, `THA`, `THI1`) would incorrectly return `NA` when combined in a vector with any untranslatable value (#245) @@ -31,7 +31,7 @@ * `as.mic()` and `rescale_mic()` gained the argument `round_to_next_log2`, which can be set to `TRUE` to round all values up to the nearest next log2 level (#255) * `antimicrobials$group` is now a `list` instead of a `character`, to contain any group the drug is in (#246) * `ab_group()` gained an argument `all_groups` to return all groups the antimicrobial drug is in (#246) -* Added taniborbactam (`TAN`) and cefepime/taniborbactam (`FTA`) to the `antimicrobials` data set +* Added to the `antimicrobials` data set: cefepime/taniborbactam (`FTA`), ceftibuten/avibactam (`CTA`), kasugamycin (`KAS`), ostreogrycin (`OST`), taniborbactam (`TAN`), thiostrepton (`THS`), xeruborbactam (`XER`), and zorbamycin (`ZOR`) * Added explaining message to `as.sir()` when interpreting numeric values (e.g., 1 for S, 2 for I, 3 for R) (#244) * Updated handling of capped MIC values (`<`, `<=`, `>`, `>=`) in `as.sir()` in the argument `capped_mic_handling`: (#243) * Introduced four clearly defined options: `"none"`, `"conservative"` (default), `"standard"`, and `"lenient"` diff --git a/R/ab.R b/R/ab.R index 58b9abaef..cd8a2d43b 100755 --- a/R/ab.R +++ b/R/ab.R @@ -514,6 +514,14 @@ ab_reset_session <- function() { } } +#' @rdname as.ab +#' @details `NA_ab_` is a missing value of the new `ab` class, analogous to e.g. base \R's [`NA_character_`][base::NA]. +#' @format NULL +#' @export +NA_ab_ <- set_clean_class(NA_character_, + new_class = c("ab", "character") +) + # this prevents the requirement for putting the dependency in Imports: #' @rawNamespace if(getRversion() >= "3.0.0") S3method(pillar::pillar_shaft, ab) pillar_shaft.ab <- function(x, ...) { diff --git a/R/ab_property.R b/R/ab_property.R index 5058a96aa..cc00bdbd0 100755 --- a/R/ab_property.R +++ b/R/ab_property.R @@ -172,6 +172,9 @@ ab_group <- function(x, language = get_AMR_locale(), all_groups = FALSE, ...) { grps <- ab_validate(x = x, property = "group", ...) for (i in seq_along(grps)) { + if (is.null(grps[[i]]) || all(is.na(grps[[i]]))) { + grps[[i]] <- NA_character_ + } if (all_groups == FALSE) { # take the first match based on ABX_PRIORITY_LIST grps[[i]] <- grps[[i]][1] diff --git a/R/mo.R b/R/mo.R index 19159f9eb..5ec5f029e 100755 --- a/R/mo.R +++ b/R/mo.R @@ -623,6 +623,14 @@ mo_cleaning_regex <- function() { ) } +#' @rdname as.mo +#' @details `NA_mo_` is a missing value of the new `mo` class, analogous to e.g. base \R's [`NA_character_`][base::NA]. +#' @format NULL +#' @export +NA_mo_ <- set_clean_class(NA_character_, + new_class = c("mo", "character") +) + # UNDOCUMENTED METHODS ---------------------------------------------------- # this prevents the requirement for putting the dependency in Imports: diff --git a/man/as.ab.Rd b/man/as.ab.Rd index 378a97332..127cb08c1 100644 --- a/man/as.ab.Rd +++ b/man/as.ab.Rd @@ -1,10 +1,12 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/ab.R +\docType{data} \name{as.ab} \alias{as.ab} \alias{ab} \alias{is.ab} \alias{ab_reset_session} +\alias{NA_ab_} \title{Transform Input to an Antibiotic ID} \usage{ as.ab(x, flag_multiple_results = TRUE, language = get_AMR_locale(), @@ -13,6 +15,8 @@ as.ab(x, flag_multiple_results = TRUE, language = get_AMR_locale(), is.ab(x) ab_reset_session() + +NA_ab_ } \arguments{ \item{x}{A \link{character} vector to determine to antibiotic ID.} @@ -47,6 +51,8 @@ Use the \code{\link[=ab_property]{ab_*}} functions to get properties based on th Note: the \code{\link[=as.ab]{as.ab()}} and \code{\link[=ab_property]{ab_*}} functions may use very long regular expression to match brand names of antimicrobial drugs. This may fail on some systems. You can add your own manual codes to be considered by \code{\link[=as.ab]{as.ab()}} and all \code{\link[=ab_property]{ab_*}} functions, see \code{\link[=add_custom_antimicrobials]{add_custom_antimicrobials()}}. + +\code{NA_ab_} is a missing value of the new \code{ab} class, analogous to e.g. base \R's \code{\link[base:NA]{NA_character_}}. } \section{Source}{ @@ -111,3 +117,4 @@ if (require("dplyr")) { \item \code{\link[=ab_from_text]{ab_from_text()}} for a function to retrieve antimicrobial drugs from clinical text (from health care records) } } +\keyword{datasets} diff --git a/man/as.mo.Rd b/man/as.mo.Rd index dbcaaefde..aa3ede26a 100644 --- a/man/as.mo.Rd +++ b/man/as.mo.Rd @@ -1,5 +1,6 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/mo.R +\docType{data} \name{as.mo} \alias{as.mo} \alias{mo} @@ -9,6 +10,7 @@ \alias{mo_failures} \alias{mo_reset_session} \alias{mo_cleaning_regex} +\alias{NA_mo_} \title{Transform Arbitrary Input to Valid Microbial Taxonomy} \usage{ as.mo(x, Becker = FALSE, Lancefield = FALSE, @@ -31,6 +33,8 @@ mo_failures() mo_reset_session() mo_cleaning_regex() + +NA_mo_ } \arguments{ \item{x}{A \link{character} vector or a \link{data.frame} with one or two columns.} @@ -151,6 +155,8 @@ This is based on: \item Lancefield RC (1933). \strong{A serological differentiation of human and other groups of hemolytic streptococci.} \emph{J Exp Med.} 57(4): 571-95; \doi{10.1084/jem.57.4.571} } } + +\code{NA_mo_} is a missing value of the new \code{mo} class, analogous to e.g. base \R's \code{\link[base:NA]{NA_character_}}. } \section{Source}{ @@ -260,3 +266,4 @@ mo_is_intrinsic_resistant("ESCCOL", ab = "vanco") The \code{\link[=mo_property]{mo_*}} functions (such as \code{\link[=mo_genus]{mo_genus()}}, \code{\link[=mo_gramstain]{mo_gramstain()}}) to get properties based on the returned code. } +\keyword{datasets}