2016-04-12 35 views
0

私は並列で実行したいループをfor持っているので、これを行うにはforeachを使用しています。foreachループが毎回反復するたびに行列を更新するR

私のループからの出力の1つは、すべての反復の結果を含む行列です。 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(i=1:10,DF)として(、私は私が使用しているすべてのパッケージを実行する必要がありますように、foreachコマンドでDFデータフレームを指定する必要があるかもしれ気持ちを持っていますが、私が管理していませんこの作業を行う。

答えて

1

foreachループであなたの結果を結合するためのオプションがあります。あなたはそれを使用することができます。ループが行列を移入するために理想的には次の2つが必要になります。例えば、

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

これが作成されます。マットix。

+0

これは私に元のコードでは3つのデータフレームだけを出力する必要がありますが、マトリックスを作成するという考えができます。したがって、この作業を行うことは困難/不可能だと私は思う。 – sym246

+1

その場合、並列で実行する場合は、 'lapply'または' mclappy'を使用してコードをベクトル化してみてください。 'for'ループでそれをやっても、そのような長いforループはRで非常に遅くなります。 – Koundy

関連する問題