如果我创建一个简单的模型,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的目的。
答案 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
}
如果“模型”总是返回一个好的值,那么你的理论可能是正确的,尽管很难想象“模型”如何导致迭代变量出现问题。