2015-02-05 2 views
7

foreach%dopar% 루프를 사용한 후에 두 개의 다른 객체를 출력 할 수 있는지 알고 싶습니다.outptut foreach를 사용하는 두 객체

나는 내가 찾고있는 것을 설명하려고 노력할 것이다.

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

그러나 예상 된 결과

에게 제공하지 않습니다3210

다음 작업을 수행 할 때 :

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 루프의 몸에서 두 개체를 반환해야 할 경우, 당신은 하나의 객체 아무래도로 번들해야하며, 목록이 할 수있는 가장 일반적인 방법입니다. 트릭은 적절한 결합 기능을 제공하여 원하는 최종 결과를 얻는 것입니다. vec1 개체를 모두 cbind과 결합하고 cbind 인 개체 인 vec2 개체를 모두 결합하려는 경우 mapply 함수는 매우 편리합니다. 여기

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

이 결합 기능을위한 작은 테스트 프로그램입니다 :이 두, 10 X 100 매트릭스를 포함하는 목록을 반환합니다

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

,하지만 같은 기능을 결합 나는 이것이 당신이 원하는 생각 vec1vec2이 데이터 프레임 인 경우 사용할 수 있습니다.

관련 문제