我使用发布的示例代码这里来显示progress_bar (来自progress包)和doParallel + foreach。然而,那里的解决方案使用的是doSNOW (例如我用来测试的杜威布鲁克的代码),它比doParallel更过时,在构建带有CRAN标志的包时会返回此说明:
使用取代的包:‘doSNOW (>= 1.0.19)’
改变这一点似乎不像预期的那样简单。如果只有registerDoSNOW被registerDoParallel替换,.options.snow被.options.doparallel替换,代码就会运行,但在第二种情况下,根本不会显示任何进度条。
我认为这可能与.options.X的使用有关。代码的这一部分对我来说非常模糊,因为.options.snow在使用doSNOW时确实有效,但是没有关于使用这个参数的foreach手册页面的文档。因此,.options.doparallel不起作用也就不足为奇了,因为这只是我的猜测而已。
在pb$tick()循环中包含对foreach的调用也不起作用,实际上会导致结果出错。所以我实在想不出我应该把它写在代码的什么地方了。
.options.snow从哪里来?pb$tick()应该去哪里,如何在这里显示使用doParallel的progress_bar对象?
为了方便起见,我将代码(doSNOW改为doParallel)粘贴到下面,但再次记在原始源上
library(parallel)
library(doParallel)
numCores<-detectCores()
cl <- makeCluster(numCores)
registerDoParallel(cl)
# progress bar ------------------------------------------------------------
library(progress)
iterations <- 100 # used for the foreach loop
pb <- progress_bar$new(
format = "letter = :letter [:bar] :elapsed | eta: :eta",
total = iterations, # 100
width = 60)
progress_letter <- rep(LETTERS[1:10], 10) # token reported in progress bar
# allowing progress bar to be used in foreach -----------------------------
progress <- function(n){
pb$tick(tokens = list(letter = progress_letter[n]))
}
opts <- list(progress = progress)
# foreach loop ------------------------------------------------------------
library(foreach)
foreach(i = 1:iterations, .combine = rbind, .options.doparallel = opts) %dopar% {
summary(rnorm(1e6))[3]
}
stopCluster(cl) 发布于 2021-10-28 08:51:34
doParallel仍然以任何理由使用.options.snow参数。在doParallel文档里发现了这个小玩意。
doParallel后端支持通过foreach函数传递的多核和雪选项。受支持的多核选项是第1
preschedule、set.seed、silent和cores,它们类似于mclapply的类似名称的参数,并使用.options.multicore参数进行了传递。支持的雪选项是preschedule(与其多核模拟一样),它可以用于对任务进行块块处理,以便每个工作人员都能得到预先设置的任务块;attachExportEnv(在某些情况下,在R的词法作用域无法找到所需的导出时)可以用于附加导出环境。使用.options.snow参数传递雪选项以进行预测。
foreach是一个强大的软件包,但是不管是谁维护它,都会做出奇怪的决定。
编辑
doParallel不支持progress多核选项。因此,如果使用的是而不是registerDoSNOW,进度条registerDoParallel将不会显示registerDoSNOW。
虽然doSNOW已经被取代,但还不清楚其中一个是否比另一个更过时,因为两者都经历了很少的更改,或者是更新了当前的维护者(doParallel \\ doSNOW)。
doSNOW
doSNOW:::doSNOW <- function (obj, expr, envir, data)
{
cl <- data
preschedule <- FALSE
attachExportEnv <- FALSE
progressWrapper <- function(...) NULL # <- CRITICAL DIFFERENCE
if (!inherits(obj, "foreach"))
stop("obj must be a foreach object")
it <- iter(obj)
accumulator <- makeAccum(it)
options <- obj$options$snow
if (!is.null(options)) {
nms <- names(options)
recog <- nms %in% c("preschedule", "attachExportEnv",
"progress") # <- CRITICAL DIFFERENCE
if (any(!recog))
warning(sprintf("ignoring unrecognized snow option(s): %s",
paste(nms[!recog], collapse = ", ")), call. = FALSE)
...doParallel
doParallel:::doParallelSNOW <- function (obj, expr, envir, data)
{
cl <- data
preschedule <- FALSE
attachExportEnv <- FALSE
# MISSING: progressWrapper <- function(...) NULL
if (!inherits(obj, "foreach"))
stop("obj must be a foreach object")
it <- iter(obj)
accumulator <- makeAccum(it)
options <- obj$options$snow
if (!is.null(options)) {
nms <- names(options)
recog <- nms %in% c("preschedule", "attachExportEnv" #MISSING , "progress")
if (any(!recog))
warning(sprintf("ignoring unrecognized snow option(s): %s",
paste(nms[!recog], collapse = ", ")), call. = FALSE)
...https://stackoverflow.com/questions/66604588
复制相似问题