2016-04-12 119 views
0

我有一個for循環,我想並行運行,所以我使用foreach來做到這一點。foreach循環每次迭代後更新矩陣R

我的循環輸出之一是一個包含所有迭代結果的矩陣。如果我使用for循環,那麼這個矩陣會依次更新,並且可以在最後輸出。但是,當使用foreach時,似乎無法更新它。

例如,我已經舉了一個簡單的例子來說明我的觀點。

# foreach example - does not update DF matrix. 
cl=makeCluster(4) 
registerDoParallel(cl) 
DF=matrix(NA,ncol=5,nrow=10) 
foreach(i=1:10) %dopar% { 
    DF[i,1]=i*1 
    DF[i,2]=i*2 
    DF[i,3]=i*3 
    DF[i,4]=i*4 
    DF[i,5]=i*5 
} 

# for loop - Updates DF and produces complete output. 
DF=matrix(NA,ncol=5,nrow=10) 
for(i in 1:10) { 
    DF[i,1]=i*1 
    DF[i,2]=i*2 
    DF[i,3]=i*3 
    DF[i,4]=i*4 
    DF[i,5]=i*5 
} 

我有一種感覺,我可能需要在foreach命令指定DF數據幀,像我就需要與被使用的任何包做,(如foreach(i=1:10,DF),但我還沒有成功地使這項工作。

回答

1

還有就是在foreach循環相結合的結果的選項,你可以使用它。理想情況下,你需要兩個for循環來填充矩陣。例如,

x <- foreach(i=1:10,.combine = rbind) %do% { 
    foreach(j=1:10,.combine=c)%do%{ 
     j 
    } 
} 

這將創建母親九。希望這有助於得到一個想法

+0

這給了我一個創建矩陣的想法,但是我的原始代碼需要輸出3個數據幀,而不僅僅是一個。因此,我認爲做這項工作很困難/不可能。 – sym246

+1

在這種情況下,如果要並行運行,請嘗試使用'lapply'或'mclappy'對矢量代碼進行矢量化。即使你設法在'for'循環中執行,在R中這樣長的for循環將會非常緩慢。 – Koundy