编辑:在 doSNOW 包中添加 update 后,使用 %dopar% 时显示漂亮的进度条变得非常简单,并且它适用于 Linux、Windows 和 OS X
doSNOW 现在通过.options.snow 参数正式支持进度条。
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 的解决方案
在 Ubuntu 14.04(64 位)和 OS X(El Capitan)上,如果在 makeCluster 函数中设置了 oufile = "",即使使用 %dopar% 也会显示进度条。它似乎在 Windows 下不起作用。来自makeCluster的帮助:
outfile:将工作人员的 stdout 和 stderr 连接输出定向到何处。 "" 表示没有重定向(这可能只对本地机器上的工作人员有用)。默认为“/dev/null”(Windows 上为“nul:”)。
示例代码:
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 是进度条的样子。这看起来有点奇怪,因为每个进度条都会打印一个新进度条,而且工作人员可能会滞后一点,这会导致进度条偶尔来回走动。