mirror of
				https://github.com/msberends/AMR.git
				synced 2025-10-31 01:28:17 +01:00 
			
		
		
		
	remove MO_lookup from sysdata.rda
This commit is contained in:
		| @@ -32,7 +32,7 @@ | |||||||
| #' @description | #' @description | ||||||
| #' Welcome to the `AMR` package. | #' Welcome to the `AMR` package. | ||||||
| #' | #' | ||||||
| #' The `AMR` package is a [free and open-source](https://msberends.github.io/AMR#copyright) R package with [zero dependencies](https://en.wikipedia.org/wiki/Dependency_hell) to simplify the analysis and prediction of Antimicrobial Resistance (AMR) and to work with microbial and antimicrobial data and properties, by using evidence-based methods. **Our aim is to provide a standard** for clean and reproducible AMR data analysis, that can therefore empower epidemiological analyses to continuously enable surveillance and treatment evaluation in any setting. [Many different researchers](https://msberends.github.io/AMR/authors.html) from around the globe are continually helping us to make this a successful and durable project! | #' The `AMR` package is a [free and open-source](https://msberends.github.io/AMR/#copyright) R package with [zero dependencies](https://en.wikipedia.org/wiki/Dependency_hell) to simplify the analysis and prediction of Antimicrobial Resistance (AMR) and to work with microbial and antimicrobial data and properties, by using evidence-based methods. **Our aim is to provide a standard** for clean and reproducible AMR data analysis, that can therefore empower epidemiological analyses to continuously enable surveillance and treatment evaluation in any setting. [Many different researchers](https://msberends.github.io/AMR/authors.html) from around the globe are continually helping us to make this a successful and durable project! | ||||||
| #'  | #'  | ||||||
| #' This work was published in the Journal of Statistical Software (Volume 104(3); [DOI 10.18637/jss.v104.i03](https://doi.org/10.18637/jss.v104.i03)) and formed the basis of two PhD theses ([DOI 10.33612/diss.177417131](https://doi.org/10.33612/diss.177417131) and [DOI 10.33612/diss.192486375](https://doi.org/10.33612/diss.192486375)). | #' This work was published in the Journal of Statistical Software (Volume 104(3); [DOI 10.18637/jss.v104.i03](https://doi.org/10.18637/jss.v104.i03)) and formed the basis of two PhD theses ([DOI 10.33612/diss.177417131](https://doi.org/10.33612/diss.177417131) and [DOI 10.33612/diss.192486375](https://doi.org/10.33612/diss.192486375)). | ||||||
| #'  | #'  | ||||||
|   | |||||||
| @@ -225,6 +225,8 @@ search_type_in_df <- function(x, type, info = TRUE) { | |||||||
|  |  | ||||||
|   # -- mo |   # -- mo | ||||||
|   if (type == "mo") { |   if (type == "mo") { | ||||||
|  |     add_MO_lookup_to_AMR_env() | ||||||
|  |      | ||||||
|     if (any(vapply(FUN.VALUE = logical(1), x, is.mo))) { |     if (any(vapply(FUN.VALUE = logical(1), x, is.mo))) { | ||||||
|       # take first 'mo' column |       # take first 'mo' column | ||||||
|       found <- colnames(x)[vapply(FUN.VALUE = logical(1), x, is.mo)] |       found <- colnames(x)[vapply(FUN.VALUE = logical(1), x, is.mo)] | ||||||
| @@ -1379,6 +1381,38 @@ add_intrinsic_resistance_to_AMR_env <- function() { | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | add_MO_lookup_to_AMR_env <- function() { | ||||||
|  |   # for all MO functions, saves a lot of time on package load and in package size | ||||||
|  |   if (is.null(AMR_env$MO_lookup)) { | ||||||
|  |     MO_lookup <- AMR::microorganisms | ||||||
|  |      | ||||||
|  |     MO_lookup$kingdom_index <- NA_real_ | ||||||
|  |     MO_lookup[which(MO_lookup$kingdom == "Bacteria" | MO_lookup$mo == "UNKNOWN"), "kingdom_index"] <- 1 | ||||||
|  |     MO_lookup[which(MO_lookup$kingdom == "Fungi"), "kingdom_index"] <- 2 | ||||||
|  |     MO_lookup[which(MO_lookup$kingdom == "Protozoa"), "kingdom_index"] <- 3 | ||||||
|  |     MO_lookup[which(MO_lookup$kingdom == "Archaea"), "kingdom_index"] <- 4 | ||||||
|  |     # all the rest | ||||||
|  |     MO_lookup[which(is.na(MO_lookup$kingdom_index)), "kingdom_index"] <- 5 | ||||||
|  |      | ||||||
|  |     # the fullname lowercase, important for the internal algorithms in as.mo() | ||||||
|  |     MO_lookup$fullname_lower <- tolower(trimws(paste( | ||||||
|  |       MO_lookup$genus, | ||||||
|  |       MO_lookup$species, | ||||||
|  |       MO_lookup$subspecies | ||||||
|  |     ))) | ||||||
|  |     ind <- MO_lookup$genus == "" | grepl("^[(]unknown ", MO_lookup$fullname, perl = TRUE) | ||||||
|  |     MO_lookup[ind, "fullname_lower"] <- tolower(MO_lookup[ind, "fullname", drop = TRUE]) | ||||||
|  |     MO_lookup$fullname_lower <- trimws(gsub("[^.a-z0-9/ \\-]+", "", MO_lookup$fullname_lower, perl = TRUE)) | ||||||
|  |     # special for Salmonella - they have cities as subspecies but not the species (enterica) in the fullname: | ||||||
|  |     MO_lookup$fullname_lower[which(MO_lookup$subspecies %like_case% "^[A-Z]")] <- gsub(" enterica ", " ", MO_lookup$fullname_lower[which(MO_lookup$subspecies %like_case% "^[A-Z]")], fixed = TRUE) | ||||||
|  |      | ||||||
|  |     MO_lookup$full_first <- substr(MO_lookup$fullname_lower, 1, 1) | ||||||
|  |     MO_lookup$species_first <- tolower(substr(MO_lookup$species, 1, 1)) # tolower for groups (Streptococcus, Salmonella) | ||||||
|  |     MO_lookup$subspecies_first <- tolower(substr(MO_lookup$subspecies, 1, 1)) # tolower for Salmonella serovars | ||||||
|  |     AMR_env$MO_lookup <- MO_lookup | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
| trimws2 <- function(..., whitespace = "[\u0009\u000A\u000B\u000C\u000D\u0020\u0085\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u200B\u200C\u200D\u2028\u2029\u202F\u205F\u2060\u3000\uFEFF]") { | trimws2 <- function(..., whitespace = "[\u0009\u000A\u000B\u000C\u000D\u0020\u0085\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u200B\u200C\u200D\u2028\u2029\u202F\u205F\u2060\u3000\uFEFF]") { | ||||||
|   # this is even faster than trimws() itself which sets " \t\n\r". |   # this is even faster than trimws() itself which sets " \t\n\r". | ||||||
|   trimws(..., whitespace = whitespace) |   trimws(..., whitespace = whitespace) | ||||||
|   | |||||||
| @@ -124,6 +124,8 @@ add_custom_microorganisms <- function(x) { | |||||||
|   meet_criteria(x, allow_class = "data.frame") |   meet_criteria(x, allow_class = "data.frame") | ||||||
|   stop_ifnot("genus" %in% tolower(colnames(x)), paste0("`x` must contain column 'genus'.")) |   stop_ifnot("genus" %in% tolower(colnames(x)), paste0("`x` must contain column 'genus'.")) | ||||||
|    |    | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|  |    | ||||||
|   # remove any extra class/type, such as grouped tbl, or data.table: |   # remove any extra class/type, such as grouped tbl, or data.table: | ||||||
|   x <- as.data.frame(x, stringsAsFactors = FALSE) |   x <- as.data.frame(x, stringsAsFactors = FALSE) | ||||||
|   colnames(x) <- tolower(colnames(x)) |   colnames(x) <- tolower(colnames(x)) | ||||||
| @@ -269,7 +271,11 @@ add_custom_microorganisms <- function(x) { | |||||||
| #' @export | #' @export | ||||||
| clear_custom_microorganisms <- function() { | clear_custom_microorganisms <- function() { | ||||||
|   n <- nrow(AMR_env$MO_lookup) |   n <- nrow(AMR_env$MO_lookup) | ||||||
|   AMR_env$MO_lookup <- create_MO_lookup() |    | ||||||
|  |   # reset | ||||||
|  |   AMR_env$MO_lookup <- NULL | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|  |    | ||||||
|   n2 <- nrow(AMR_env$MO_lookup) |   n2 <- nrow(AMR_env$MO_lookup) | ||||||
|   AMR_env$custom_mo_codes <- character(0) |   AMR_env$custom_mo_codes <- character(0) | ||||||
|   AMR_env$mo_previously_coerced <- AMR_env$mo_previously_coerced[which(AMR_env$mo_previously_coerced$mo %in% AMR_env$MO_lookup$mo), , drop = FALSE] |   AMR_env$mo_previously_coerced <- AMR_env$mo_previously_coerced[which(AMR_env$mo_previously_coerced$mo %in% AMR_env$MO_lookup$mo), , drop = FALSE] | ||||||
|   | |||||||
| @@ -182,6 +182,8 @@ eucast_rules <- function(x, | |||||||
|   meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) |   meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) | ||||||
|   meet_criteria(custom_rules, allow_class = "custom_eucast_rules", allow_NULL = TRUE) |   meet_criteria(custom_rules, allow_class = "custom_eucast_rules", allow_NULL = TRUE) | ||||||
|  |  | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|  |  | ||||||
|   if ("custom" %in% rules && is.null(custom_rules)) { |   if ("custom" %in% rules && is.null(custom_rules)) { | ||||||
|     warning_("in `eucast_rules()`: no custom rules were set with the `custom_rules` argument", |     warning_("in `eucast_rules()`: no custom rules were set with the `custom_rules` argument", | ||||||
|       immediate = TRUE |       immediate = TRUE | ||||||
|   | |||||||
| @@ -51,6 +51,8 @@ italicise_taxonomy <- function(string, type = c("markdown", "ansi")) { | |||||||
|   meet_criteria(string, allow_class = "character") |   meet_criteria(string, allow_class = "character") | ||||||
|   meet_criteria(type, allow_class = "character", has_length = 1, is_in = c("markdown", "ansi")) |   meet_criteria(type, allow_class = "character", has_length = 1, is_in = c("markdown", "ansi")) | ||||||
|  |  | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|  |  | ||||||
|   if (type == "markdown") { |   if (type == "markdown") { | ||||||
|     before <- "*" |     before <- "*" | ||||||
|     after <- "*" |     after <- "*" | ||||||
|   | |||||||
| @@ -127,6 +127,8 @@ anti_join_microorganisms <- function(x, by = NULL, ...) { | |||||||
| } | } | ||||||
|  |  | ||||||
| join_microorganisms <- function(type, x, by, suffix, ...) { | join_microorganisms <- function(type, x, by, suffix, ...) { | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|  |    | ||||||
|   if (!is.data.frame(x)) { |   if (!is.data.frame(x)) { | ||||||
|     if (pkg_is_available("tibble", also_load = FALSE)) { |     if (pkg_is_available("tibble", also_load = FALSE)) { | ||||||
|       x <- import_fn("tibble", "tibble")(mo = x) |       x <- import_fn("tibble", "tibble")(mo = x) | ||||||
|   | |||||||
							
								
								
									
										188
									
								
								R/mdro.R
									
									
									
									
									
								
							
							
						
						
									
										188
									
								
								R/mdro.R
									
									
									
									
									
								
							| @@ -325,7 +325,7 @@ mdro <- function(x = NULL, | |||||||
|       "No column found as input for `col_mo`, ", |       "No column found as input for `col_mo`, ", | ||||||
|       font_bold(paste0("assuming all rows contain ", font_italic("Mycobacterium tuberculosis"), ".")) |       font_bold(paste0("assuming all rows contain ", font_italic("Mycobacterium tuberculosis"), ".")) | ||||||
|     ) |     ) | ||||||
|     x$mo <- as.mo("Mycobacterium tuberculosis") # consider overkill at all times: AMR_env$MO_lookup[which(AMR_env$MO_lookup$fullname == "Mycobacterium tuberculosis"), "mo", drop = TRUE] |     x$mo <- as.mo("Mycobacterium tuberculosis", keep_synonyms = TRUE) | ||||||
|     col_mo <- "mo" |     col_mo <- "mo" | ||||||
|   } |   } | ||||||
|   stop_if(is.null(col_mo), "`col_mo` must be set") |   stop_if(is.null(col_mo), "`col_mo` must be set") | ||||||
| @@ -382,120 +382,16 @@ mdro <- function(x = NULL, | |||||||
|     cols_ab <- get_column_abx( |     cols_ab <- get_column_abx( | ||||||
|       x = x, |       x = x, | ||||||
|       soft_dependencies = c( |       soft_dependencies = c( | ||||||
|         # [table] 1 (S aureus): |         # [table] 1 (S aureus) | ||||||
|         "GEN", |         "GEN", "RIF", "CPT", "OXA", "CIP", "MFX", "SXT", "FUS", "VAN", "TEC", "TLV", "TGC", "CLI", "DAP", "ERY", "LNZ", "CHL", "FOS", "QDA", "TCY", "DOX", "MNO", | ||||||
|         "RIF", |  | ||||||
|         "CPT", |  | ||||||
|         "OXA", |  | ||||||
|         "CIP", |  | ||||||
|         "MFX", |  | ||||||
|         "SXT", |  | ||||||
|         "FUS", |  | ||||||
|         "VAN", |  | ||||||
|         "TEC", |  | ||||||
|         "TLV", |  | ||||||
|         "TGC", |  | ||||||
|         "CLI", |  | ||||||
|         "DAP", |  | ||||||
|         "ERY", |  | ||||||
|         "LNZ", |  | ||||||
|         "CHL", |  | ||||||
|         "FOS", |  | ||||||
|         "QDA", |  | ||||||
|         "TCY", |  | ||||||
|         "DOX", |  | ||||||
|         "MNO", |  | ||||||
|         # [table] 2 (Enterococcus) |         # [table] 2 (Enterococcus) | ||||||
|         "GEH", |         "GEH", "STH", "IPM", "MEM", "DOR", "CIP", "LVX", "MFX", "VAN", "TEC", "TGC", "DAP", "LNZ", "AMP", "QDA", "DOX", "MNO", | ||||||
|         "STH", |  | ||||||
|         "IPM", |  | ||||||
|         "MEM", |  | ||||||
|         "DOR", |  | ||||||
|         "CIP", |  | ||||||
|         "LVX", |  | ||||||
|         "MFX", |  | ||||||
|         "VAN", |  | ||||||
|         "TEC", |  | ||||||
|         "TGC", |  | ||||||
|         "DAP", |  | ||||||
|         "LNZ", |  | ||||||
|         "AMP", |  | ||||||
|         "QDA", |  | ||||||
|         "DOX", |  | ||||||
|         "MNO", |  | ||||||
|         # [table] 3 (Enterobacteriaceae) |         # [table] 3 (Enterobacteriaceae) | ||||||
|         "GEN", |         "GEN", "TOB", "AMK", "NET", "CPT", "TCC", "TZP", "ETP", "IPM", "MEM", "DOR", "CZO", "CXM", "CTX", "CAZ", "FEP", "FOX", "CTT", "CIP", "SXT", "TGC", "ATM", "AMP", "AMC", "SAM", "CHL", "FOS", "COL", "TCY", "DOX", "MNO", | ||||||
|         "TOB", |  | ||||||
|         "AMK", |  | ||||||
|         "NET", |  | ||||||
|         "CPT", |  | ||||||
|         "TCC", |  | ||||||
|         "TZP", |  | ||||||
|         "ETP", |  | ||||||
|         "IPM", |  | ||||||
|         "MEM", |  | ||||||
|         "DOR", |  | ||||||
|         "CZO", |  | ||||||
|         "CXM", |  | ||||||
|         "CTX", |  | ||||||
|         "CAZ", |  | ||||||
|         "FEP", |  | ||||||
|         "FOX", |  | ||||||
|         "CTT", |  | ||||||
|         "CIP", |  | ||||||
|         "SXT", |  | ||||||
|         "TGC", |  | ||||||
|         "ATM", |  | ||||||
|         "AMP", |  | ||||||
|         "AMC", |  | ||||||
|         "SAM", |  | ||||||
|         "CHL", |  | ||||||
|         "FOS", |  | ||||||
|         "COL", |  | ||||||
|         "TCY", |  | ||||||
|         "DOX", |  | ||||||
|         "MNO", |  | ||||||
|         # [table] 4 (Pseudomonas) |         # [table] 4 (Pseudomonas) | ||||||
|         "GEN", |         "GEN", "TOB", "AMK", "NET", "IPM", "MEM", "DOR", "CAZ", "FEP", "CIP", "LVX", "TCC", "TZP", "ATM", "FOS", "COL", "PLB", | ||||||
|         "TOB", |  | ||||||
|         "AMK", |  | ||||||
|         "NET", |  | ||||||
|         "IPM", |  | ||||||
|         "MEM", |  | ||||||
|         "DOR", |  | ||||||
|         "CAZ", |  | ||||||
|         "FEP", |  | ||||||
|         "CIP", |  | ||||||
|         "LVX", |  | ||||||
|         "TCC", |  | ||||||
|         "TZP", |  | ||||||
|         "ATM", |  | ||||||
|         "FOS", |  | ||||||
|         "COL", |  | ||||||
|         "PLB", |  | ||||||
|         # [table] 5 (Acinetobacter) |         # [table] 5 (Acinetobacter) | ||||||
|         "GEN", |         "GEN", "TOB", "AMK", "NET", "IPM", "MEM", "DOR", "CIP", "LVX", "TZP", "TCC", "CTX", "CRO", "CAZ", "FEP", "SXT", "SAM", "COL", "PLB", "TCY", "DOX", "MNO" | ||||||
|         "TOB", |  | ||||||
|         "AMK", |  | ||||||
|         "NET", |  | ||||||
|         "IPM", |  | ||||||
|         "MEM", |  | ||||||
|         "DOR", |  | ||||||
|         "CIP", |  | ||||||
|         "LVX", |  | ||||||
|         "TZP", |  | ||||||
|         "TCC", |  | ||||||
|         "CTX", |  | ||||||
|         "CRO", |  | ||||||
|         "CAZ", |  | ||||||
|         "FEP", |  | ||||||
|         "SXT", |  | ||||||
|         "SAM", |  | ||||||
|         "COL", |  | ||||||
|         "PLB", |  | ||||||
|         "TCY", |  | ||||||
|         "DOX", |  | ||||||
|         "MNO" |  | ||||||
|       ), |       ), | ||||||
|       verbose = verbose, |       verbose = verbose, | ||||||
|       info = info, |       info = info, | ||||||
| @@ -506,30 +402,7 @@ mdro <- function(x = NULL, | |||||||
|   } else if (guideline$code == "eucast3.2") { |   } else if (guideline$code == "eucast3.2") { | ||||||
|     cols_ab <- get_column_abx( |     cols_ab <- get_column_abx( | ||||||
|       x = x, |       x = x, | ||||||
|       soft_dependencies = c( |       soft_dependencies = c("AMP", "AMX", "CIP", "DAL", "DAP", "ERV", "FDX", "GEN", "LNZ", "MEM", "MTR", "OMC", "ORI", "PEN", "QDA", "RIF", "TEC", "TGC", "TLV", "TOB", "TZD", "VAN"), | ||||||
|         "AMP", |  | ||||||
|         "AMX", |  | ||||||
|         "CIP", |  | ||||||
|         "DAL", |  | ||||||
|         "DAP", |  | ||||||
|         "ERV", |  | ||||||
|         "FDX", |  | ||||||
|         "GEN", |  | ||||||
|         "LNZ", |  | ||||||
|         "MEM", |  | ||||||
|         "MTR", |  | ||||||
|         "OMC", |  | ||||||
|         "ORI", |  | ||||||
|         "PEN", |  | ||||||
|         "QDA", |  | ||||||
|         "RIF", |  | ||||||
|         "TEC", |  | ||||||
|         "TGC", |  | ||||||
|         "TLV", |  | ||||||
|         "TOB", |  | ||||||
|         "TZD", |  | ||||||
|         "VAN" |  | ||||||
|       ), |  | ||||||
|       verbose = verbose, |       verbose = verbose, | ||||||
|       info = info, |       info = info, | ||||||
|       only_sir_columns = only_sir_columns, |       only_sir_columns = only_sir_columns, | ||||||
| @@ -539,30 +412,7 @@ mdro <- function(x = NULL, | |||||||
|   } else if (guideline$code == "eucast3.3") { |   } else if (guideline$code == "eucast3.3") { | ||||||
|     cols_ab <- get_column_abx( |     cols_ab <- get_column_abx( | ||||||
|       x = x, |       x = x, | ||||||
|       soft_dependencies = c( |       soft_dependencies = c("AMP", "AMX", "CIP", "DAL", "DAP", "ERV", "FDX", "GEN", "LNZ", "MEM", "MTR", "OMC", "ORI", "PEN", "QDA", "RIF", "TEC", "TGC", "TLV", "TOB", "TZD", "VAN"), | ||||||
|         "AMP", |  | ||||||
|         "AMX", |  | ||||||
|         "CIP", |  | ||||||
|         "DAL", |  | ||||||
|         "DAP", |  | ||||||
|         "ERV", |  | ||||||
|         "FDX", |  | ||||||
|         "GEN", |  | ||||||
|         "LNZ", |  | ||||||
|         "MEM", |  | ||||||
|         "MTR", |  | ||||||
|         "OMC", |  | ||||||
|         "ORI", |  | ||||||
|         "PEN", |  | ||||||
|         "QDA", |  | ||||||
|         "RIF", |  | ||||||
|         "TEC", |  | ||||||
|         "TGC", |  | ||||||
|         "TLV", |  | ||||||
|         "TOB", |  | ||||||
|         "TZD", |  | ||||||
|         "VAN" |  | ||||||
|       ), |  | ||||||
|       verbose = verbose, |       verbose = verbose, | ||||||
|       info = info, |       info = info, | ||||||
|       only_sir_columns = only_sir_columns, |       only_sir_columns = only_sir_columns, | ||||||
| @@ -572,16 +422,7 @@ mdro <- function(x = NULL, | |||||||
|   } else if (guideline$code == "tb") { |   } else if (guideline$code == "tb") { | ||||||
|     cols_ab <- get_column_abx( |     cols_ab <- get_column_abx( | ||||||
|       x = x, |       x = x, | ||||||
|       soft_dependencies = c( |       soft_dependencies = c("CAP", "ETH", "GAT", "INH", "PZA", "RIF", "RIB", "RFP"), | ||||||
|         "CAP", |  | ||||||
|         "ETH", |  | ||||||
|         "GAT", |  | ||||||
|         "INH", |  | ||||||
|         "PZA", |  | ||||||
|         "RIF", |  | ||||||
|         "RIB", |  | ||||||
|         "RFP" |  | ||||||
|       ), |  | ||||||
|       verbose = verbose, |       verbose = verbose, | ||||||
|       info = info, |       info = info, | ||||||
|       only_sir_columns = only_sir_columns, |       only_sir_columns = only_sir_columns, | ||||||
| @@ -591,14 +432,7 @@ mdro <- function(x = NULL, | |||||||
|   } else if (guideline$code == "mrgn") { |   } else if (guideline$code == "mrgn") { | ||||||
|     cols_ab <- get_column_abx( |     cols_ab <- get_column_abx( | ||||||
|       x = x, |       x = x, | ||||||
|       soft_dependencies = c( |       soft_dependencies = c("PIP", "CTX", "CAZ", "IPM", "MEM", "CIP"), | ||||||
|         "PIP", |  | ||||||
|         "CTX", |  | ||||||
|         "CAZ", |  | ||||||
|         "IPM", |  | ||||||
|         "MEM", |  | ||||||
|         "CIP" |  | ||||||
|       ), |  | ||||||
|       verbose = verbose, |       verbose = verbose, | ||||||
|       info = info, |       info = info, | ||||||
|       only_sir_columns = only_sir_columns, |       only_sir_columns = only_sir_columns, | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								R/mo.R
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								R/mo.R
									
									
									
									
									
								
							| @@ -164,6 +164,8 @@ as.mo <- function(x, | |||||||
|   language <- validate_language(language) |   language <- validate_language(language) | ||||||
|   meet_criteria(info, allow_class = "logical", has_length = 1) |   meet_criteria(info, allow_class = "logical", has_length = 1) | ||||||
|  |  | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|  |  | ||||||
|   if (tryCatch(all(x %in% c(AMR_env$MO_lookup$mo, NA)) && |   if (tryCatch(all(x %in% c(AMR_env$MO_lookup$mo, NA)) && | ||||||
|     isFALSE(Becker) && |     isFALSE(Becker) && | ||||||
|     isFALSE(Lancefield), error = function(e) FALSE)) { |     isFALSE(Lancefield), error = function(e) FALSE)) { | ||||||
| @@ -492,6 +494,7 @@ mo_uncertainties <- function() { | |||||||
| #' @rdname as.mo | #' @rdname as.mo | ||||||
| #' @export | #' @export | ||||||
| mo_renamed <- function() { | mo_renamed <- function() { | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|   x <- AMR_env$mo_renamed |   x <- AMR_env$mo_renamed | ||||||
|  |  | ||||||
|   x$new <- synonym_mo_to_accepted_mo(x$old) |   x$new <- synonym_mo_to_accepted_mo(x$old) | ||||||
| @@ -547,6 +550,7 @@ mo_cleaning_regex <- function() { | |||||||
|  |  | ||||||
| # will be exported using s3_register() in R/zzz.R | # will be exported using s3_register() in R/zzz.R | ||||||
| pillar_shaft.mo <- function(x, ...) { | pillar_shaft.mo <- function(x, ...) { | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|   out <- format(x) |   out <- format(x) | ||||||
|   # grey out the kingdom (part until first "_") |   # grey out the kingdom (part until first "_") | ||||||
|   out[!is.na(x)] <- gsub("^([A-Z]+_)(.*)", paste0(font_subtle("\\1"), "\\2"), out[!is.na(x)], perl = TRUE) |   out[!is.na(x)] <- gsub("^([A-Z]+_)(.*)", paste0(font_subtle("\\1"), "\\2"), out[!is.na(x)], perl = TRUE) | ||||||
| @@ -664,6 +668,7 @@ get_skimmers.mo <- function(column) { | |||||||
| #' @export | #' @export | ||||||
| #' @noRd | #' @noRd | ||||||
| print.mo <- function(x, print.shortnames = FALSE, ...) { | print.mo <- function(x, print.shortnames = FALSE, ...) { | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|   cat("Class 'mo'\n") |   cat("Class 'mo'\n") | ||||||
|   x_names <- names(x) |   x_names <- names(x) | ||||||
|   if (is.null(x_names) & print.shortnames == TRUE) { |   if (is.null(x_names) & print.shortnames == TRUE) { | ||||||
| @@ -704,6 +709,7 @@ summary.mo <- function(object, ...) { | |||||||
| #' @export | #' @export | ||||||
| #' @noRd | #' @noRd | ||||||
| as.data.frame.mo <- function(x, ...) { | as.data.frame.mo <- function(x, ...) { | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|   if (!all(x %in% c(AMR_env$MO_lookup$mo, NA))) { |   if (!all(x %in% c(AMR_env$MO_lookup$mo, NA))) { | ||||||
|     warning_( |     warning_( | ||||||
|       "The data contains old MO codes (from a previous AMR package version). ", |       "The data contains old MO codes (from a previous AMR package version). ", | ||||||
| @@ -741,6 +747,7 @@ as.data.frame.mo <- function(x, ...) { | |||||||
|   y <- NextMethod() |   y <- NextMethod() | ||||||
|   attributes(y) <- attributes(i) |   attributes(y) <- attributes(i) | ||||||
|   # must only contain valid MOs |   # must only contain valid MOs | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|   return_after_integrity_check(y, "microorganism code", as.character(AMR_env$MO_lookup$mo)) |   return_after_integrity_check(y, "microorganism code", as.character(AMR_env$MO_lookup$mo)) | ||||||
| } | } | ||||||
| #' @method [[<- mo | #' @method [[<- mo | ||||||
| @@ -750,6 +757,7 @@ as.data.frame.mo <- function(x, ...) { | |||||||
|   y <- NextMethod() |   y <- NextMethod() | ||||||
|   attributes(y) <- attributes(i) |   attributes(y) <- attributes(i) | ||||||
|   # must only contain valid MOs |   # must only contain valid MOs | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|   return_after_integrity_check(y, "microorganism code", as.character(AMR_env$MO_lookup$mo)) |   return_after_integrity_check(y, "microorganism code", as.character(AMR_env$MO_lookup$mo)) | ||||||
| } | } | ||||||
| #' @method c mo | #' @method c mo | ||||||
| @@ -759,6 +767,7 @@ c.mo <- function(...) { | |||||||
|   x <- list(...)[[1L]] |   x <- list(...)[[1L]] | ||||||
|   y <- NextMethod() |   y <- NextMethod() | ||||||
|   attributes(y) <- attributes(x) |   attributes(y) <- attributes(x) | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|   return_after_integrity_check(y, "microorganism code", as.character(AMR_env$MO_lookup$mo)) |   return_after_integrity_check(y, "microorganism code", as.character(AMR_env$MO_lookup$mo)) | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -789,6 +798,8 @@ print.mo_uncertainties <- function(x, ...) { | |||||||
|     return(invisible(NULL)) |     return(invisible(NULL)) | ||||||
|   } |   } | ||||||
|    |    | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|  |  | ||||||
|   cat(word_wrap("Matching scores are based on the resemblance between the input and the full taxonomic name, and the pathogenicity in humans. See `?mo_matching_score`.\n\n", add_fn = font_blue)) |   cat(word_wrap("Matching scores are based on the resemblance between the input and the full taxonomic name, and the pathogenicity in humans. See `?mo_matching_score`.\n\n", add_fn = font_blue)) | ||||||
|   if (has_colour()) { |   if (has_colour()) { | ||||||
|     cat(word_wrap("Colour keys: ", |     cat(word_wrap("Colour keys: ", | ||||||
| @@ -1049,6 +1060,7 @@ replace_old_mo_codes <- function(x, property) { | |||||||
|   # B_ESCH_COL (AMR v0.5.0) -> B_ESCHR_COLI |   # B_ESCH_COL (AMR v0.5.0) -> B_ESCHR_COLI | ||||||
|   ind <- x %like_case% "^[A-Z]_[A-Z_]+$" & !x %in% AMR_env$MO_lookup$mo |   ind <- x %like_case% "^[A-Z]_[A-Z_]+$" & !x %in% AMR_env$MO_lookup$mo | ||||||
|   if (any(ind, na.rm = TRUE)) { |   if (any(ind, na.rm = TRUE)) { | ||||||
|  |     add_MO_lookup_to_AMR_env() | ||||||
|     # get the ones that match |     # get the ones that match | ||||||
|     affected <- x[ind] |     affected <- x[ind] | ||||||
|     affected_unique <- unique(affected) |     affected_unique <- unique(affected) | ||||||
|   | |||||||
| @@ -84,6 +84,8 @@ mo_matching_score <- function(x, n) { | |||||||
|   meet_criteria(x, allow_class = c("character", "data.frame", "list")) |   meet_criteria(x, allow_class = c("character", "data.frame", "list")) | ||||||
|   meet_criteria(n, allow_class = "character") |   meet_criteria(n, allow_class = "character") | ||||||
|  |  | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|  |  | ||||||
|   x <- parse_and_convert(x) |   x <- parse_and_convert(x) | ||||||
|   # no dots and other non-whitespace characters |   # no dots and other non-whitespace characters | ||||||
|   x <- gsub("[^a-zA-Z0-9 \\(\\)]+", "", x) |   x <- gsub("[^a-zA-Z0-9 \\(\\)]+", "", x) | ||||||
|   | |||||||
| @@ -417,6 +417,8 @@ mo_pathogenicity <- function(x, language = get_AMR_locale(), keep_synonyms = get | |||||||
|   language <- validate_language(language) |   language <- validate_language(language) | ||||||
|   meet_criteria(keep_synonyms, allow_class = "logical", has_length = 1) |   meet_criteria(keep_synonyms, allow_class = "logical", has_length = 1) | ||||||
|  |  | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|  |  | ||||||
|   x.mo <- as.mo(x, language = language, keep_synonyms = keep_synonyms, ...) |   x.mo <- as.mo(x, language = language, keep_synonyms = keep_synonyms, ...) | ||||||
|   metadata <- get_mo_uncertainties() |   metadata <- get_mo_uncertainties() | ||||||
|  |  | ||||||
| @@ -726,6 +728,8 @@ mo_synonyms <- function(x, language = get_AMR_locale(), keep_synonyms = getOptio | |||||||
|   language <- validate_language(language) |   language <- validate_language(language) | ||||||
|   meet_criteria(keep_synonyms, allow_class = "logical", has_length = 1) |   meet_criteria(keep_synonyms, allow_class = "logical", has_length = 1) | ||||||
|    |    | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|  |  | ||||||
|   x.mo <- as.mo(x, language = language, keep_synonyms = keep_synonyms, ...) |   x.mo <- as.mo(x, language = language, keep_synonyms = keep_synonyms, ...) | ||||||
|   metadata <- get_mo_uncertainties() |   metadata <- get_mo_uncertainties() | ||||||
|  |  | ||||||
| @@ -812,6 +816,8 @@ mo_url <- function(x, open = FALSE, language = get_AMR_locale(), keep_synonyms = | |||||||
|   language <- validate_language(language) |   language <- validate_language(language) | ||||||
|   meet_criteria(keep_synonyms, allow_class = "logical", has_length = 1) |   meet_criteria(keep_synonyms, allow_class = "logical", has_length = 1) | ||||||
|    |    | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|  |  | ||||||
|   x.mo <- as.mo(x = x, language = language, keep_synonyms = keep_synonyms, ... = ...) |   x.mo <- as.mo(x = x, language = language, keep_synonyms = keep_synonyms, ... = ...) | ||||||
|   metadata <- get_mo_uncertainties() |   metadata <- get_mo_uncertainties() | ||||||
|  |  | ||||||
| @@ -847,7 +853,7 @@ mo_property <- function(x, property = "fullname", language = get_AMR_locale(), k | |||||||
|     x <- find_mo_col(fn = "mo_property") |     x <- find_mo_col(fn = "mo_property") | ||||||
|   } |   } | ||||||
|   meet_criteria(x, allow_NA = TRUE) |   meet_criteria(x, allow_NA = TRUE) | ||||||
|   meet_criteria(property, allow_class = "character", has_length = 1, is_in = colnames(AMR_env$MO_lookup)) |   meet_criteria(property, allow_class = "character", has_length = 1, is_in = colnames(AMR::microorganisms)) | ||||||
|   language <- validate_language(language) |   language <- validate_language(language) | ||||||
|   meet_criteria(keep_synonyms, allow_class = "logical", has_length = 1) |   meet_criteria(keep_synonyms, allow_class = "logical", has_length = 1) | ||||||
|  |  | ||||||
| @@ -855,6 +861,7 @@ mo_property <- function(x, property = "fullname", language = get_AMR_locale(), k | |||||||
| } | } | ||||||
|  |  | ||||||
| mo_validate <- function(x, property, language, keep_synonyms = keep_synonyms, ...) { | mo_validate <- function(x, property, language, keep_synonyms = keep_synonyms, ...) { | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|    |    | ||||||
|   # try to catch an error when inputting an invalid argument |   # try to catch an error when inputting an invalid argument | ||||||
|   # so the 'call.' can be set to FALSE |   # so the 'call.' can be set to FALSE | ||||||
|   | |||||||
| @@ -261,6 +261,8 @@ get_mo_source <- function(destination = getOption("AMR_mo_source", "~/mo_source. | |||||||
| } | } | ||||||
|  |  | ||||||
| check_validity_mo_source <- function(x, refer_to_name = "`reference_df`", stop_on_error = TRUE) { | check_validity_mo_source <- function(x, refer_to_name = "`reference_df`", stop_on_error = TRUE) { | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|  |    | ||||||
|   if (paste(deparse(substitute(x)), collapse = "") == "get_mo_source()") { |   if (paste(deparse(substitute(x)), collapse = "") == "get_mo_source()") { | ||||||
|     return(TRUE) |     return(TRUE) | ||||||
|   } |   } | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								R/sysdata.rda
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								R/sysdata.rda
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -95,6 +95,7 @@ vec_cast.character.mo <- function(x, to, ...) { | |||||||
|   as.character(x) |   as.character(x) | ||||||
| } | } | ||||||
| vec_cast.mo.character <- function(x, to, ...) { | vec_cast.mo.character <- function(x, to, ...) { | ||||||
|  |   add_MO_lookup_to_AMR_env() | ||||||
|   return_after_integrity_check(x, "microorganism code", as.character(AMR_env$MO_lookup$mo)) |   return_after_integrity_check(x, "microorganism code", as.character(AMR_env$MO_lookup$mo)) | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										40
									
								
								R/zzz.R
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								R/zzz.R
									
									
									
									
									
								
							| @@ -181,11 +181,10 @@ if (utf8_supported && !is_latex) { | |||||||
|     try(loadNamespace("tibble"), silent = TRUE) |     try(loadNamespace("tibble"), silent = TRUE) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   # reference data - they have additional columns compared to `antibiotics` and `microorganisms` to improve speed |   # reference data - they have additional to improve algorithm speed | ||||||
|   # they cannot be part of R/sysdata.rda since CRAN thinks it would make the package too large (+3 MB) |   # they cannot be part of R/sysdata.rda since CRAN thinks it would make the package too large (+3 MB) | ||||||
|   AMR_env$AB_lookup <- create_AB_lookup() |   AMR_env$AB_lookup <- cbind(AMR::antibiotics, AB_LOOKUP) | ||||||
|   AMR_env$AV_lookup <- create_AV_lookup() |   AMR_env$AV_lookup <- cbind(AMR::antivirals, AV_LOOKUP) | ||||||
|   AMR_env$MO_lookup <- create_MO_lookup() |  | ||||||
| } | } | ||||||
|  |  | ||||||
| .onAttach <- function(lib, pkg) { | .onAttach <- function(lib, pkg) { | ||||||
| @@ -208,36 +207,3 @@ if (utf8_supported && !is_latex) { | |||||||
|     }, error = function(e) packageStartupMessage("Failed: ", e$message)) |     }, error = function(e) packageStartupMessage("Failed: ", e$message)) | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| # Helper functions -------------------------------------------------------- |  | ||||||
|  |  | ||||||
| create_AB_lookup <- function() { |  | ||||||
|   cbind(AMR::antibiotics, AB_LOOKUP) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| create_AV_lookup <- function() { |  | ||||||
|   cbind(AMR::antivirals, AV_LOOKUP) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| create_MO_lookup <- function() { |  | ||||||
|   MO_lookup <- AMR::microorganisms |  | ||||||
|  |  | ||||||
|   MO_lookup$kingdom_index <- NA_real_ |  | ||||||
|   MO_lookup[which(MO_lookup$kingdom == "Bacteria" | MO_lookup$mo == "UNKNOWN"), "kingdom_index"] <- 1 |  | ||||||
|   MO_lookup[which(MO_lookup$kingdom == "Fungi"), "kingdom_index"] <- 2 |  | ||||||
|   MO_lookup[which(MO_lookup$kingdom == "Protozoa"), "kingdom_index"] <- 3 |  | ||||||
|   MO_lookup[which(MO_lookup$kingdom == "Archaea"), "kingdom_index"] <- 4 |  | ||||||
|   # all the rest |  | ||||||
|   MO_lookup[which(is.na(MO_lookup$kingdom_index)), "kingdom_index"] <- 5 |  | ||||||
|    |  | ||||||
|   if (length(MO_FULLNAME_LOWER) != nrow(MO_lookup)) { |  | ||||||
|     packageStartupMessage("fullname_lower not same size - applied tolower(), update sysdata.rda!") |  | ||||||
|     MO_lookup$fullname_lower <- tolower(MO_lookup$fullname) |  | ||||||
|   } else { |  | ||||||
|     MO_lookup$fullname_lower <- MO_FULLNAME_LOWER |  | ||||||
|   } |  | ||||||
|   MO_lookup$full_first <- substr(MO_lookup$fullname_lower, 1, 1) |  | ||||||
|   MO_lookup$species_first <- tolower(substr(MO_lookup$species, 1, 1)) # tolower for groups (Streptococcus, Salmonella) |  | ||||||
|   MO_lookup$subspecies_first <- tolower(substr(MO_lookup$subspecies, 1, 1)) # tolower for Salmonella serovars |  | ||||||
|   MO_lookup |  | ||||||
| } |  | ||||||
|   | |||||||
| @@ -144,21 +144,6 @@ create_species_cons_cops <- function(type = c("CoNS", "CoPS")) { | |||||||
|     ] |     ] | ||||||
|   } |   } | ||||||
| } | } | ||||||
| create_MO_fullname_lower <- function() { |  | ||||||
|   AMR_env$MO_lookup <- AMR::microorganisms |  | ||||||
|   # use this paste instead of `fullname` to work with Viridans Group Streptococci, etc. |  | ||||||
|   AMR_env$MO_lookup$fullname_lower <- tolower(trimws(paste( |  | ||||||
|     AMR_env$MO_lookup$genus, |  | ||||||
|     AMR_env$MO_lookup$species, |  | ||||||
|     AMR_env$MO_lookup$subspecies |  | ||||||
|   ))) |  | ||||||
|   ind <- AMR_env$MO_lookup$genus == "" | grepl("^[(]unknown ", AMR_env$MO_lookup$fullname, perl = TRUE) |  | ||||||
|   AMR_env$MO_lookup[ind, "fullname_lower"] <- tolower(AMR_env$MO_lookup[ind, "fullname", drop = TRUE]) |  | ||||||
|   AMR_env$MO_lookup$fullname_lower <- trimws(gsub("[^.a-z0-9/ \\-]+", "", AMR_env$MO_lookup$fullname_lower, perl = TRUE)) |  | ||||||
|   # special for Salmonella - they have cities as subspecies but not the species (enterica) in the fullname: |  | ||||||
|   AMR_env$MO_lookup$fullname_lower[which(AMR_env$MO_lookup$subspecies %like_case% "^[A-Z]")] <- gsub(" enterica ", " ", AMR_env$MO_lookup$fullname_lower[which(AMR_env$MO_lookup$subspecies %like_case% "^[A-Z]")], fixed = TRUE) |  | ||||||
|   AMR_env$MO_lookup$fullname_lower |  | ||||||
| } |  | ||||||
| MO_CONS <- create_species_cons_cops("CoNS") | MO_CONS <- create_species_cons_cops("CoNS") | ||||||
| MO_COPS <- create_species_cons_cops("CoPS") | MO_COPS <- create_species_cons_cops("CoPS") | ||||||
| MO_STREP_ABCG <- AMR_env$MO_lookup$mo[which(AMR_env$MO_lookup$genus == "Streptococcus" & | MO_STREP_ABCG <- AMR_env$MO_lookup$mo[which(AMR_env$MO_lookup$genus == "Streptococcus" & | ||||||
| @@ -166,7 +151,6 @@ MO_STREP_ABCG <- AMR_env$MO_lookup$mo[which(AMR_env$MO_lookup$genus == "Streptoc | |||||||
|     "pyogenes", "agalactiae", "dysgalactiae", "equi", "canis", |     "pyogenes", "agalactiae", "dysgalactiae", "equi", "canis", | ||||||
|     "group A", "group B", "group C", "group G" |     "group A", "group B", "group C", "group G" | ||||||
|   ))] |   ))] | ||||||
| MO_FULLNAME_LOWER <- create_MO_fullname_lower() |  | ||||||
| MO_PREVALENT_GENERA <- c( | MO_PREVALENT_GENERA <- c( | ||||||
|   "Absidia", "Acanthamoeba", "Acremonium", "Aedes", "Alternaria", "Amoeba", "Ancylostoma", "Angiostrongylus", |   "Absidia", "Acanthamoeba", "Acremonium", "Aedes", "Alternaria", "Amoeba", "Ancylostoma", "Angiostrongylus", | ||||||
|   "Anisakis", "Anopheles", "Apophysomyces", "Aspergillus", "Aureobasidium", "Basidiobolus", "Beauveria", |   "Anisakis", "Anopheles", "Apophysomyces", "Aspergillus", "Aureobasidium", "Basidiobolus", "Beauveria", | ||||||
| @@ -298,7 +282,6 @@ suppressMessages(usethis::use_data(EUCAST_RULES_DF, | |||||||
|   MO_CONS, |   MO_CONS, | ||||||
|   MO_COPS, |   MO_COPS, | ||||||
|   MO_STREP_ABCG, |   MO_STREP_ABCG, | ||||||
|   MO_FULLNAME_LOWER, |  | ||||||
|   MO_PREVALENT_GENERA, |   MO_PREVALENT_GENERA, | ||||||
|   AB_LOOKUP, |   AB_LOOKUP, | ||||||
|   AV_LOOKUP, |   AV_LOOKUP, | ||||||
|   | |||||||
| @@ -28,7 +28,7 @@ A BibTeX entry for LaTeX users is: | |||||||
| \description{ | \description{ | ||||||
| Welcome to the \code{AMR} package. | Welcome to the \code{AMR} package. | ||||||
|  |  | ||||||
| The \code{AMR} package is a \href{https://msberends.github.io/AMR#copyright}{free and open-source} R package with \href{https://en.wikipedia.org/wiki/Dependency_hell}{zero dependencies} to simplify the analysis and prediction of Antimicrobial Resistance (AMR) and to work with microbial and antimicrobial data and properties, by using evidence-based methods. \strong{Our aim is to provide a standard} for clean and reproducible AMR data analysis, that can therefore empower epidemiological analyses to continuously enable surveillance and treatment evaluation in any setting. \href{https://msberends.github.io/AMR/authors.html}{Many different researchers} from around the globe are continually helping us to make this a successful and durable project! | The \code{AMR} package is a \href{https://msberends.github.io/AMR/#copyright}{free and open-source} R package with \href{https://en.wikipedia.org/wiki/Dependency_hell}{zero dependencies} to simplify the analysis and prediction of Antimicrobial Resistance (AMR) and to work with microbial and antimicrobial data and properties, by using evidence-based methods. \strong{Our aim is to provide a standard} for clean and reproducible AMR data analysis, that can therefore empower epidemiological analyses to continuously enable surveillance and treatment evaluation in any setting. \href{https://msberends.github.io/AMR/authors.html}{Many different researchers} from around the globe are continually helping us to make this a successful and durable project! | ||||||
|  |  | ||||||
| This work was published in the Journal of Statistical Software (Volume 104(3); \href{https://doi.org/10.18637/jss.v104.i03}{DOI 10.18637/jss.v104.i03}) and formed the basis of two PhD theses (\href{https://doi.org/10.33612/diss.177417131}{DOI 10.33612/diss.177417131} and \href{https://doi.org/10.33612/diss.192486375}{DOI 10.33612/diss.192486375}). | This work was published in the Journal of Statistical Software (Volume 104(3); \href{https://doi.org/10.18637/jss.v104.i03}{DOI 10.18637/jss.v104.i03}) and formed the basis of two PhD theses (\href{https://doi.org/10.33612/diss.177417131}{DOI 10.33612/diss.177417131} and \href{https://doi.org/10.33612/diss.192486375}{DOI 10.33612/diss.192486375}). | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user