首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用progress_bar + foreach显示progress_bar

用progress_bar + foreach显示progress_bar
EN

Stack Overflow用户
提问于 2021-03-12 17:34:32
回答 1查看 812关注 0票数 3

我使用发布的示例代码这里来显示progress_bar (来自progress包)和doParallel + foreach。然而,那里的解决方案使用的是doSNOW (例如我用来测试的杜威布鲁克的代码),它比doParallel更过时,在构建带有CRAN标志的包时会返回此说明:

使用取代的包:‘doSNOW (>= 1.0.19)’

改变这一点似乎不像预期的那样简单。如果只有registerDoSNOWregisterDoParallel替换,.options.snow.options.doparallel替换,代码就会运行,但在第二种情况下,根本不会显示任何进度条。

我认为这可能与.options.X的使用有关。代码的这一部分对我来说非常模糊,因为.options.snow在使用doSNOW时确实有效,但是没有关于使用这个参数的foreach手册页面的文档。因此,.options.doparallel不起作用也就不足为奇了,因为这只是我的猜测而已。

pb$tick()循环中包含对foreach的调用也不起作用,实际上会导致结果出错。所以我实在想不出我应该把它写在代码的什么地方了。

.options.snow从哪里来?pb$tick()应该去哪里,如何在这里显示使用doParallelprogress_bar对象?

为了方便起见,我将代码(doSNOW改为doParallel)粘贴到下面,但再次记在原始源

代码语言:javascript
复制
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) 
EN

回答 1

Stack Overflow用户

发布于 2021-10-28 08:51:34

doParallel仍然以任何理由使用.options.snow参数。在doParallel文档里发现了这个小玩意。

doParallel后端支持通过foreach函数传递的多核和雪选项。受支持的多核选项是第1 prescheduleset.seedsilentcores,它们类似于mclapply的类似名称的参数,并使用.options.multicore参数进行了传递。支持的雪选项是preschedule (与其多核模拟一样),它可以用于对任务进行块块处理,以便每个工作人员都能得到预先设置的任务块;attachExportEnv (在某些情况下,在R的词法作用域无法找到所需的导出时)可以用于附加导出环境。使用.options.snow参数传递雪选项以进行预测。

foreach是一个强大的软件包,但是不管是谁维护它,都会做出奇怪的决定。

编辑

doParallel不支持progress多核选项。因此,如果使用的是而不是registerDoSNOW,进度条registerDoParallel将不会显示registerDoSNOW

虽然doSNOW已经被取代,但还不清楚其中一个是否比另一个更过时,因为两者都经历了很少的更改,或者是更新了当前的维护者(doParallel \\ doSNOW)。

doSNOW

代码语言:javascript
复制
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

代码语言:javascript
复制
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)
...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66604588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档