【发布时间】:2014-10-29 17:11:15
【问题描述】:
如果我创建一个简单的模型,foreach 会以我认为应该的方式返回每个结果:
m=function(i,j){data.frame(i=i,j=j)}
> foreach(i=1:2, .combine='rbind') %:% foreach(j=1:2, .combine='rbind') %dopar%{
+ m(i,j)
+ }
i j
1 1 1
2 1 2
3 2 1
4 2 2
但是使用更复杂的函数会错过第一个循环:
# Loop through the prediction model (in parallel) with different parameters
results = foreach(i=1:2, .combine='rbind') %:% foreach(j=1:2, .combine='rbind') %dopar%{
model(i,j)
}
> results
i j tpr fpr rj day
1 1 2 0 0.2127812 1.022387 Wed Oct 29 11:53:45 2014
2 2 1 0 0.2161888 1.023102 Wed Oct 29 11:54:41 2014
3 2 2 0 0.2127812 1.022387 Wed Oct 29 11:53:45 2014
您可能会认为该函数在 i=1,j=1 时会产生错误,但在 foreach 循环之外运行该函数会得到很好的结果:
> model(1,1)
i j tpr fpr rj day
1 1 1 0 0.2161888 1.023102 Wed Oct 29 12:30:31 2014
所以我假设我错误地设置了 foreach 迭代器。希望这个问题对你来说比我更明显。
编辑: 如果将 %dopar% 替换为 %do%,它也可以工作。当然,这种解决方案违背了使用 foreach 的目的。
【问题讨论】:
-
一个最小的可重现示例会很好地帮助您调试。没有它,而且不知道
model(i,j)是如何定义的,很难说问题出在哪里。 -
我无法用通用数据重现问题。而且,事实上,重新连接到服务器似乎已经解决了这个问题。 (尽管它可能会在将来再次出现。)我怀疑存在内存不足错误,尽管从详细输出中并不明显。
-
我无法在没有模型的情况下重现您的示例,但也许您想写
results = foreach(i=1:2, .combine='rbind') %:% foreach(j=1:2')即没有第二个 combine 参数?
标签: r foreach parallel-processing