2015-02-05 14 views
7

Tôi muốn biết liệu có thể xuất hai đối tượng khác nhau sau khi sử dụng vòng lặp foreach%dopar% không.outptut hai đối tượng sử dụng foreach

Tôi sẽ cố gắng giải thích những gì tôi đang tìm kiếm. Giả sử tôi có hai data.frames như là kết quả của một số hoạt động bên trong vòng lặp:

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 
} 

đầu ra của tôi mong muốn sẽ là một danh sách các data.frames chiều dài 2, chẳng hạn như:

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

tôi đã thử với điều này từ một bài trước 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) 
} 

Nhưng nó không cho kết quả mong đợi

Khi tôi làm như sau:

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

tôi có được chỉ data.frame của vec2. Có cách nào để trả lại hoặc lưu cả hai kết quả đầu ra?

Cảm ơn

Trả lời

10

Nếu bạn cần phải trả lại hai đối tượng ra khỏi cơ thể của vòng lặp foreach, bạn phải bó chúng vào một đối tượng nào đó hoặc khác, và một danh sách là cách chung nhất để làm điều đó. Bí quyết là cung cấp một hàm kết hợp thích hợp để đạt được kết quả cuối cùng mong muốn. Nếu bạn muốn kết hợp tất cả các đối tượng vec1 với cbind và cũng có tất cả các đối tượng vec2 với cbind, chức năng mapply khá tiện dụng. Tôi nghĩ rằng đây là những gì bạn muốn:

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

Dưới đây là một chương trình thử nghiệm nhỏ cho chức năng kết hợp này:

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

này sẽ trả về một danh sách có chứa hai, 10 X 100 ma trận, nhưng chỉ có một chức năng kết hợp có thể được sử dụng nếu vec1vec2 là các khung dữ liệu.

Các vấn đề liên quan