我遇到了将要并行运行的流程与创建进度条相结合的问题。
我的流程代码是:
pred_pnn <- function(x, nn){
xlst <- split(x, 1:nrow(x))
pred <- foreach(i = xlst,.packages = c('tcltk', 'foreach'), .combine = rbind)
%dopar%
{ mypb <- tkProgressBar(title = "R progress bar", label = "",
min = 0, max = max(jSeq), initial = 0, width = 300)
foreach(j = jSeq) %do% {Sys.sleep(.1)
setTkProgressBar(mypb, j, title = "pb", label = NULL)
}
library(pnn)
data.frame(prob = guess(nn, as.matrix(i))$probabilities[1], row.names = NULL)
}
}
我合并了我的代码和here
形式的代码但没有编译。我收到了语法错误,但我无法找到它。
我尝试了其他代码:
pred_pnn <- function(x, nn){
xlst <- split(x, 1:nrow(x))
pred <- foreach(i = xlst, .combine = rbind) %dopar%
{library(pnn)
cat(i, '\n')
data.frame(prob = guess(nn, as.matrix(i))$probabilities[1], row.names = NULL)
}
}
但我也有错误。
答案 0 :(得分:3)
您尝试使用的方法可能在某些情况下有效,但它不是一个好的通用解决方案。我想要做的是在主进程中创建一个进度条(在foreach
循环之外),然后在返回任务时让foreach
更新该进度条。不幸的是,没有一个后端支持这一点。使用组合函数技巧可以做到这一点,但前提是你使用支持动态调用组合函数的后端,doParallel
,doSNOW
和doMC
做不。这些后端不会动态调用combine,因为它们是使用clusterApplyLB
和mclapply
等函数实现的,这些函数不支持钩子以允许在返回任务时执行用户提供的代码。 / p>
因为我已经看到对foreach
中的进度条支持感兴趣,我修改了doSNOW
包以添加对特定于doSNOW的“进度”选项的支持,并且我将代码检查到了R中--Forge网站。它使用了snow
包中的一些低级函数,遗憾的是,这些函数不会被parallel
包导出。
如果您想试用这项新功能,则需要从R-Forge安装doSNOW
。我在MacBook Pro上使用以下命令执行此操作:
install.packages("doSNOW", repos="http://R-Forge.R-project.org", type="source")
这是一个简单的示例脚本,演示了实验性的“progess”选项:
library(doSNOW)
library(tcltk)
cl <- makeSOCKcluster(3)
registerDoSNOW(cl)
pb <- tkProgressBar(max=100)
progress <- function(n) setTkProgressBar(pb, n)
opts <- list(progress=progress)
r <- foreach(i=1:100, .options.snow=opts) %dopar% {
Sys.sleep(1)
sqrt(i)
}
更新
现在,CRAN上最新版本的doSNOW提供了progress
选项。