From 0c3ea4b538e769829d62388c85eb796b969aa7a9 Mon Sep 17 00:00:00 2001 From: Matthijs Berends Date: Wed, 26 Feb 2025 19:23:54 +0100 Subject: [PATCH] (v2.1.1.9159) new approach as.ab() --- .github/workflows/check-old-tinytest.yaml | 2 +- .github/workflows/codecovr.yaml | 2 +- .github/workflows/lintr.yaml | 12 +- .github/workflows/publish-to-pypi.yml | 2 +- .github/workflows/website.yaml | 2 +- DESCRIPTION | 2 +- NEWS.md | 2 +- PythonPackage/AMR/AMR.egg-info/PKG-INFO | 2 +- PythonPackage/AMR/dist/amr-2.1.1.9158.tar.gz | Bin 10114 -> 0 bytes ...ny.whl => amr-2.1.1.9159-py3-none-any.whl} | Bin 10304 -> 10303 bytes PythonPackage/AMR/dist/amr-2.1.1.9159.tar.gz | Bin 0 -> 10123 bytes PythonPackage/AMR/setup.py | 2 +- R/ab.R | 348 +++++------------- ....txt => gpt_training_text_v2.1.1.9159.txt} | 8 +- man/as.ab.Rd | 6 +- tests/testthat/test-ab.R | 7 +- tests/testthat/test-ab_from_text.R | 14 +- tests/testthat/test-ab_property.R | 3 + 18 files changed, 130 insertions(+), 284 deletions(-) delete mode 100644 PythonPackage/AMR/dist/amr-2.1.1.9158.tar.gz rename PythonPackage/AMR/dist/{amr-2.1.1.9158-py3-none-any.whl => amr-2.1.1.9159-py3-none-any.whl} (52%) create mode 100644 PythonPackage/AMR/dist/amr-2.1.1.9159.tar.gz rename data-raw/{gpt_training_text_v2.1.1.9158.txt => gpt_training_text_v2.1.1.9159.txt} (99%) diff --git a/.github/workflows/check-old-tinytest.yaml b/.github/workflows/check-old-tinytest.yaml index d4ebd6024..4f90f2606 100644 --- a/.github/workflows/check-old-tinytest.yaml +++ b/.github/workflows/check-old-tinytest.yaml @@ -61,7 +61,7 @@ jobs: R_REMOTES_NO_ERRORS_FROM_WARNINGS: true steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: r-lib/actions/setup-r@v2 with: diff --git a/.github/workflows/codecovr.yaml b/.github/workflows/codecovr.yaml index 52612db9e..927d867c1 100644 --- a/.github/workflows/codecovr.yaml +++ b/.github/workflows/codecovr.yaml @@ -42,7 +42,7 @@ jobs: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} CODECOV_TOKEN: ${{secrets.CODECOV_TOKEN}} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: r-lib/actions/setup-pandoc@v2 diff --git a/.github/workflows/lintr.yaml b/.github/workflows/lintr.yaml index f70b5c03d..982e789a7 100644 --- a/.github/workflows/lintr.yaml +++ b/.github/workflows/lintr.yaml @@ -41,7 +41,7 @@ jobs: env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: r-lib/actions/setup-pandoc@v2 @@ -59,13 +59,15 @@ jobs: run: | # old: lintr::lint_package(linters = lintr::with_defaults(line_length_linter = NULL, trailing_whitespace_linter = NULL, object_name_linter = NULL, cyclocomp_linter = NULL, object_length_linter = lintr::object_length_linter(length = 50L)), exclusions = list("R/aa_helper_pm_functions.R")) # now get ALL linters, not just default ones - linters <- ls(envir = asNamespace("lintr"), pattern = "_linter$") + linters <- getNamespaceExports(asNamespace("lintr")) + linters <- sort(linters[grepl("_linter$", linters)]) # lose deprecated - linters <- linters[!grepl("^(closed_curly|open_curly|paren_brace|semicolon_terminator)_linter$", linters)] + linters <- linters[!grepl("^(closed_curly|open_curly|paren_brace|semicolon_terminator|consecutive_stopifnot|no_tab|single_quotes|unnecessary_nested_if|unneeded_concatenation)_linter$", linters)] # and the ones we find unnnecessary linters <- linters[!grepl("^(extraction_operator|implicit_integer|line_length|object_name|nonportable_path|is)_linter$", linters)] # put the functions in a list - linters <- lapply(linters, function(l) eval(parse(text = paste0("lintr::", l, "()")), envir = asNamespace("lintr"))) + linters_list <- lapply(linters, function(l) eval(parse(text = paste0("lintr::", l, "()")), envir = asNamespace("lintr"))) + names(linters_list) <- linters # run them all! - lintr::lint_package(linters = linters, exclusions = list("R/aa_helper_pm_functions.R")) + lintr::lint_package(linters = linters_list, exclusions = list("R/aa_helper_pm_functions.R")) shell: Rscript {0} diff --git a/.github/workflows/publish-to-pypi.yml b/.github/workflows/publish-to-pypi.yml index 742ee59ef..ad12e8421 100644 --- a/.github/workflows/publish-to-pypi.yml +++ b/.github/workflows/publish-to-pypi.yml @@ -40,7 +40,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 diff --git a/.github/workflows/website.yaml b/.github/workflows/website.yaml index 9ea727bd7..0169301cf 100644 --- a/.github/workflows/website.yaml +++ b/.github/workflows/website.yaml @@ -43,7 +43,7 @@ jobs: continue-on-error: true steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: # this is to keep timestamps, the default fetch-depth: 1 gets the timestamps of the moment of cloning # we need this for the download page on our website - dates must be of the files, not of the latest git push diff --git a/DESCRIPTION b/DESCRIPTION index 3cc5ae666..4f68d510f 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,5 @@ Package: AMR -Version: 2.1.1.9158 +Version: 2.1.1.9159 Date: 2025-02-26 Title: Antimicrobial Resistance Data Analysis Description: Functions to simplify and standardise antimicrobial resistance (AMR) diff --git a/NEWS.md b/NEWS.md index 2bc8d05ce..0e8dbb204 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# AMR 2.1.1.9158 +# AMR 2.1.1.9159 *(this beta version will eventually become v3.0. We're happy to reach a new major milestone soon, which will be all about the new One Health support! Install this beta using [the instructions here](https://msberends.github.io/AMR/#latest-development-version).)* diff --git a/PythonPackage/AMR/AMR.egg-info/PKG-INFO b/PythonPackage/AMR/AMR.egg-info/PKG-INFO index fcb87067a..f7b2915db 100644 --- a/PythonPackage/AMR/AMR.egg-info/PKG-INFO +++ b/PythonPackage/AMR/AMR.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.2 Name: AMR -Version: 2.1.1.9158 +Version: 2.1.1.9159 Summary: A Python wrapper for the AMR R package Home-page: https://github.com/msberends/AMR Author: Matthijs Berends diff --git a/PythonPackage/AMR/dist/amr-2.1.1.9158.tar.gz b/PythonPackage/AMR/dist/amr-2.1.1.9158.tar.gz deleted file mode 100644 index 5a99784af4013f1ea833103ac061c8772e7f090c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10114 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 diff --git a/PythonPackage/AMR/dist/amr-2.1.1.9158-py3-none-any.whl b/PythonPackage/AMR/dist/amr-2.1.1.9159-py3-none-any.whl similarity index 52% rename from PythonPackage/AMR/dist/amr-2.1.1.9158-py3-none-any.whl rename to PythonPackage/AMR/dist/amr-2.1.1.9159-py3-none-any.whl index 495c67175ad941c75b708caba405f2231d84962a..3b32c5035d6e88aa82f02078e52f66f236ee7a86 100644 GIT binary patch delta 4073 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 bT3XYxU&djR@+T$%Ig=SEAqF)j00000$4th( delta 4074 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 diff --git a/PythonPackage/AMR/dist/amr-2.1.1.9159.tar.gz b/PythonPackage/AMR/dist/amr-2.1.1.9159.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..a9af2aaafccd5e4674392f826734d62b5e0ed017 GIT binary patch literal 10123 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 25 on.exit(close(progress)) } - + for (i in which(!already_known)) { if (loop_time == 1) { progress$tick() } - + if (is.na(x[i]) || is.null(x[i])) { next } if (identical(x[i], "") || - # prevent "bacteria" from coercing to TMP, since Bacterial is a brand name of it: - identical(tolower(x[i]), "bacteria")) { + # prevent "bacteria" from coercing to TMP, since Bacterial is a brand name of it: + identical(tolower(x[i]), "bacteria")) { x_unknown <- c(x_unknown, x_bak[x[i] == x_bak_clean][1]) next } @@ -215,21 +216,21 @@ as.ab <- function(x, flag_multiple_results = TRUE, info = interactive(), ...) { x_new[i] <- NA_character_ next } - + if (fast_mode == FALSE && flag_multiple_results == TRUE && x[i] %like% "[ ]") { from_text <- tryCatch(suppressWarnings(ab_from_text(x[i], loop_time = loop_time + 1, translate_ab = FALSE)[[1]]), - error = function(e) character(0) + error = function(e) character(0) ) } else { from_text <- character(0) } - + # old code for phenoxymethylpenicillin (Peni V) if (x[i] == "PNV") { x_new[i] <- "PHN" next } - + # exact LOINC code loinc_found <- unlist(lapply( AMR_env$AB_lookup$generalised_loinc, @@ -240,7 +241,7 @@ as.ab <- function(x, flag_multiple_results = TRUE, info = interactive(), ...) { x_new[i] <- note_if_more_than_one_found(found, i, from_text) next } - + # exact synonym synonym_found <- unlist(lapply( AMR_env$AB_lookup$generalised_synonyms, @@ -251,7 +252,7 @@ as.ab <- function(x, flag_multiple_results = TRUE, info = interactive(), ...) { x_new[i] <- note_if_more_than_one_found(found, i, from_text) next } - + # exact abbreviation abbr_found <- unlist(lapply( AMR_env$AB_lookup$generalised_abbreviations, @@ -263,7 +264,7 @@ as.ab <- function(x, flag_multiple_results = TRUE, info = interactive(), ...) { x_new[i] <- note_if_more_than_one_found(found, i, from_text) next } - + # length of input is quite long, and Levenshtein distance is only max 2 if (nchar(x[i]) >= 10) { levenshtein <- as.double(utils::adist(x[i], AMR_env$AB_lookup$generalised_name)) @@ -273,7 +274,7 @@ as.ab <- function(x, flag_multiple_results = TRUE, info = interactive(), ...) { next } } - + # allow characters that resemble others, but only continue when having more than 3 characters if (nchar(x[i]) <= 3) { x_unknown <- c(x_unknown, x_bak[x[i] == x_bak_clean][1]) @@ -303,20 +304,22 @@ as.ab <- function(x, flag_multiple_results = TRUE, info = interactive(), ...) { x_spelling <- gsub("(O|0)", "(O|0)+", x_spelling, perl = TRUE) x_spelling <- gsub("++", "+", x_spelling, fixed = TRUE) } - + # try if name starts with it found <- AMR_env$AB_lookup[which(AMR_env$AB_lookup$generalised_name %like% paste0("^", x_spelling)), "ab", drop = TRUE] if (length(found) > 0) { x_new[i] <- note_if_more_than_one_found(found, i, from_text) next } + + # try if name ends with it found <- AMR_env$AB_lookup[which(AMR_env$AB_lookup$generalised_name %like% paste0(x_spelling, "$")), "ab", drop = TRUE] if (nchar(x[i]) >= 4 && length(found) > 0) { x_new[i] <- note_if_more_than_one_found(found, i, from_text) next } - + # and try if any synonym starts with it synonym_found <- unlist(lapply( AMR_env$AB_lookup$generalised_synonyms, @@ -327,244 +330,71 @@ as.ab <- function(x, flag_multiple_results = TRUE, info = interactive(), ...) { x_new[i] <- note_if_more_than_one_found(found, i, from_text) next } - + # INITIAL SEARCH - More uncertain results ---- - if (loop_time <= 2 && fast_mode == FALSE) { + if (loop_time == 1 && fast_mode == FALSE) { # only run on first and second try - # base on the Levensthein distance function if length >= 6 - if (nchar(x[i]) >= 6) { - l_dist <- as.double(utils::adist(x[i], AMR_env$AB_lookup$generalised_name, - ignore.case = FALSE, - fixed = TRUE, - costs = c(insertions = 1, deletions = 2, substitutions = 2), - counts = FALSE)) - x_new[i] <- AMR_env$AB_lookup$ab[order(l_dist)][1] - x_uncertain <- c(x_uncertain, x_bak[x[i] == x_bak_clean][1]) - next - } - - # try by removing all spaces - if (x[i] %like% " ") { - found <- suppressWarnings(as.ab(gsub(" +", "", x[i], perl = TRUE), loop_time = loop_time + 2)) - if (length(found) > 0 && !is.na(found)) { - x_new[i] <- note_if_more_than_one_found(found, i, from_text) - x_uncertain <- c(x_uncertain, x_bak[x[i] == x_bak_clean][1]) - next - } - } - - # try by removing all spaces and numbers - if (x[i] %like% " " || x[i] %like% "[0-9]") { - found <- suppressWarnings(as.ab(gsub("[ 0-9]", "", x[i], perl = TRUE), loop_time = loop_time + 2)) - if (length(found) > 0 && !is.na(found)) { - x_new[i] <- note_if_more_than_one_found(found, i, from_text) - x_uncertain <- c(x_uncertain, x_bak[x[i] == x_bak_clean][1]) - next - } - } - - # reverse a combination, e.g. clavulanic acid/amoxicillin - if (x[i] %like% " ") { - split <- strsplit(x[i], " ")[[1]] - permute <- function(x) { - if (length(x) == 1) return(list(x)) - result <- vector("list", factorial(length(x))) - index <- 1 - for (i in seq_along(x)) { - sub_perms <- permute(x[-i]) # Recursively get permutations of remaining elements - for (sub in sub_perms) { - result[[index]] <- c(x[i], sub) - index <- index + 1 - } - } - return(result) - } - permutations <- permute(split) - found_perms <- character(length(permutations)) - for (s in seq_len(length(permutations))) { - concat <- paste0(permutations[[s]], collapse = " ") - if (concat %in% AMR_env$AB_lookup$generalised_name) { - found_perms[s] <- AMR_env$AB_lookup[which(AMR_env$AB_lookup$generalised_name == concat), "ab", drop = TRUE] - } else { - found_perms[s] <- suppressWarnings(as.ab(concat, loop_time = loop_time + 2)) - } - } - found_perms <- found_perms[!is.na(found_perms)] - if (length(found_perms) > 0) { - found <- found_perms[order(nchar(found_perms), decreasing = TRUE)][1] - x_new[i] <- note_if_more_than_one_found(found, i, from_text) - x_uncertain <- c(x_uncertain, x_bak[x[i] == x_bak_clean][1]) - next - } - } - - # transform back from other languages and try again - x_translated <- paste( - lapply( - strsplit(x[i], "[^A-Z0-9]"), - function(y) { - for (i in seq_len(length(y))) { - for (lang in LANGUAGES_SUPPORTED[LANGUAGES_SUPPORTED != "en"]) { - y[i] <- ifelse(tolower(y[i]) %in% tolower(TRANSLATIONS[, lang, drop = TRUE]), - TRANSLATIONS[which(tolower(TRANSLATIONS[, lang, drop = TRUE]) == tolower(y[i]) & - !isFALSE(TRANSLATIONS$fixed)), "pattern"], - y[i] - ) - } - } - generalise_antibiotic_name(y) - } - )[[1]], - collapse = "/" - ) - x_translated_guess <- suppressWarnings(as.ab(x_translated, loop_time = loop_time + 2)) - if (!is.na(x_translated_guess)) { - x_new[i] <- x_translated_guess - x_uncertain <- c(x_uncertain, x_bak[x[i] == x_bak_clean][1]) - next - } - - # now also try to coerce brandname combinations like "Amoxy/clavulanic acid" - x_translated <- paste( - lapply( - strsplit(x_translated, "[^A-Z0-9 ]"), - function(y) { - for (i in seq_len(length(y))) { - y_name <- suppressWarnings(ab_name(y[i], language = NULL, loop_time = loop_time + 2)) - y[i] <- ifelse(!is.na(y_name), - y_name, - y[i] - ) - } - generalise_antibiotic_name(y) - } - )[[1]], - collapse = "/" - ) - x_translated_guess <- suppressWarnings(as.ab(x_translated, loop_time = loop_time + 2)) - if (!is.na(x_translated_guess)) { - x_new[i] <- x_translated_guess - x_uncertain <- c(x_uncertain, x_bak[x[i] == x_bak_clean][1]) - next - } - - # try by removing all trailing capitals - if (x[i] %like_case% "[a-z]+[A-Z]+$") { - found <- suppressWarnings(as.ab(gsub("[A-Z]+$", "", x[i], perl = TRUE), loop_time = loop_time + 2)) - if (!is.na(found)) { - x_new[i] <- note_if_more_than_one_found(found, i, from_text) - x_uncertain <- c(x_uncertain, x_bak[x[i] == x_bak_clean][1]) - next - } - } - - # keep only letters - found <- suppressWarnings(as.ab(gsub("[^A-Z]", "", x[i], perl = TRUE), loop_time = loop_time + 2)) - if (!is.na(found)) { - x_new[i] <- note_if_more_than_one_found(found, i, from_text) - x_uncertain <- c(x_uncertain, x_bak[x[i] == x_bak_clean][1]) - next - } - - # try from a bigger text, like from a health care record, see ?ab_from_text - # already calculated above if flag_multiple_results = TRUE - if (flag_multiple_results == TRUE) { - found <- from_text[1L] + ab_df <- AMR_env$AB_lookup + ab_df$length_name <- nchar(ab_df$generalised_name) + # now retrieve Levensthein distance for name, synonyms, and translated names + ab_df$lev_name <- as.double(utils::adist(x[i], ab_df$generalised_name, + ignore.case = FALSE, + fixed = TRUE, + costs = c(insertions = 1, deletions = 1, substitutions = 2), + counts = FALSE)) + ab_df$lev_syn <- vapply(FUN.VALUE = double(1), + ab_df$generalised_synonyms, + function(y) ifelse(length(y[nchar(y) >= 5]) == 0, + 999, + min(as.double(utils::adist(x[i], y[nchar(y) >= 5], ignore.case = FALSE, + fixed = TRUE, + costs = c(insertions = 1, deletions = 1, substitutions = 2), + counts = FALSE)), na.rm = TRUE)), + USE.NAMES = FALSE) + if (!is.null(language) && language != "en") { + ab_df$trans <- generalise_antibiotic_name(translate_AMR(ab_df$name, language = language)) + ab_df$lev_trans <- as.double(utils::adist(x[i], ab_df$trans, + ignore.case = FALSE, + fixed = TRUE, + costs = c(insertions = 1, deletions = 1, substitutions = 2), + counts = FALSE)) } else { - found <- tryCatch(suppressWarnings(ab_from_text(x[i], loop_time = loop_time + 2, translate_ab = FALSE)[[1]][1L]), - error = function(e) NA_character_ - ) + ab_df$lev_trans <- ab_df$lev_name } - if (!is.na(found)) { - x_new[i] <- note_if_more_than_one_found(found, i, from_text) + + if (any(ab_df$lev_name < 5, na.rm = TRUE)) { + x_new[i] <- ab_df$ab[order(ab_df$lev_name)][1] x_uncertain <- c(x_uncertain, x_bak[x[i] == x_bak_clean][1]) next - } - - # first 5 except for cephalosporins, then first 7 (those cephalosporins all start quite the same!) - found <- suppressWarnings(as.ab(substr(x[i], 1, 5), loop_time = loop_time + 2)) - if (!is.na(found) && ab_group(found, loop_time = loop_time + 1) %unlike% "cephalosporins") { - x_new[i] <- note_if_more_than_one_found(found, i, from_text) - next - } - found <- suppressWarnings(as.ab(substr(x[i], 1, 7), loop_time = loop_time + 2)) - if (!is.na(found)) { - x_new[i] <- note_if_more_than_one_found(found, i, from_text) + } else if (any(ab_df$lev_trans < 5, na.rm = TRUE)) { + x_new[i] <- ab_df$ab[order(ab_df$lev_trans)][1] x_uncertain <- c(x_uncertain, x_bak[x[i] == x_bak_clean][1]) next - } - - # make all consonants facultative - search_str <- gsub("([BCDFGHJKLMNPQRSTVWXZ])", "\\1*", x[i], perl = TRUE) - found <- suppressWarnings(as.ab(search_str, loop_time = loop_time + 2, already_regex = TRUE)) - # keep at least 4 normal characters - if (nchar(gsub(".\\*", "", search_str, perl = TRUE)) < 4) { - found <- NA - } - if (!is.na(found)) { - x_new[i] <- note_if_more_than_one_found(found, i, from_text) + } else if (any(ab_df$lev_syn < 5, na.rm = TRUE)) { + x_new[i] <- ab_df$ab[order(ab_df$lev_syn)][1] x_uncertain <- c(x_uncertain, x_bak[x[i] == x_bak_clean][1]) next - } - - # make all vowels facultative - search_str <- gsub("([AEIOUY])", "\\1*", x[i], perl = TRUE) - found <- suppressWarnings(as.ab(search_str, loop_time = loop_time + 2, already_regex = TRUE)) - # keep at least 5 normal characters - if (nchar(gsub(".\\*", "", search_str, perl = TRUE)) < 5) { - found <- NA - } - if (!is.na(found)) { - x_new[i] <- note_if_more_than_one_found(found, i, from_text) - x_uncertain <- c(x_uncertain, x_bak[x[i] == x_bak_clean][1]) - next - } - - # allow misspelling of vowels - x_spelling <- gsub("A+", "[AEIOU]+", x_spelling, fixed = TRUE) - x_spelling <- gsub("E+", "[AEIOU]+", x_spelling, fixed = TRUE) - x_spelling <- gsub("I+", "[AEIOU]+", x_spelling, fixed = TRUE) - x_spelling <- gsub("O+", "[AEIOU]+", x_spelling, fixed = TRUE) - x_spelling <- gsub("U+", "[AEIOU]+", x_spelling, fixed = TRUE) - found <- suppressWarnings(as.ab(x_spelling, loop_time = loop_time + 2, already_regex = TRUE)) - if (!is.na(found)) { - x_new[i] <- note_if_more_than_one_found(found, i, from_text) - x_uncertain <- c(x_uncertain, x_bak[x[i] == x_bak_clean][1]) - next - } - - # try with switched character, like "mreopenem" - for (j in seq_len(nchar(x[i]))) { - x_switched <- paste0( - # beginning part: - substr(x[i], 1, j - 1), - # here is the switching of 2 characters: - substr(x[i], j + 1, j + 1), - substr(x[i], j, j), - # ending part: - substr(x[i], j + 2, nchar(x[i])) - ) - found <- suppressWarnings(as.ab(x_switched, loop_time = loop_time + 1)) - if (!is.na(found)) { - break + } else { + # then just take name if Levensthein is max 100% of length of name + ab_df$lev_len_ratio <- ab_df$lev_name / ab_df$length_name + if (any(ab_df$lev_len_ratio < 1)) { + ab_df <- ab_df[ab_df$lev_len_ratio < 1, , drop = FALSE] + x_new[i] <- ab_df$ab[order(ab_df$lev_name)][1] + x_uncertain <- c(x_uncertain, x_bak[x[i] == x_bak_clean][1]) + next } } - if (!is.na(found)) { - x_new[i] <- found[1L] - x_uncertain <- c(x_uncertain, x_bak[x[i] == x_bak_clean][1]) - next - } - } # end of loop_time <= 2 - - # not found + } + + # nothing found x_unknown <- c(x_unknown, x_bak[x[i] == x_bak_clean][1]) } - + if (loop_time == 1 && sum(already_known) < length(x)) { close(progress) } - + # save to package env to save time for next time if (loop_time == 1) { AMR_env$ab_previously_coerced <- AMR_env$ab_previously_coerced[which(!AMR_env$ab_previously_coerced$x %in% x), , drop = FALSE] @@ -578,7 +408,7 @@ as.ab <- function(x, flag_multiple_results = TRUE, info = interactive(), ...) { ) )) } - + # take failed ATC codes apart from rest if (length(x_unknown_ATCs) > 0 && fast_mode == FALSE) { warning_( @@ -619,14 +449,14 @@ as.ab <- function(x, flag_multiple_results = TRUE, info = interactive(), ...) { ". If required, use `add_custom_antimicrobials()` to add custom entries.") } } - + x_result <- x_new[match(x_bak_clean, x)] if (length(x_result) == 0) { x_result <- NA_character_ } - + set_clean_class(x_result, - new_class = c("ab", "character") + new_class = c("ab", "character") ) } @@ -767,16 +597,20 @@ generalise_antibiotic_name <- function(x) { x <- gsub("[^A-Z0-9 -)(]", "/", x, perl = TRUE) # correct for 'high level' antibiotics x <- trimws(gsub("([^A-Z0-9/ -]+)?(HIGH(.?LE?VE?L)?|[^A-Z0-9/]H[^A-Z0-9]?L)([^A-Z0-9 -]+)?", "-HIGH", x, perl = TRUE)) - x <- trimws(gsub("^(-HIGH)(.*)", "\\2\\1", x)) + x <- trimws(gsub("^(-HIGH)(.*)", "\\2\\1", x, perl = TRUE)) # remove part between brackets if that's followed by another string x <- gsub("(.*)+ [(].*[)]", "\\1", x) - # spaces around non-characters must be removed: amox + clav -> amox/clav + # spaces around non-characters must be removed: amox + clav -> amox clav x <- gsub("(.*[A-Z0-9]) ([^A-Z0-9].*)", "\\1\\2", x, perl = TRUE) x <- gsub("(.*[^A-Z0-9]) ([A-Z0-9].*)", "\\1\\2", x, perl = TRUE) # remove hyphen after a starting "co" x <- gsub("^CO-", "CO", x, perl = TRUE) # replace operators with a space x <- gsub("(/| AND | WITH | W/|[+]|[-])+", " ", x, perl = TRUE) + # replace more than 1 space + x <- trimws(gsub(" +", " ", x, perl = TRUE)) + # move HIGH to end + x <- trimws(gsub("(.*) HIGH(.*)", "\\1\\2 HIGH", x, perl = TRUE)) x } @@ -789,9 +623,9 @@ get_translate_ab <- function(translate_ab) { } else { translate_ab <- tolower(translate_ab) stop_ifnot(translate_ab %in% colnames(AMR::antibiotics), - "invalid value for 'translate_ab', this must be a column name of the antibiotics data set\n", - "or TRUE (equals 'name') or FALSE to not translate at all.", - call = FALSE + "invalid value for 'translate_ab', this must be a column name of the antibiotics data set\n", + "or TRUE (equals 'name') or FALSE to not translate at all.", + call = FALSE ) translate_ab } diff --git a/data-raw/gpt_training_text_v2.1.1.9158.txt b/data-raw/gpt_training_text_v2.1.1.9159.txt similarity index 99% rename from data-raw/gpt_training_text_v2.1.1.9158.txt rename to data-raw/gpt_training_text_v2.1.1.9159.txt index 0ebbcddfa..deffcfe6d 100644 --- a/data-raw/gpt_training_text_v2.1.1.9158.txt +++ b/data-raw/gpt_training_text_v2.1.1.9159.txt @@ -1,6 +1,6 @@ This knowledge base contains all context you must know about the AMR package for R. You are a GPT trained to be an assistant for the AMR package in R. You are an incredible R specialist, especially trained in this package and in the tidyverse. -First and foremost, you are trained on version 2.1.1.9158. Remember this whenever someone asks which AMR package version you’re at. +First and foremost, you are trained on version 2.1.1.9159. Remember this whenever someone asks which AMR package version you’re at. Below are the contents of the file, the file, and all the files (documentation) in the package. Every file content is split using 100 hypens. ---------------------------------------------------------------------------------------------------- @@ -2577,7 +2577,8 @@ THE PART HEREAFTER CONTAINS CONTENTS FROM FILE 'man/as.ab.Rd': \alias{ab_reset_session} \title{Transform Input to an Antibiotic ID} \usage{ -as.ab(x, flag_multiple_results = TRUE, info = interactive(), ...) +as.ab(x, flag_multiple_results = TRUE, language = get_AMR_locale(), + info = interactive(), ...) is.ab(x) @@ -2588,6 +2589,8 @@ ab_reset_session() \item{flag_multiple_results}{a \link{logical} to indicate whether a note should be printed to the console that probably more than one antibiotic drug code or name can be retrieved from a single input value.} +\item{language}{language to coerce input values from any of the 20 supported languages - default to the system language if supported (see \code{\link[=get_AMR_locale]{get_AMR_locale()}})} + \item{info}{a \link{logical} to indicate whether a progress bar should be printed - the default is \code{TRUE} only in interactive mode} \item{...}{arguments passed on to internal functions} @@ -2644,7 +2647,6 @@ as.ab("J01FA01") as.ab("J 01 FA 01") as.ab("Erythromycin") as.ab("eryt") -as.ab(" eryt 123") as.ab("ERYT") as.ab("ERY") as.ab("eritromicine") # spelled wrong, yet works diff --git a/man/as.ab.Rd b/man/as.ab.Rd index f29314f22..80ff9a700 100644 --- a/man/as.ab.Rd +++ b/man/as.ab.Rd @@ -7,7 +7,8 @@ \alias{ab_reset_session} \title{Transform Input to an Antibiotic ID} \usage{ -as.ab(x, flag_multiple_results = TRUE, info = interactive(), ...) +as.ab(x, flag_multiple_results = TRUE, language = get_AMR_locale(), + info = interactive(), ...) is.ab(x) @@ -18,6 +19,8 @@ ab_reset_session() \item{flag_multiple_results}{a \link{logical} to indicate whether a note should be printed to the console that probably more than one antibiotic drug code or name can be retrieved from a single input value.} +\item{language}{language to coerce input values from any of the 20 supported languages - default to the system language if supported (see \code{\link[=get_AMR_locale]{get_AMR_locale()}})} + \item{info}{a \link{logical} to indicate whether a progress bar should be printed - the default is \code{TRUE} only in interactive mode} \item{...}{arguments passed on to internal functions} @@ -74,7 +77,6 @@ as.ab("J01FA01") as.ab("J 01 FA 01") as.ab("Erythromycin") as.ab("eryt") -as.ab(" eryt 123") as.ab("ERYT") as.ab("ERY") as.ab("eritromicine") # spelled wrong, yet works diff --git a/tests/testthat/test-ab.R b/tests/testthat/test-ab.R index 0a3a40eb7..e4dbb58ff 100755 --- a/tests/testthat/test-ab.R +++ b/tests/testthat/test-ab.R @@ -27,20 +27,21 @@ # how to conduct AMR data analysis: https://msberends.github.io/AMR/ # # ==================================================================== # +ab_reset_session() + expect_equal( as.character(as.ab(c( "J01FA01", "J 01 FA 01", "Erythromycin", "eryt", - " eryt 123", "ERYT", "ERY", "erytromicine", "Erythrocin", "Romycin" ))), - rep("ERY", 10) + rep("ERY", 9) ) expect_identical(class(as.ab("amox")), c("ab", "character")) @@ -49,7 +50,7 @@ expect_true(is.ab(as.ab("amox"))) expect_stdout(print(as.ab("amox"))) expect_stdout(print(data.frame(a = as.ab("amox")))) -# expect_warning(as.ab("J00AA00")) # ATC not yet available in data set +expect_warning(as.ab("J00AA00")) # ATC not yet available in data set # expect_warning(as.ab("UNKNOWN")) expect_stdout(print(as.ab("amox"))) diff --git a/tests/testthat/test-ab_from_text.R b/tests/testthat/test-ab_from_text.R index 4321941cd..3ae1fc36e 100644 --- a/tests/testthat/test-ab_from_text.R +++ b/tests/testthat/test-ab_from_text.R @@ -27,20 +27,22 @@ # how to conduct AMR data analysis: https://msberends.github.io/AMR/ # # ==================================================================== # +ab_reset_session() + expect_identical( - ab_from_text("28/03/2020 regular amoxicilliin 500mg po tds")[[1]], + ab_from_text("28/03/2020 amoxicilliin 500mg po tds")[[1]], as.ab("Amoxicillin") ) expect_identical( - ab_from_text("28/03/2020 regular amoxicilliin 500mg po tds", thorough_search = TRUE)[[1]], + ab_from_text("28/03/2020 amoxicilliin 500mg po tds", thorough_search = TRUE)[[1]], as.ab("Amoxicillin") ) expect_identical( - ab_from_text("28/03/2020 regular amoxicilliin 500mg po tds", thorough_search = FALSE)[[1]], + ab_from_text("28/03/2020 amoxicilliin 500mg po tds", thorough_search = FALSE)[[1]], as.ab("Amoxicillin") ) expect_identical( - ab_from_text("28/03/2020 regular amoxicilliin 500mg po tds", translate_ab = TRUE)[[1]], + ab_from_text("28/03/2020 amoxicilliin 500mg po tds", translate_ab = TRUE)[[1]], "Amoxicillin" ) expect_identical( @@ -49,10 +51,10 @@ expect_identical( ) expect_identical( - ab_from_text("28/03/2020 regular amoxicilliin 500mg po tds", type = "dose")[[1]], + ab_from_text("28/03/2020 amoxicilliin 500mg po tds", type = "dose")[[1]], 500 ) expect_identical( - ab_from_text("28/03/2020 regular amoxicilliin 500mg po tds", type = "admin")[[1]], + ab_from_text("28/03/2020 amoxicilliin 500mg po tds", type = "admin")[[1]], "oral" ) diff --git a/tests/testthat/test-ab_property.R b/tests/testthat/test-ab_property.R index a4ba1718e..0105af624 100644 --- a/tests/testthat/test-ab_property.R +++ b/tests/testthat/test-ab_property.R @@ -27,6 +27,8 @@ # how to conduct AMR data analysis: https://msberends.github.io/AMR/ # # ==================================================================== # +ab_reset_session() + expect_identical(ab_name("AMX", language = NULL), "Amoxicillin") expect_identical(ab_atc("AMX"), "J01CA04") expect_identical(ab_cid("AMX"), as.integer(33613)) @@ -94,3 +96,4 @@ if (AMR:::pkg_is_available("dplyr", min_version = "1.0.0", also_load = TRUE)) { set_ab_names(NIT:VAN) %>% colnames()))) } +