2015-02-05 5 views
7

का उपयोग करके दो ऑब्जेक्ट्स को आउटपुट करें, मैं जानना चाहूंगा कि foreach%dopar% लूप का उपयोग करने के बाद दो अलग-अलग ऑब्जेक्ट्स आउटपुट करना संभव होगा या नहीं।फ़ोरैच

मैं जो कुछ भी ढूंढ रहा हूं उसे समझाऊंगा।

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 
} 

मेरे वांछित आउटपुट जैसे लंबाई 2 की data.frames, की एक सूची होगा: चलो मैं पाश अंदर कई आपरेशनों का एक परिणाम के रूप में दो data.frames है लगता है चलो मैं एक पिछली पोस्ट Saving multiple outputs of foreach dopar loop से इस के साथ की कोशिश की है:

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

लेकिन यह अपेक्षित परिणाम

नहीं देता

मैं निम्न कार्य करें:

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

मैं केवल vec2 की data.frame प्राप्त करते हैं। क्या दोनों आउटपुट लौटने या सहेजने का कोई तरीका है?

धन्यवाद

उत्तर

10

आप foreach पाश के शरीर से दो वस्तुओं वापस जाने के लिए की जरूरत है, तो आप उन्हें एक वस्तु किसी भी तरह या अन्य में बंडल करना चाहिए, और एक सूची सबसे सामान्य तरीका है कि ऐसा करने के लिए है। यह वांछित अंतिम परिणाम प्राप्त करने के लिए एक उपयुक्त गठबंधन समारोह प्रदान करना है। यदि आप ऑब्जेक्ट्स cbind के साथ सभी vec2 ऑब्जेक्ट्स cbind के साथ जोड़ना चाहते हैं, तो mapply फ़ंक्शन काफी आसान है। मुझे लगता है कि यह तुम क्या चाहते है:

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

यहाँ इस गठबंधन समारोह के लिए एक छोटे से परीक्षण कार्यक्रम है:

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

यह दो, 10 एक्स 100 मैट्रिक्स युक्त एक सूची प्रदान करेगा, लेकिन एक ही समारोह गठबंधन vec1 और vec2 डेटा फ्रेम होने पर उपयोग किया जा सकता है।

संबंधित मुद्दे