【发布时间】:2021-06-10 17:56:47
【问题描述】:
我正在使用here 发布的示例代码来显示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 不起作用也就不足为奇了,因为这只是我的一个疯狂猜测。
在foreach 循环中包含对pb$tick() 的调用也不起作用,实际上会导致结果错误。所以我真的不知道应该在代码中的哪个位置包含它。
.options.snow 来自哪里? pb$tick()应该去哪里,如何在这里使用doParallel显示progress_bar对象?
为方便起见,我粘贴在代码下方(doSNOW 替换为doParallel),但再次注明original source:
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)
【问题讨论】:
-
你好@elcortegano,你解决过这个问题吗?
-
不,很遗憾。并且还没有找到
doSNOW的替代品来完成这项任务。
标签: r foreach progress-bar doparallel