2016-04-06 8 views
0

私は私が「foreachの」を使用してRのコードを書いたforeachのは

Mat.corr <- matrix(0,6,5,byrow=F) 
for (i in 1:6){ 
Mat.corr[i,]=cop.theta(index,EXPR,SURV=survp[,i]) 
} 

ループ環境のために機能 「cop.theta」を使用していくつかの計算外のマトリックスを作成するため、このコードを持っていますdoParallelパッケージを使用して、上記のコードと同様の結果を得ます。

library(doParallel) 
cl <- makeCluster(3) 
registerDoParallel(cl) 
getDoParWorkers() 
clusterExport(cl, list("QT","EXPR","cop.theta.i")) 
clusterEvalQ(cl, library(copula)) 

foreach(i=1:6,.combine=matrix(0,6,5,byrow=F) %dopar% 
Mat.corr[i,]=cop.theta(index,EXPR,QT=survp[,i]) 

を次のように私のコードがあるしかし、私はこのエラー私は私が間違っているつもりです

Error: unexpected '=' in "foreach(i=1:6,.combine=matrix(0,6,5,byrow=F) 
%dopar% Mat.corr[i,]=" 

を取得していますか?

+0

例を再現性のあるものにすると、助けが簡単になります。 – Andrie

+0

これは 'foreach'の仕組みではありません。ビネットをお読みください。 'foreach'に渡される式は戻り値を持っていなければなりません(特に並列バックエンドを使う場合)。 'foreach'は' for'の同義語だけではありません。 – Roland

答えて

1

")"

すなわち、次の byrow = Fから
foreach(i=1:6,.combine=matrix(0,6,5,byrow=F)) %dopar% 
    Mat.corr[i,]=cop.theta(index,EXPR,QT=survp[,i]) 

が不足してこのエラーを修正する必要がありますがあります。ただし、foreachループ内のmat.corr[i,]=...は、ループをパラレルで実行している限り、cop.theta操作の結果の値をこの特定の行に書き込まないことに注意してください。これは、シングルコアforeachでのみ可能です。つまり、.combineforeach()の内部で使用するか、ループが終了した後に、マージ手順を処理する必要があります。ここに私のポイントを明確にするためのコードスニペットがあります。

mat <- matrix(nrow = 3, ncol = 3) 

### multi-core ----- 
foreach(i = 1:nrow(mat)) %dopar% { 
    mat[i, ] <- matrix(rep(i, ncol(mat)), nrow = 1) 
} 

mat 
    [,1] [,2] [,3] 
[1,] NA NA NA 
[2,] NA NA NA 
[3,] NA NA NA 


### single core ----- 
foreach(i = 1:nrow(mat)) %do% { 
    mat[i, ] <- matrix(rep(i, ncol(mat)), nrow = 1) 
} 

mat 
    [,1] [,2] [,3] 
[1,] 1 1 1 
[2,] 2 2 2 
[3,] 3 3 3 
0

ありがとうございます。以下のコードは実際に私の質問に答えています。

foreach(i=1:6,.combine=rbind) %dopar% cop.theta(index,EXPR,SURV=survp[,i])