From 7d1a950b1c88b409c768d24bb364994b3c9d3e17 Mon Sep 17 00:00:00 2001 From: Bill Denney Date: Tue, 15 Apr 2025 08:52:25 -0400 Subject: [PATCH] Generalize unit conversion to allow unit conversion on completed analyses --- NAMESPACE | 3 +++ R/class-PKNCAdata.R | 4 ++-- R/unit-support.R | 31 +++++++++++++++++++++++++++++-- man/PKNCAdata.Rd | 2 +- man/pknca_unit_conversion.Rd | 27 ++++++++++++++++++++++++++- 5 files changed, 61 insertions(+), 6 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index e1ee121a..248ff058 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -63,6 +63,8 @@ S3method(model.frame,PKNCAdose) S3method(mutate,PKNCAconc) S3method(mutate,PKNCAdose) S3method(mutate,PKNCAresults) +S3method(pknca_unit_conversion,PKNCAresults) +S3method(pknca_unit_conversion,data.frame) S3method(print,PKNCAconc) S3method(print,PKNCAdata) S3method(print,PKNCAdose) @@ -214,6 +216,7 @@ export(pk.nca.interval) export(pk.tss) export(pk.tss.monoexponential) export(pk.tss.stepwise.linear) +export(pknca_unit_conversion) export(pknca_units_table) export(right_join) export(roundString) diff --git a/R/class-PKNCAdata.R b/R/class-PKNCAdata.R index 495de041..1f19d356 100644 --- a/R/class-PKNCAdata.R +++ b/R/class-PKNCAdata.R @@ -54,7 +54,7 @@ PKNCAdata.PKNCAdose <- function(data.conc, data.dose, ...) { PKNCAdata.default <- function(data.conc, data.dose, ..., formula.conc, formula.dose, impute = NA_character_, - intervals, units, options=list()) { + intervals, units = NULL, options=list()) { if (length(list(...))) { stop("Unknown argument provided to PKNCAdata. All arguments other than `data.conc` and `data.dose` must be named.") } @@ -169,7 +169,7 @@ PKNCAdata.default <- function(data.conc, data.dose, ..., units_interval_end <- inherits(ret$intervals$end, "units") # Insert the unit conversion table - if (missing(units)) { + if (is.null(units)) { # What unit types are recognized? possible_units <- setdiff( diff --git a/R/unit-support.R b/R/unit-support.R index e1c97d37..318a8bc3 100644 --- a/R/unit-support.R +++ b/R/unit-support.R @@ -102,7 +102,15 @@ pknca_units_table <- function(concu, doseu, amountu, timeu, # Use the original conversions argument over `conversions_pref` mask_pref <- conversions_pref$PPORRESU %in% conversions$PPORRESU[idx] if (!any(mask_pref)) { - stop("Cannot find PPORRESU match between conversions and preferred unit conversions. Check PPORRESU values in 'conversions' argument.") + stop( + paste( + sprintf( + "Cannot find PPORRESU match between conversions and preferred unit conversions (%s).", + paste0('"', unique(conversions_pref$PPORRESU[!mask_pref]), '"', collapse = ", ") + ), + "Check PPORRESU values in 'conversions' argument." + ) + ) } conversions_pref$PPSTRESU[mask_pref] <- conversions$PPSTRESU[idx] conversions_pref$conversion_factor[mask_pref] <- conversions$conversion_factor[idx] @@ -391,7 +399,26 @@ pknca_units_add_paren <- function(unit) { #' but not all parameters? #' @returns The result table with units converted #' @keywords Internal -pknca_unit_conversion <- function(result, units, allow_partial_missing_units = FALSE) { +#' @export +pknca_unit_conversion <- function(result, units = NULL, allow_partial_missing_units = FALSE) { + UseMethod("pknca_unit_conversion") +} + +#' @describeIn pknca_unit_conversion Convert PKNCA units for a data.frame +#' @export +pknca_unit_conversion.PKNCAresults <- function(result, units = NULL, allow_partial_missing_units = FALSE) { + result$result <- + pknca_unit_conversion( + result$result, + units = units, + allow_partial_missing_units = allow_partial_missing_units + ) + result +} + +#' @describeIn pknca_unit_conversion Convert PKNCA units for a data.frame +#' @export +pknca_unit_conversion.data.frame <- function(result, units = NULL, allow_partial_missing_units = FALSE) { ret <- result if (!is.null(units)) { ret <- diff --git a/man/PKNCAdata.Rd b/man/PKNCAdata.Rd index aac9084b..1efbccf6 100644 --- a/man/PKNCAdata.Rd +++ b/man/PKNCAdata.Rd @@ -21,7 +21,7 @@ PKNCAdata(data.conc, data.dose, ...) formula.dose, impute = NA_character_, intervals, - units, + units = NULL, options = list() ) } diff --git a/man/pknca_unit_conversion.Rd b/man/pknca_unit_conversion.Rd index 1a0f9a07..1e1f5ed4 100644 --- a/man/pknca_unit_conversion.Rd +++ b/man/pknca_unit_conversion.Rd @@ -2,9 +2,27 @@ % Please edit documentation in R/unit-support.R \name{pknca_unit_conversion} \alias{pknca_unit_conversion} +\alias{pknca_unit_conversion.PKNCAresults} +\alias{pknca_unit_conversion.data.frame} \title{Perform unit conversion (if possible) on PKNCA results} \usage{ -pknca_unit_conversion(result, units, allow_partial_missing_units = FALSE) +pknca_unit_conversion( + result, + units = NULL, + allow_partial_missing_units = FALSE +) + +\method{pknca_unit_conversion}{PKNCAresults}( + result, + units = NULL, + allow_partial_missing_units = FALSE +) + +\method{pknca_unit_conversion}{data.frame}( + result, + units = NULL, + allow_partial_missing_units = FALSE +) } \arguments{ \item{result}{The results data.frame} @@ -20,4 +38,11 @@ The result table with units converted \description{ Perform unit conversion (if possible) on PKNCA results } +\section{Methods (by class)}{ +\itemize{ +\item \code{pknca_unit_conversion(PKNCAresults)}: Convert PKNCA units for a data.frame + +\item \code{pknca_unit_conversion(data.frame)}: Convert PKNCA units for a data.frame + +}} \keyword{Internal}