缺少来自foreach的输出

时间:2014-10-29 17:11:16

标签: r foreach parallel-processing

如果我创建一个简单的模型,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的目的。

1 个答案:

答案 0 :(得分:0)

我认为“模型”在由工作人员执行时返回不同的结果,可能是因为工作人员没有正确初始化。

为了测试这个理论,我会添加一些额外的测试代码:

results <-
  foreach(i=1:2, .combine='rbind') %:%
    foreach(j=1:2, .combine='rbind') %dopar% {
      x <- model(i,j)
      stopifnot(! is.null(x))
      stopifnot(nrow(x) == 1)
      x
    }

如果“模型”总是返回一个好的值,那么你的理论可能是正确的,尽管很难想象“模型”如何导致迭代变量出现问题。