2016-04-24 9 views
1

私は100回複製する必要がある非常に長いジョブを実行していますので、Rのforeach機能に目を向けると、シェルスクリプト。私は、それぞれの実行からすべての結果を同じファイルに入力しようとしています。私は自分のコードを簡略化したバージョンを含めました。Rの並列ジョブからの出力を1つのファイルに保存する

cl<-makeCluster(core-1) 
registerDoParallel(cl,cores=core) 
SigEpsilonSq<-list() 
SigLSq<-list() 
RatioMat<-list() 
foreach(p=1:100) %dopar%{ 

functions defining my variables{...} 

    for(i in 1:fMaxInd){ 
    rhoSqjMatr[,i]<-1/(1+Bb[i])*(CbAdj+AbAdj*XjBarAdj+BbAdj[i]*XjSqBarAdj)/(dataZ*dataZ) 
    sigmaEpsSqV[i]<-mean(rhoSqjMatr[,i]) 
    rhoSqjMatr[,i]<-rhoSqjMatr[,i]/sigmaEpsSqV[i] 
    biasCorrV[,i]<-sigmaEpsSqV[i]/L*gammaQl(rhoSqjMatr[,i]) 
    Qcbar[,i]<-Qflbar-biasCorrV[,i] 
    sigmaExtSq[,i]<-sigmaSqExt(sigmaEpsSqV[i], rhoSqjMatr[,i]) 
    ratioMatr[,i]<-sigmaExtSq[,i]/(sigmaL*sigmaL)#ratio (sigma_l^e)^2/(sigmaL)^2 

    } 

    sigmaEpsSqV<-as.matrix(sigmaEpsSqV) 
    SigEpsilonSq[[p]]<-sigmaEpsSqV 
    SigLSq[[p]]<-sigmaExtSq 
    RatioMat[[p]]<-ratioMatr 

} #End of the dopar loop 

stopCluster(cl) 

write.csv(SigEpsilonSq,file="Sigma_Epsilon_Sq.csv") 
write.csv(SigLSq,file="Sigma_L_Sq.csv") 
write.csv(RatioMat,file="Ratio_Matrix.csv") 

ジョブが完了すると、私の.csvファイルは空です。私はforeachが結果をどのように保存し、どのように私がそれらにアクセスできるかをかなり理解していないと信じています。私は手動でファイルをマージする必要はありません。また、私はforeachループの最後に stopCluster(cl) と書かなければならないのですか、それとも最後まで待つのですか?どんな助けでも大歓迎です。

+0

タグの上にカーソルを置くと、そのタグの使用方法がわかります。 ** parallel.foreach **は** NET **のものです。 – Laurel

+0

@Laurelあなたはそれを正しい[タグ:平行foreach]に変更できました。 – svick

+0

@svick著者がタグの使い方を学ぶのを助けたかっただけです。 (私は正しいタグについても知らなかった。私はRを知らないので、タグが存在することを保証するのに十分な重要性があるかどうかはわからなかった。)とにかくタグを付けていただきありがとう。 – Laurel

答えて

-1

これはforeachの仕組みではありません。あなたは例を調べるべきです。パラレル化されたジョブから何かを出力したい場合は、.combineを使用する必要があります。 はまた、これに代えて:

sigmaEpsSqV<-as.matrix(sigmaEpsSqV) 
SigEpsilonSq[[p]]<-sigmaEpsSqV 
SigLSq[[p]]<-sigmaExtSq 
RatioMat[[p]]<-ratioMatr 

あなたは、このような再書き込みに何かする必要があります:

list(as.matrix(sigmaEpsSqV),sigmaEpsSqV,sigmaExtSq,ratioMatr) 

あなたはまた、rbind、CBIND、Cを使用することができます... 1に結果を集約します最終的な出力。 あなたも、あなた自身の機能、例を組み合わせることができます。

.combine=function(x,y)rbindlist(list(x,y)) 

ソリューションは、以下の動作するはずです。出力はリストのリストでなければなりません。しかし、検索結果を正しい形式で保存するのは痛いかもしれません。その場合は、独自の.combine関数を設計する必要があります。

cl<-makeCluster(core-1) 
registerDoParallel(cl,cores=core) 
SigEpsilonSq<-list() 
SigLSq<-list() 
RatioMat<-list() 
results = foreach(p=1:100, .combine=list) %dopar%{ 

    functions defining my variables{...} 

    for(i in 1:fMaxInd){ 
    rhoSqjMatr[,i]<-1/(1+Bb[i])*(CbAdj+AbAdj*XjBarAdj+BbAdj[i]*XjSqBarAdj)/(dataZ*dataZ) 
    sigmaEpsSqV[i]<-mean(rhoSqjMatr[,i]) 
    rhoSqjMatr[,i]<-rhoSqjMatr[,i]/sigmaEpsSqV[i] 
    biasCorrV[,i]<-sigmaEpsSqV[i]/L*gammaQl(rhoSqjMatr[,i]) 
    Qcbar[,i]<-Qflbar-biasCorrV[,i] 
    sigmaExtSq[,i]<-sigmaSqExt(sigmaEpsSqV[i], rhoSqjMatr[,i]) 
    ratioMatr[,i]<-sigmaExtSq[,i]/(sigmaL*sigmaL)#ratio (sigma_l^e)^2/(sigmaL)^2 

    } 

    list(as.matrix(sigmaEpsSqV),sigmaEpsSqV,sigmaExtSq,ratioMatr) 

} #End of the dopar loop 

stopCluster(cl) 

#Then you extract and save results 
+0

ありがとうございます。これは間違いなく多くの助けになりました。 – sarahr13

関連する問題