微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 doParallel + foreach

如何解决使用 doParallel + foreach

我正在使用发布 here 的示例代码显示带有 progress_bar + progressdoParallel(来自 foreach 包)。然而,那里的解决方案使用了 doSNow(例如我用于测试的 Dewey brooke 的代码),它比 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(),这里如何使用progress_bar显示doParallel对象?

为方便起见,我将代码粘贴在代码下方(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) 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。