【问题标题】:missing output from foreach缺少来自 foreach 的输出
【发布时间】: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


【解决方案1】:

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

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

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
    }

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

【讨论】:

  • 感谢您的建议。这一次,两个 i=1 结果都被省略了。我将不得不做更多关于如何解释这一点的阅读。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
相关资源
最近更新 更多