2016-04-06 30 views
0

ı ı "foreach" kullanarak bir R kodu yazdığıforeach

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

döngü ortamı için bir işlev "cop.theta" kullanarak bazı hesaplamaların dışında bir matris oluşturmak için bu kod Yukarıdaki kodun oluşturduğu sonuca benzer sonuçlar elde etmek için doParallel paketi.

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]) 

aşağıdaki Ama bu hatayı

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

alıyorum olarak benim kodudur Nerede yanlış gidiyorum?

+0

Örneğinizi tekrar üretilebilir yaparsanız, daha kolay yardımcı olur. – Andrie

+0

Bu, foreach'in nasıl çalıştığı değil. Lütfen vinyetlerini oku. "Foreach" öğesine iletilen ifade, bir dönüş değeri olmalıdır (özellikle de paralel bir arka uç kullanırsanız). 'foreach' sadece 'for'un eşanlamlısı değildir. – Roland

cevap

1

a ")"

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

Bu hatayı düzeltmek gerekir, yani bir sonraki byrow = F eksik yoktur. Ancak, foreach döngüsünün içinde mat.corr[i,]=... döngüsünün, bu paralel satırı döngüde çalıştırdığınız sürece cop.theta işleminden kaynaklanan değerleri yazmayacağını unutmayın; bu yalnızca tek çekirdekli foreach ile mümkündür. Yani, .combine'u foreach()'u kullanarak veya döngü bittikten sonra birleştirme işlemlerini gerçekleştirmeniz gerekir. İşte, noktayı açıklığa kavuşturmak için bir kod snippet'i.

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

Yorumlarınız için hepinize teşekkür ederiz. Aşağıdaki kod aslında sorumu yanıtladı.

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