diff --git a/DESCRIPTION b/DESCRIPTION index 677f374..167778e 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -20,9 +20,9 @@ Depends: Imports: butcher (>= 0.1.3), cli, - doFuture, dplyr (>= 1.1.0), foreach, + furrr, future, generics, ggplot2, diff --git a/NEWS.md b/NEWS.md index 04ee603..565cd2d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -6,6 +6,10 @@ * Added missing commas and addressed formatting issues throughout the vignettes and articles. Backticks for package names were removed and missing parentheses for functions were added (@Joscelinrocha, #218). * Increased the minimum R version to R 4.1. + +* Transitioned support for parallel processing fully to the + [future](https://www.futureverse.org/) framework. Parallelism backends + registered with foreach will be ignored with a warning (#234). # stacks 1.0.5 diff --git a/R/fit_members.R b/R/fit_members.R index 707f595..700a0fb 100644 --- a/R/fit_members.R +++ b/R/fit_members.R @@ -129,32 +129,20 @@ fit_members <- function(model_stack, ...) { ) } - if (foreach::getDoParWorkers() > 1 || future::nbrOfWorkers() > 1) { - `%do_op%` <- switch( - # note some backends can return +Inf - min(future::nbrOfWorkers(), 2), - foreach::`%dopar%`, - doFuture::`%dofuture%` - ) - } else { - `%do_op%` <- foreach::`%do%` + if (uses_foreach_only()) { + warn_foreach_deprecation() } # fit each of them member_fits <- - foreach::foreach( - mem = member_names, - .inorder = FALSE, - .options.future = list(seed = TRUE) - ) %do_op% - { - asNamespace("stacks")$fit_member( - name = mem, - wflows = model_stack[["model_defs"]], - members_map = members_map, - train_dat = dat - ) - } + furrr::future_map( + member_names, + .f = fit_member, + wflows = model_stack[["model_defs"]], + members_map = members_map, + train_dat = dat, + .options = furrr::furrr_options(seed = TRUE) + ) model_stack[["member_fits"]] <- setNames(member_fits, member_names) @@ -269,7 +257,8 @@ check_for_required_packages <- function(x) { purrr::map( pkgs, - function(.x) suppressPackageStartupMessages(requireNamespace(.x, quietly = TRUE)) + function(.x) + suppressPackageStartupMessages(requireNamespace(.x, quietly = TRUE)) ) invisible(TRUE) @@ -290,3 +279,17 @@ error_needs_install <- function(pkgs, installed, call) { is_installed_ <- function(pkg) { rlang::is_installed(pkg) } + +uses_foreach_only <- function() { + future::nbrOfWorkers() == 1 && foreach::getDoParWorkers() > 1 +} + +warn_foreach_deprecation <- function() { + cli::cli_warn(c( + "!" = "{.pkg stacks} detected a parallel backend registered with \\ + foreach but no backend registered with future.", + "i" = "Support for parallel processing with foreach was \\ + deprecated in {.pkg stacks} 1.0.6.", + "i" = "See {.help tune::parallelism} to learn more." + )) +} diff --git a/R/utils.R b/R/utils.R index a35fff1..34b7707 100644 --- a/R/utils.R +++ b/R/utils.R @@ -21,6 +21,7 @@ utils::globalVariables(c( ".metric", ".pred", ".pred_class", + ".sum", "across", "any_of", "as.formula",