2014-10-29 60 views
0

如果我創建一個簡單的模型,的foreach返回每個結果,我認爲它應該的方式:從的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

一個最小可重現的例子將很好地幫助您調試。如果沒有它,並且不知道'model(i,j)'是如何定義的,那很難說出什麼問題。 – 2014-10-29 17:15:42

+0

我無法重現通用數據的問題。事實上,重新連接到服務器似乎解決了這個問題。 (雖然它可能會在未來重新出現)。我懷疑有一個內存不足的錯誤,雖然從詳細輸出中不明顯。 – 2014-10-29 20:23:09

+0

我無法重現你的沒有模型的例子,但也許你想寫'results = foreach(i = 1:2,.combine ='rbind')%:%foreach(j = 1:2')'即沒有第二個結合論點? – Jens 2015-02-17 16:07:40

回答

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 
    } 

如果「模式」始終會返回一個很好的價值,那麼你的理論可能是正確的,但很難想象有「模範」可能會導致迭代變量出現問題。

+0

感謝您的建議。這一次,i = 1的結果都被省略了。我將不得不做更多的解讀。 – 2014-10-30 16:21:41