CRAN Package Check Results for Package nlmixr2est

Last updated on 2026-09-30 01:55:53 CEST.

Flavor Version Tinstall Tcheck Ttotal Status Flags
r-devel-linux-x86_64-debian-clang 7.1.0 0.45 7.63 8.08 ERROR
r-devel-linux-x86_64-debian-gcc 7.1.0 479.24 301.49 780.73 OK
r-devel-linux-x86_64-fedora-clang 7.1.0 420.00 204.60 624.60 ERROR
r-devel-linux-x86_64-fedora-gcc 7.1.0 528.00 277.04 805.04 OK
r-devel-windows-x86_64 7.1.0 654.00 632.00 1286.00 OK
r-patched-linux-x86_64 7.1.0 624.24 405.87 1030.11 OK
r-release-linux-x86_64 7.1.0 609.13 412.87 1022.00 OK
r-release-macos-arm64 7.1.0 114.00 38.00 152.00 OK
r-release-macos-x86_64 7.1.0 408.00 275.00 683.00 OK
r-release-windows-x86_64 7.1.0 644.00 634.00 1278.00 OK
r-oldrel-macos-arm64 7.1.0 113.00 39.00 152.00 OK
r-oldrel-macos-x86_64 7.1.0 406.00 273.00 679.00 OK
r-oldrel-windows-x86_64 7.1.0 840.00 704.00 1544.00 OK

Check Details

Version: 7.1.0
Check: package dependencies
Result: ERROR Package required but not available: 'rxode2' See section ‘The DESCRIPTION file’ in the ‘Writing R Extensions’ manual. Flavor: r-devel-linux-x86_64-debian-clang

Version: 7.1.0
Check: tests
Result: ERROR Running ‘testthat.R’ [21s/25s] Running the tests in ‘tests/testthat.R’ failed. Complete output: > library(testthat) > library(data.table) Attaching package: 'data.table' The following object is masked from 'package:base': %notin% > library(rxode2) rxode2 5.1.7.1 using 2 threads (see ?getRxThreads) no cache: create with `rxCreateCache()` > library(nlmixr2est) Loading required package: nlmixr2data Attaching package: 'nlmixr2est' The following objects are masked from 'package:rxode2': boxCox, yeoJohnson > > # Test thread policy (kept deliberately simple): > # * testthat workers: SERIAL (in-process) on CI or CRAN; everywhere else > # testthat manages Config/testthat/parallel normally. Serial rather than > # a single parallel worker: with 1 worker parallel mode adds nothing but > # the callr message pipe, and that pipe base64-serializes every non-success > # test event -- an *erroring* test whose backtrace inlines a large object > # (any do.call(f, list(<fit/data>)) frame) ships the whole object through > # it at ~18x its size in the orchestrator (measured), and a single >1.5GB > # payload kills the whole run with "Error in gsub: result string is too > # long" (R's 2GB string cap). This is what "the runner has received a > # shutdown signal" / runner-OOM windows+devel failures were. Serial mode > # has no pipe, and streams output so a hung/failing file is identifiable > # from testthat.Rout. > # * rxode2 (and data.table) within-solve threads: capped to 2 on CRAN, per > # CRAN's two-core policy; on CI and locally rxode2 manages its own threads. > # Platforms that only need to prove the package BUILDS and checks (macOS and > # Windows in R-CMD-check.yaml) run the CRAN-visible subset instead of the full > # NOT_CRAN suite. The same `checking tests` step costs ~19 min on an Ubuntu > # runner and ~5h45m on macOS/Windows -- model compilation dominates there -- which > # blew GitHub's hard 6-hour job limit and left those jobs cancelled, i.e. giving > # no signal at all. Ubuntu still runs the full essential subset. > if (isTRUE(as.logical(Sys.getenv("NLMIXR2EST_TEST_CRAN_ONLY", "false")))) { + Sys.setenv("NOT_CRAN" = "false") # nolint + } > > .onCran <- !identical(Sys.getenv("NOT_CRAN"), "true") > .onCI <- isTRUE(as.logical(Sys.getenv("CI", "false"))) > > if (.onCI || .onCran) { + options(Ncpus = 1L) + Sys.setenv(TESTTHAT_CPUS = "1") + Sys.setenv(TESTTHAT_PARALLEL = "FALSE") + } > if (.onCran) { + setRxThreads(2L) + setDTthreads(2L) + } > if (identical(Sys.info()[["sysname"]], "Darwin")) { + rxode2::rxUnloadAll(set = FALSE) + } > > # ------------------------------------------------------------------------- > # CI test partitioning > # > # The full suite takes many hours on a single-worker CI runner, so push/PR > # R-CMD-check runs only the "essential" subset -- every test file EXCEPT the > # slow ones listed in .slowBatches below (still much more than CRAN). > # > # The slow files run separately in the slow-tests workflow, split into > # batches that each stay under ~1h and run one-at-a-time (non-overlapping). > # That workflow sets NLMIXR2EST_TEST_BATCH=<n> to run only batch n's files. > # > # Names are the test file basename with the leading "test-" and trailing > # ".R" removed (what testthat's `filter` matches). When a test file grows > # past a few minutes, move it into one of the batches here. > # ------------------------------------------------------------------------- > # Batches are sized from measured single-worker run times so each stays well > # under an hour; the slow-tests workflow runs them one at a time. > .slowBatches <- list( + # batch 1 + c( + "focei-wang2007-boxcox", + "focei-wang2007-combined", + "vpcSim", + "qrpem-slow", + "focei-foce-plus", + "imp-proposal-slow" + ), + # batch 2 + c( + "focei-wang2007-lognormal", + "cov-analytic", + "focei-wang2007-power", + "cov-condition", + "agq-cov", + "cov-decouple-saimp", + "cov-scope-swap" + ), + # batch 3 + c( + "focei-wang2007-boxcox-half", + "nlm-cens", + "focei-cens-t-fit", + "mtime-fit", + "issue-429", + "issue-470", + "focei-wang2007-bounded", + "saem-loglik", + "mu-timevarying", + "saem-nearpd", + "saem-nonmutheta", + "focei-theta-reset-bounds", + "saem-cov-analytic", + "focei-shi21-bounds", + "splitbolus-interp", + "optexpression-saem-nlme", + "saem-cov-multi-endpoint-904", + "saem-modeled-resid-fit" + ), + + # batches 4-7 -- the former batches 4 (13 files) and 5 (15 files), each split + # in two. Both TIMED OUT on the weekly runner (run 30688874991, 2026-08-01): + # "the runner has received a shutdown signal", exit 143, after ~3h06m of test + # time, so they reported NO assertion results at all. A meaningful slice of + # the suite therefore had no CI signal, which is how a wrong nlm adjoint + # gradient and several stale assertions survived here unnoticed. Each + # focei-wang2007-* file is kept in a separate batch -- one is ~10 error models + # x 6 fits (ODE and solved-form) and dominates whatever batch it lands in. + # batch 4 + c( + "impmap", + "imp-prior", + "matexp", + "mfocei", + "focei-wang2007-yeojohnson", + "nlme", + "focei-fast-grad", + "lincmt-ode-fit", + "focei-lincmt-carry-fit", + "focei-lincmt-carry-fit-fallback", + "focei-lincmt-carry-jump-fit", + "focei-lincmt-carry-ll-fit", + "focei-lincmt-carry-theta-fit" + ), + # batch 5 + c( + "focei-wang2007-boxcox-lnorm", + "nlme-cov", + "agq-fast-grad", + "focei-ll-fast-grad-fit", + "focei-fast-methods-fit", + "odeswap-fit", + "focei-factr-fit", + "focei-reproducible", + "focei-hessian-etastep", + "focei-outer-hessian-fit", + "focei-outer-hessian-nlminb-fit", + "focei-outer-hessian-family", + "focei-outer-hessian-censor" + ), + # batch 6 + c( + "focei-llik", + "iov", + "iov-zero-eta", + "saem-mix", + "saem-mix-regress", + "posthoc", + "ar-est", + "mu-family", + "uninformative-etas-revisit", + "saem-iov-twolevel-fit", + "iov-loglik-1000" + ), + # batch 7 + c( + "mu-plain-fit", + "vae-fit", + "focei-wang2007-basic", + "vae-neonatal", + "vae-errmodel", + "table-cmt", + "vae-covariate-selection" + ), + # batch 8 -- heaviest remaining files on the single-worker CI runner + # (VAE internals + a few slow structural tests), moved out of the essential + # push/PR subset to trim its wall time / reclamation exposure. + c( + "vae-encoder", + "vae-train", + "vae-decoder", + "vae-elbo", + "vae-inner", + "vae-fixbounds", + "vae-parhist", + "vae-iov", + "vae-grad-fit", + "vae-ll-grad-fit", + "vae-l0learn-fit", + "vae-hockey-fit", + "vae-colinear-fit", + "split", + "unary-mu", + "timing", + "bounded-transform" + ), + # batch 9 -- emvi/fbvi (variational inference) multi-iteration fits, plus the + # cross-method omega off-diagonal fit checks (vae/emvi/npag/npb) + c( + "vi-repro", + "vi-focei-agreement", + "vi-neonatal", + "vi-fullrank", + "vi-fullbayes", + "vi-stan", + "omega-offdiag", + "augpred", + "vae-residopt" + ), + # batch 10 -- nonparametric (npag/npb) fit-based validation. These set up the + # FOCEi inner problem and run full NPAG cycles / independent solves, so they are + # much slower than the essential npag unit tests (dispatch/ipm/grid, which stay + # in the push/PR subset) and run weekly only. + c( + "npag-psi", + "npag-cycle", + "npag-fit", + "npb-fit", + "npag-bimodal", + "npag-fixed", + "npag-error-models", + "npag-mixture", + "npag-general-lik", + "npag-muexpand", + "npag-golden", + "lik-contrib-methods", + "npag-npb-cens-978" + ) + ) > .slowAll <- unlist(.slowBatches) > > .batch <- Sys.getenv("NLMIXR2EST_TEST_BATCH") > > .filter <- NULL > if (nzchar(.batch)) { + # Slow-batch mode: run ONLY this batch's slow files. + .b <- suppressWarnings(as.integer(.batch)) + if (is.na(.b) || .b < 1L || .b > length(.slowBatches)) { + stop(sprintf( + "NLMIXR2EST_TEST_BATCH=%s out of range (1..%d)", + .batch, + length(.slowBatches) + )) + } + .files <- .slowBatches[[.b]] + if (length(.files) == 0L) { + .filter <- "^$" # empty batch: match nothing + } else { + .filter <- paste0("^(", paste(.files, collapse = "|"), ")$") + } + } else if (.onCI && !.onCran && length(.slowAll) > 0L) { + # Essential subset on push/PR CI: everything EXCEPT the slow files. + # + # NLMIXR2EST_TEST_SHARD="i/n" splits that subset across n parallel jobs. A + # hosted runner reclaims a long job mid-run ("exit code 143 / The runner has + # received a shutdown signal"), and runner speed varies enormously -- the same + # `checking tests` step measured 27m on one ubuntu-release runner and was still + # going at 4h15m on another before being reclaimed. Sharding keeps every job + # short enough to finish without dropping a single test file. + .shard <- Sys.getenv("NLMIXR2EST_TEST_SHARD") + if (nzchar(.shard)) { + .p <- strsplit(.shard, "/", fixed = TRUE)[[1]] + .i <- suppressWarnings(as.integer(.p[1])) + .n <- suppressWarnings(as.integer(.p[2])) + if (length(.p) != 2L || is.na(.i) || is.na(.n) || .n < 1L || .i < 1L || .i > .n) { + stop(sprintf("NLMIXR2EST_TEST_SHARD=%s must be \"i/n\" with 1 <= i <= n", .shard)) + } + # Deal the files out round-robin over a SORTED list so the split is stable + # across jobs and platforms, and every file lands in exactly one shard. + .all <- sort(sub( + "^test-", + "", + sub( + "\\.R$", + "", + basename(Sys.glob(file.path("testthat", "test-*.R"))) + ) + )) + .ess <- setdiff(.all, .slowAll) + # An empty list would make every shard match nothing and report a green run + # having tested nothing at all -- fail loudly instead. + if (length(.ess) == 0L) { + stop("NLMIXR2EST_TEST_SHARD set but no test files found in ./testthat") + } + .mine <- .ess[seq_along(.ess) %% .n == (.i %% .n)] + .filter <- if (length(.mine) == 0L) { + "^$" + } else { + paste0("^(", paste(.mine, collapse = "|"), ")$") + } + } else { + .filter <- paste0("^(?!(", paste(.slowAll, collapse = "|"), ")$)") + } + } > # Locally (and on CRAN) .filter stays NULL -> run everything. > > # stop_on_failure MUST stay TRUE (the default). It was set to FALSE in > # 4af6a7eba as a debugging aid ("Be more verbose in testthat to track-down > # future seg faults"), and with it R CMD check never errors on a test failure > # -- so `checking tests` passed no matter what. The run on main at 722e5775 > # reported SUCCESS while its three shards printed FAIL 8, FAIL 2 and FAIL 3; > # thirteen real failures had reached main with a green badge the whole way. > # If a segfault ever needs that verbosity again, set it for the one run > # (R_TESTTHAT_... / an env guard), never in the committed harness. > test_check("nlmixr2est", filter = .filter, perl = TRUE) [skip] CRAN: not computing fixture fit: one.compartment.fit.saem [skip] CRAN: not computing fixture fit: one.compartment.fit.saem.cwres [skip] CRAN: not computing fixture fit: one.compartment.fit.focei [skip] CRAN: not computing fixture fit: one.compartment.fit.focei.fast [skip] CRAN: not computing fixture fit: one.compartment.fit.foce [skip] CRAN: not computing fixture fit: one.compartment.fit.foi [skip] CRAN: not computing fixture fit: one.compartment.fit.fo [skip] CRAN: not computing fixture fit: one.compartment.fit.posthoc [skip] CRAN: not computing fixture fit: one.compartment.with.lag.fit.focei [skip] CRAN: not computing fixture fit: one.compartment.with.lag.fit.saem [ok] Helper-fits.R loaded successfully Cache version: v1.0.2-nlmixr2est-7.1.0- Cache directory: ./fixtures > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done [====|====|====|====|====|====|====|====|====|====] 0:00:00 > calculate sensitivities [====|====|====|====|====|====|====|====|====|====] 0:00:00 > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > calculate d(f)/d(eta) [====|====|====|====|====|====|====|====|====|====] 0:00:00 > calculate d(R^2)/d(eta) [====|====|====|====|====|====|====|====|====|====] 0:00:00 > finding duplicate expressions in inner model... > finding duplicate expressions in EBE model... > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > calculate d(f)/d(eta) [====|====|====|====|====|====|====|====|====|====] 0:00:00 > calculate d(R^2)/d(eta) [====|====|====|====|====|====|====|====|====|====] 0:00:00 > finding duplicate expressions in inner model... > finding duplicate expressions in EBE model... > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > calculate d(f)/d(eta) [====|====|====|====|====|====|====|====|====|====] 0:00:00 > calculate d(R^2)/d(eta) [====|====|====|====|====|====|====|====|====|====] 0:00:00 > finding duplicate expressions in inner model... > finding duplicate expressions in EBE model... > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > calculate d(f)/d(eta) [====|====|====|====|====|====|====|====|====|====] 0:00:00 > calculate d(R^2)/d(eta) [====|====|====|====|====|====|====|====|====|====] 0:00:00 > finding duplicate expressions in inner model... > finding duplicate expressions in EBE model... > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > calculate d(f)/d(eta) [====|====|====|====|====|====|====|====|====|====] 0:00:00 > calculate d(R^2)/d(eta) [====|====|====|====|====|====|====|====|====|====] 0:00:00 > finding duplicate expressions in inner model... > finding duplicate expressions in EBE model... > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > calculate d(f)/d(eta) [====|====|====|====|====|====|====|====|====|====] 0:00:00 > calculate d(R^2)/d(eta) [====|====|====|====|====|====|====|====|====|====] 0:00:00 > finding duplicate expressions in inner model... > finding duplicate expressions in EBE model... > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > calculate d(f)/d(eta) [====|====|====|====|====|====|====|====|====|====] 0:00:00 > calculate d(R^2)/d(eta) [====|====|====|====|====|====|====|====|====|====] 0:00:00 > finding duplicate expressions in inner model... > finding duplicate expressions in EBE model... > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > calculate d(f)/d(eta) [====|====|====|====|====|====|====|====|====|====] 0:00:00 > calculate d(R^2)/d(eta) [====|====|====|====|====|====|====|====|====|====] 0:00:00 > finding duplicate expressions in inner model... > finding duplicate expressions in EBE model... > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > calculate d(f)/d(eta) [====|====|====|====|====|====|====|====|====|====] 0:00:00 > calculate d(R^2)/d(eta) [====|====|====|====|====|====|====|====|====|====] 0:00:00 > finding duplicate expressions in inner model... > finding duplicate expressions in EBE model... > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > calculate d(f)/d(eta) [====|====|====|====|====|====|====|====|====|====] 0:00:00 > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done > loading into symengine environment... > pruning branches (`if`/`else`) of full model... v done *** caught segfault *** address 0x4, cause 'memory not mapped' tracked pnodes Traceback: 1: .rxOptExprC(.norm) 2: rxOptExpr(.txt, msg = msg, chunkLines = 0L) 3: .rxOptExprChunked(x, msg = msg, chunkLines = .chunkLines, parallel = parallel) 4: rxode2::rxOptExpr(.s$..inner, ifelse(.getRxPredLlikOption(), "inner llik model", "inner model"), parallel = cores) 5: .rxFinalizeInner(.s, .sumProd, .optExpression, .cores) 6: rxUiGet.foceiEnv(.obj) 7: rxUiGet(.obj) 8: `$.rxUi`(.carryUiJump(), foceiEnv) 9: .carryUiJump()$foceiEnv 10: withCallingHandlers(expr, message = function(c) if (inherits(c, classes)) tryInvokeRestart("muffleMessage")) 11: suppressMessages(.carryUiJump()$foceiEnv) 12: eval(code, test_env) 13: eval(code, test_env) 14: withCallingHandlers({ eval(code, test_env) new_expectations <- the$test_expectations > starting_expectations if (snapshot_skipped) { skip("On CRAN") } else if (!new_expectations && skip_on_empty) { skip_empty() }}, expectation = handle_expectation, packageNotFoundError = function(e) { if (on_cran()) { skip(paste0("{", e$package, "} is not installed.")) }}, snapshot_on_cran = function(cnd) { snapshot_skipped <<- TRUE invokeRestart("muffle_cran_snapshot")}, skip = handle_skip, warning = handle_warning, message = handle_message, error = handle_error, interrupt = handle_interrupt) 15: doTryCatch(return(expr), name, parentenv, handler) 16: tryCatchOne(expr, names, parentenv, handlers[[1L]]) 17: tryCatchList(expr, classes, parentenv, handlers) 18: tryCatch(withCallingHandlers({ eval(code, test_env) new_expectations <- the$test_expectations > starting_expectations if (snapshot_skipped) { skip("On CRAN") } else if (!new_expectations && skip_on_empty) { skip_empty() }}, expectation = handle_expectation, packageNotFoundError = function(e) { if (on_cran()) { skip(paste0("{", e$package, "} is not installed.")) }}, snapshot_on_cran = function(cnd) { snapshot_skipped <<- TRUE invokeRestart("muffle_cran_snapshot")}, skip = handle_skip, warning = handle_warning, message = handle_message, error = handle_error, interrupt = handle_interrupt), error = handle_fatal) 19: doWithOneRestart(return(expr), restart) 20: withOneRestart(expr, restarts[[1L]]) 21: withRestarts(tryCatch(withCallingHandlers({ eval(code, test_env) new_expectations <- the$test_expectations > starting_expectations if (snapshot_skipped) { skip("On CRAN") } else if (!new_expectations && skip_on_empty) { skip_empty() }}, expectation = handle_expectation, packageNotFoundError = function(e) { if (on_cran()) { skip(paste0("{", e$package, "} is not installed.")) }}, snapshot_on_cran = function(cnd) { snapshot_skipped <<- TRUE invokeRestart("muffle_cran_snapshot")}, skip = handle_skip, warning = handle_warning, message = handle_message, error = handle_error, interrupt = handle_interrupt), error = handle_fatal), end_test = function() { }) 22: test_code(code, parent.frame()) 23: test_that("the jump block is emitted with the pin, amounts/lag trackers and indicators", { skip_if_not(.carryJumpCapable()) txt <- suppressMessages(.carryUiJump()$foceiEnv)$..inner expect_true(grepl(", -8, 0,", txt, fixed = TRUE)) expect_true(grepl("rx_lcCarryPin_~", txt, fixed = TRUE)) expect_true(grepl("rx_lcCarryD0_~(rx_lcCarryA0_-rx_lcCarryPA0_)", txt, fixed = TRUE)) expect_true(grepl("rx_lcCarryDel_~ifelse(", txt, fixed = TRUE)) expect_true(grepl("rx_lcCarryKP1_~", txt, fixed = TRUE)) expect_true(grepl("rx_lcCarryUA0_~", txt, fixed = TRUE)) expect_true(grepl("rx_lcCarryUL0_~", txt, fixed = TRUE)) expect_equal(lengths(regmatches(txt, gregexpr("rx_lcCarryAdv_~", txt))), 1L) expect_true(grepl("rx__sens_rx_pred__BY_ETA_2___=rx_lcCarryS1r1_/", txt)) expect_true(grepl("rx__sens_rx_pred__BY_ETA_3___=rx_lcCarryS2r1_/", txt)) }) 24: eval(code, test_env) 25: eval(code, test_env) 26: withCallingHandlers({ eval(code, test_env) new_expectations <- the$test_expectations > starting_expectations if (snapshot_skipped) { skip("On CRAN") } else if (!new_expectations && skip_on_empty) { skip_empty() }}, expectation = handle_expectation, packageNotFoundError = function(e) { if (on_cran()) { skip(paste0("{", e$package, "} is not installed.")) }}, snapshot_on_cran = function(cnd) { snapshot_skipped <<- TRUE invokeRestart("muffle_cran_snapshot")}, skip = handle_skip, warning = handle_warning, message = handle_message, error = handle_error, interrupt = handle_interrupt) 27: doTryCatch(return(expr), name, parentenv, handler) 28: tryCatchOne(expr, names, parentenv, handlers[[1L]]) 29: tryCatchList(expr, classes, parentenv, handlers) 30: tryCatch(withCallingHandlers({ eval(code, test_env) new_expectations <- the$test_expectations > starting_expectations if (snapshot_skipped) { skip("On CRAN") } else if (!new_expectations && skip_on_empty) { skip_empty() }}, expectation = handle_expectation, packageNotFoundError = function(e) { if (on_cran()) { skip(paste0("{", e$package, "} is not installed.")) }}, snapshot_on_cran = function(cnd) { snapshot_skipped <<- TRUE invokeRestart("muffle_cran_snapshot")}, skip = handle_skip, warning = handle_warning, message = handle_message, error = handle_error, interrupt = handle_interrupt), error = handle_fatal) 31: doWithOneRestart(return(expr), restart) 32: withOneRestart(expr, restarts[[1L]]) 33: withRestarts(tryCatch(withCallingHandlers({ eval(code, test_env) new_expectations <- the$test_expectations > starting_expectations if (snapshot_skipped) { skip("On CRAN") } else if (!new_expectations && skip_on_empty) { skip_empty() }}, expectation = handle_expectation, packageNotFoundError = function(e) { if (on_cran()) { skip(paste0("{", e$package, "} is not installed.")) }}, snapshot_on_cran = function(cnd) { snapshot_skipped <<- TRUE invokeRestart("muffle_cran_snapshot")}, skip = handle_skip, warning = handle_warning, message = handle_message, error = handle_error, interrupt = handle_interrupt), error = handle_fatal), end_test = function() { }) 34: test_code(code = exprs, env = env, reporter = get_reporter() %||% StopReporter$new()) 35: source_file(path, env = env(env), desc = desc, shuffle = shuffle, error_call = error_call) 36: FUN(X[[i]], ...) 37: lapply(test_paths, test_one_file, env = env, desc = desc, shuffle = shuffle, error_call = error_call) 38: doTryCatch(return(expr), name, parentenv, handler) 39: tryCatchOne(expr, names, parentenv, handlers[[1L]]) 40: tryCatchList(expr, classes, parentenv, handlers) 41: tryCatch(code, testthat_abort_reporter = function(cnd) { cat(conditionMessage(cnd), "\n") NULL}) 42: with_reporter(reporters$multi, lapply(test_paths, test_one_file, env = env, desc = desc, shuffle = shuffle, error_call = error_call)) 43: test_files_serial(test_dir = test_dir, test_package = test_package, test_paths = test_paths, load_helpers = load_helpers, reporter = reporter, env = env, stop_on_failure = stop_on_failure, stop_on_warning = stop_on_warning, desc = desc, load_package = load_package, shuffle = shuffle, error_call = error_call) 44: test_files(test_dir = path, test_paths = test_paths, test_package = package, reporter = reporter, load_helpers = load_helpers, env = env, stop_on_failure = stop_on_failure, stop_on_warning = stop_on_warning, load_package = load_package, parallel = parallel, shuffle = shuffle) 45: test_dir("testthat", package = package, reporter = reporter, ..., load_package = "installed") 46: test_check("nlmixr2est", filter = .filter, perl = TRUE) An irrecoverable exception occurred. R is aborting now ... Flavor: r-devel-linux-x86_64-fedora-clang