mirror of
https://github.com/msberends/AMR.git
synced 2026-05-31 19:01:42 +02:00
Fix parallel WISCA returning all NA; strengthen tests; add sequential hint
Bug: lapply() over a factor yields length-1 factor elements (integer codes), while for() over a factor yields character strings. The job list stored j\$group as a factor integer, but the reassembly loop compared it with identical(j\$group, g) where g was character -- always FALSE, so no simulation chunks were ever assembled and coverage stayed NA throughout. Fix: convert unique_groups to character before building jobs so both the job list and the reassembly loop use the same type. Tests: replaced na.rm = TRUE guards with explicit anyNA() checks so the test suite would have caught the all-NA result immediately. Also adds a sequential-mode performance hint (analogous to sir.R lines 1116-1127) when simulations >= 500 and >= 3 regimens. https://claude.ai/code/session_01FC43syPbzhGmKgrrVNHjnF
This commit is contained in:
@@ -746,7 +746,7 @@ antibiogram.default <- function(x,
|
||||
c(1 - conf_interval, 1)
|
||||
}
|
||||
|
||||
unique_groups <- unique(wisca_parameters$group)
|
||||
unique_groups <- as.character(unique(wisca_parameters$group))
|
||||
|
||||
use_parallel_wisca <- isTRUE(parallel) && n_workers > 1L && length(unique_groups) > 0L
|
||||
|
||||
@@ -815,6 +815,17 @@ antibiogram.default <- function(x,
|
||||
out_wisca$upper_ci[out_wisca$group == group] <- ci_vals[2]
|
||||
}
|
||||
close(progress)
|
||||
if (isTRUE(info) && simulations >= 500 && length(unique_groups) >= 3) {
|
||||
suggest <- ifelse(.Platform$OS.type == "windows" || in_rstudio(),
|
||||
"plan(multisession)",
|
||||
"plan(multicore)"
|
||||
)
|
||||
if (requireNamespace("future.apply", quietly = TRUE)) {
|
||||
message_("Running in sequential mode. To speed up WISCA, set a parallel {.help [{.fun future::plan}](future::plan)} such as {.code ", suggest, "} and use {.code parallel = TRUE}.")
|
||||
} else {
|
||||
message_("Running in sequential mode. To speed up WISCA, install the {.pkg future.apply} package and then set {.code parallel = TRUE}.")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# final output preparation
|
||||
|
||||
@@ -152,11 +152,14 @@ test_that("test-antibiogram.R", {
|
||||
expect_equal(colnames(wisca_par), colnames(wisca_seq))
|
||||
expect_true(isTRUE(attributes(wisca_par)$wisca))
|
||||
|
||||
# 2. coverage values fall within [0, 100] (basic sanity)
|
||||
# 2. coverage values are non-NA and fall within [0, 1]
|
||||
ln <- attributes(wisca_par)$long_numeric
|
||||
expect_true(all(ln$coverage >= 0 & ln$coverage <= 1, na.rm = TRUE))
|
||||
expect_true(all(ln$lower_ci <= ln$coverage, na.rm = TRUE))
|
||||
expect_true(all(ln$upper_ci >= ln$coverage, na.rm = TRUE))
|
||||
expect_false(anyNA(ln$coverage))
|
||||
expect_false(anyNA(ln$lower_ci))
|
||||
expect_false(anyNA(ln$upper_ci))
|
||||
expect_true(all(ln$coverage >= 0 & ln$coverage <= 1))
|
||||
expect_true(all(ln$lower_ci <= ln$coverage))
|
||||
expect_true(all(ln$upper_ci >= ln$coverage))
|
||||
|
||||
# 3. a second parallel run gives the same column names
|
||||
wisca_par2 <- suppressWarnings(suppressMessages(
|
||||
|
||||
Reference in New Issue
Block a user