diff --git a/.Rbuildignore b/.Rbuildignore index 5456f34..6743495 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -1,3 +1,5 @@ +^renv$ +^renv\.lock$ ^LICENSE$ ^.ignore$ ^.editorconfig$ diff --git a/DESCRIPTION b/DESCRIPTION index 6120b67..0f3d592 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -27,6 +27,7 @@ Imports: mlr3misc, uuid Suggests: + renv, rpart, testthat Encoding: UTF-8 diff --git a/NEWS.md b/NEWS.md index 367d4d3..d820716 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,8 +4,9 @@ * feat: `reduceResultsBatchmark` gains argument `fun` which is passed on to `batchtools::reduceResultsList`. Useful for deleting model data to avoid running out of memory. Thanks to Toby Dylan Hocking @tdhock for the PR (https://github.com/mlr-org/mlr3batchmark/issues/18). -* docs: A warning is now given when the loaded mlr3 version differs from the mlr3 version stored in the trained learners -* feat: support marshaling +* docs: A warning is now given when the loaded mlr3 version differs from the mlr3 version stored in the trained learners. +* feat: Support marshaling. +* feat: A `renv` project can be passed to `batchmark()` that is loaded in the job environment. # mlr3batchmark 0.1.1 diff --git a/R/batchmark.R b/R/batchmark.R index c86f5fe..ed218f1 100644 --- a/R/batchmark.R +++ b/R/batchmark.R @@ -14,6 +14,9 @@ #' #' @inheritParams mlr3::benchmark #' @param reg [batchtools::ExperimentRegistry]. +#' @param renv_project `character(1)`\cr +#' Path to a renv project. +#' If not `NULL`, the renv project is activated in the job environment. #' #' @return [data.table()] with ids of created jobs (invisibly). #' @export @@ -33,12 +36,15 @@ #' batchtools::submitJobs(reg = reg) #' #' reduceResultsBatchmark(reg = reg) -batchmark = function(design, store_models = FALSE, reg = batchtools::getDefaultRegistry()) { +batchmark = function(design, store_models = FALSE, reg = batchtools::getDefaultRegistry(), renv_project = NULL) { design = as.data.table(assert_data_frame(design, min.rows = 1L)) assert_names(names(design), must.include = c("task", "learner", "resampling")) assert_flag(store_models) - batchtools::assertRegistry(reg, class = "ExperimentRegistry", writeable = TRUE, sync = TRUE, - running.ok = FALSE) + batchtools::assertRegistry(reg, class = "ExperimentRegistry", writeable = TRUE, sync = TRUE, running.ok = FALSE) + if (!is.null(renv_project)) { + require_namespaces("renv") + assert_directory_exists(renv_project) + } assert_list(design$task, "Task") assert_list(design$learner, "Learner") @@ -114,7 +120,8 @@ batchmark = function(design, store_models = FALSE, reg = batchtools::getDefaultR learner_hash = learner_hashes, learner_id = map_chr(tab$learner, "id"), param_values_hash = param_values_hashes, - store_models = store_models + store_models = store_models, + renv_project = renv_project ) ids[[g]] = batchtools::addExperiments( diff --git a/R/worker.R b/R/worker.R index ac9442c..22ee6a6 100644 --- a/R/worker.R +++ b/R/worker.R @@ -1,4 +1,7 @@ -run_learner = function(job, data, learner_hash, param_values_hash, store_models, ...) { +run_learner = function(job, data, learner_hash, param_values_hash, store_models, renv_project = NULL, ...) { + if (!is.null(renv_project)) { + renv::load(renv_project) + } workhorse = utils::getFromNamespace("workhorse", ns = asNamespace("mlr3")) resampling = get(job$prob.pars$resampling_hash, envir = .GlobalEnv) learner = get(learner_hash, envir = .GlobalEnv) diff --git a/man/batchmark.Rd b/man/batchmark.Rd index c818277..14b317a 100644 --- a/man/batchmark.Rd +++ b/man/batchmark.Rd @@ -4,7 +4,12 @@ \alias{batchmark} \title{Benchmark Experiments on Batch Systems} \usage{ -batchmark(design, store_models = FALSE, reg = batchtools::getDefaultRegistry()) +batchmark( + design, + store_models = FALSE, + reg = batchtools::getDefaultRegistry(), + renv_project = NULL +) } \arguments{ \item{design}{(\code{\link[=data.frame]{data.frame()}})\cr @@ -20,6 +25,10 @@ Set to \code{TRUE} if you want to further analyse the models or want to extract information like variable importance.} \item{reg}{\link[batchtools:makeExperimentRegistry]{batchtools::ExperimentRegistry}.} + +\item{renv_project}{\code{character(1)}\cr +Path to a renv project. +If not \code{NULL}, the renv project is activated in the job environment.} } \value{ \code{\link[=data.table]{data.table()}} with ids of created jobs (invisibly). diff --git a/tests/testthat/test_batchmark.R b/tests/testthat/test_batchmark.R index ed7c069..e559d80 100644 --- a/tests/testthat/test_batchmark.R +++ b/tests/testthat/test_batchmark.R @@ -129,3 +129,19 @@ test_that("adding parameter values works", { c(0.5, 1) ) }) + +# test_that("renv_project works", { +# tasks = list(mlr3::tsk("iris"), mlr3::tsk("sonar")) +# learners = list(mlr3::lrn("classif.featureless"), mlr3::lrn("classif.rpart")) +# resamplings = list(mlr3::rsmp("cv", folds = 3), mlr3::rsmp("holdout")) + +# design = mlr3::benchmark_grid( +# tasks = tasks, +# learners = learners, +# resamplings = resamplings +# ) + +# reg = batchtools::makeExperimentRegistry(NA, make.default = FALSE) +# batchmark(design, reg = reg, renv_project = ".") +# batchtools::submitJobs(reg = reg) +# })