2015-02-05 30 views
7

foreach%dopar% döngüsünü kullandıktan sonra iki farklı nesneyi çıkarmanın mümkün olup olmadığını bilmek isterim.foreach kullanarak iki nesne outptut

Aradığımı açıklamaya çalışacağım.

dim(result[[1]]) # equals to nrow=length(vec1) and ncol=100 
dim(result[[2]]) # equals to nrow=length(vec2) and ncol=100 

:

library(doMC) 
library(parallel) 
registerDoMC(cores=4) 

result <- foreach(i=1:100) %dopar% { 
#### some code here 
#### some code here 
vec1 <- result_from_previous code # It would be the 1st object I'd like to ouput 
vec2 <- result_from_previous code # It would be the 2nd object I'd like to output 
} 

My istenen çıkış gibi uzunluğu 2'nin data.frames, bir liste olurdu: ı döngü içinde çeşitli operasyonlar sonucunda iki data.frames olduğunu varsayalım bir önceki yazı Saving multiple outputs of foreach dopar loop bu ile çalıştık:

comb <- function(x, ...) { 
    lapply(seq_along(x), function(i) c(x[[i]], lapply(list(...), function(y) y[[i]]))) 

result <- foreach(i=1:100, .comb='comb', .multicombine=TRUE) %dopar% { 
#### some code here 
#### some code here 
vec1 <- result_from_previous code 
vec2 <- result_from_previous code 
list(vec1, vec2) 
} 

Ama beklenen bir sonuç

vermez

aşağıdaki yaptığınızda:

result <- foreach(i=1:100, .comb=cbind) %dopar% { 
#### some code here 
#### some code here 
vec1 <- result_from_previous code 
vec2 <- result_from_previous code 
} 

Ben vec2 sadece data.frame elde ederiz. Her iki çıkışı geri döndürmenin veya kaydetmenin herhangi bir yolu var mı?

Teşekkür

cevap

10

Eğer foreach döngüsü gövdesinden iki nesneleri döndürmek için gerekiyorsa, bir nesnenin bir şekilde ya da diğer altında toplayabilirsiniz gerekir ve bir liste yapmak için en genel yoludur. Hile istenen nihai sonuca ulaşmak için uygun bir birleştirme işlevi sağlamaktır. cbind ile vec1 nesnelerini ve ayrıca cbind ile vec2 nesnesinin tümünü birleştirmek isterseniz, mapply işlevi oldukça kullanışlıdır. İşte

comb <- function(...) { 
    mapply('cbind', ..., SIMPLIFY=FALSE) 
} 

bu kombine fonksiyonu için küçük bir test programı: Bu iki, 10 X 100 matrisleri içeren bir liste döndürür

result <- foreach(i=1:100, .combine='comb', .multicombine=TRUE) %dopar% { 
    vec1 <- rep(i, 10) 
    vec2 <- rep(2*i, 10) 
    list(vec1, vec2) 
} 

ancak aynı işlevi birleştiren bu istediğini düşünüyorum vec1 ve vec2 veri çerçeveleri ise kullanılabilir.

İlgili konular