首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中使用"foreach()“函数时,如何创建进度条?

在R中使用"foreach()“函数时,如何创建进度条?
EN

Stack Overflow用户
提问于 2011-03-25 02:30:50
回答 7查看 31.7K关注 0票数 53

有一些关于如何在R程序中为循环创建计数器的信息文章。但是,在使用带有"foreach()“的并行化版本时,如何创建类似的函数?

EN

回答 7

Stack Overflow用户

发布于 2014-10-23 08:52:40

Linux :在 to doSNOW包之后,当使用 %dopar% 时,显示一个漂亮的进度条变得非常简单,它可以在,Windows和OS X上运行

doSNOW现在通过.options.snow参数正式支持进度条。

代码语言:javascript
复制
library(doSNOW)
cl <- makeCluster(2)
registerDoSNOW(cl)
iterations <- 100
pb <- txtProgressBar(max = iterations, style = 3)
progress <- function(n) setTxtProgressBar(pb, n)
opts <- list(progress = progress)
result <- foreach(i = 1:iterations, .combine = rbind, 
                  .options.snow = opts) %dopar%
{
    s <- summary(rnorm(1e6))[3]
    return(s)
}
close(pb)
stopCluster(cl) 

还有另一种跟踪进度的方法,如果您牢记迭代的总次数,则设置.verbose = T,因为这将向控制台打印已完成的迭代。

针对Linux和OS X以前的解决方案

在Ubuntu14.04 (64位)和OS (El Capitan)上,如果在makeCluster函数中设置了oufile = "",即使使用%dopar%也会显示进度条。它似乎不能在Windows下工作。从有关makeCluster的帮助

outfile:从工作进程定向stdout和stderr连接输出的位置。"“指示无重定向(这可能仅对本地计算机上的工作进程有用)。默认为‘/dev/null’(在Windows上为‘nul:’)。

示例代码:

代码语言:javascript
复制
library(foreach)
library(doSNOW)
cl <- makeCluster(4, outfile="") # number of cores. Notice 'outfile'
registerDoSNOW(cl)
iterations <- 100
pb <- txtProgressBar(min = 1, max = iterations, style = 3)
result <- foreach(i = 1:iterations, .combine = rbind) %dopar% 
{
      s <- summary(rnorm(1e6))[3]
      setTxtProgressBar(pb, i) 
      return(s)
}
close(pb)
stopCluster(cl) 

This是进度条的外观。它看起来有点奇怪,因为每次进度条都会打印一个新的条,而且工人可能会有一点滞后,这会导致进度条偶尔来回移动。

票数 55
EN

Stack Overflow用户

发布于 2012-06-11 22:52:38

此代码是doRedis example的修改版本,即使在使用具有并行后端的%dopar%时也会出现进度条:

代码语言:javascript
复制
#Load Libraries
library(foreach)
library(utils)
library(iterators)
library(doParallel)
library(snow)

#Choose number of iterations
n <- 1000

#Progress combine function
f <- function(){
  pb <- txtProgressBar(min=1, max=n-1,style=3)
  count <- 0
  function(...) {
    count <<- count + length(list(...)) - 1
    setTxtProgressBar(pb,count)
    Sys.sleep(0.01)
    flush.console()
    c(...)
  }
}

#Start a cluster
cl <- makeCluster(4, type='SOCK')
registerDoParallel(cl)

# Run the loop in parallel
k <- foreach(i = icount(n), .final=sum, .combine=f()) %dopar% {
  log2(i)
}

head(k)

#Stop the cluster
stopCluster(cl)

你必须提前知道迭代次数和组合函数。

票数 10
EN

Stack Overflow用户

发布于 2016-02-11 09:27:02

现在,使用parallel包可以做到这一点。在使用"PSOCK"-type集群的RStudio内部运行的OSX10.11上使用R 3.2.3进行了测试。

代码语言:javascript
复制
library(doParallel)

# default cluster type on my machine is "PSOCK", YMMV with other types
cl <- parallel::makeCluster(4, outfile = "")
registerDoParallel(cl)

n <- 10000
pb <- txtProgressBar(0, n, style = 2)

invisible(foreach(i = icount(n)) %dopar% {
    setTxtProgressBar(pb, i)
})

stopCluster(cl)

奇怪的是,它只有在style = 3中才能正确显示。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5423760

复制
相关文章

相似问题

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