2017-05-16 9 views
1

doRNG을 등록 할 때 함수 내에서 dopar을 실행하는 문제가 발생하여 함수 내부에서 생성 된 변수에 액세스해야합니다.변수를 찾을 수 없습니다.

내 전체 목표는 doRNG을 사용하여 병렬 처리가 임의의 숫자 스트림을 갖도록하는 것이므로 더 좋은 방법이 있다면 내 문제도 해결할 것입니다.

환경이 병렬 프로세스로 내보내지는 방식을 이해하려고 시도하기 때문에 doRNG이 실패하는 이유에 대해 2 차적으로 관심이 있습니다.

이 코드는 약간 고안된 것처럼 보입니다. 그러나 이것은 훨씬 더 크고 복잡한 코드를 요약 한 것입니다.

library(doParallel) 
library(foreach) 

cl <- makePSOCKcluster(2) 
registerDoParallel(cl) 

#if I comment out these two lines, code runs fine 
library(doRNG) 
registerDoRNG() 

gVar <- 'gVar' 

cols <- matrix(1:10,nrow=2) 
res <- apply(cols,2, 
    function(col) { 
    lclVar <- sum(col) 

    res <- foreach(i=icount(2), 
    .export=c('gVar'), #'lclVar' 
    .combine='c') %dopar% { #change to %do% also works 
     return(sprintf('%s %s %s',gVar,lclVar,i)) 
    } 

    return(res) 
}) 

print(res) 
stopCluster(cl) 

참고 doRNG 행을 주석 처리하면 코드가 올바르게 실행됩니다. 또한 %dopar%에서 %do%으로 변경되고 (doRNG 행은 주석 처리되지 않음) 작동합니다. 여기

Error in { : task 1 failed - "object 'lclVar' not found" 
+0

'% dopar % '대신'% dorng %'를 사용하면 오류가 발생하지 않습니다. 그걸 시험해 봤어? –

+0

@ J_F 실제로 내 문제가 수정되었습니다. 그래서 어떻게 든 도파르가 도롱뇽에 싸여있을 때와 같은 방식으로 환경이 전달되지 않고 있습니까? 어쨌든이 문제에 대한 빠른 수정이었습니다. 감사합니다! –

답변

0

내 전반적인 목표는 할 수있는 더 나은 방법이 그래서 만약 내 병렬 프로세스가 임의의 숫자의 다른 스트림을 얻을 수 있는지 확인 doRNG을 사용하는 것입니다

나는 다음과 같은 수 그것도 내 문제를 해결할 것입니다.

당신은 (그리고, lapply() 전화로 당신에게 각 FUN(x[[i]], ...) 호출이 적절한으로 이루어집니다 future 패키지 (I 저자 해요) 확인됩니다의

y <- future_lapply(x, FUN, ..., future.seed = TRUE) 

문제를 "바꿔"할 수있는 경우 L' Ecuyer-CMRG) RNG 스트림. 앞으로의 패키지는 자동으로 글로벌 변수 (예 : gVarlclVar)가 각 작업자에게 올바르게 내보내집니다.

예를 들어 plan() 함수로 병렬화하는 방법을 제어 할 수 있습니다. 동등

cl <- makePSOCKcluster(2) 
plan(cluster, workers = cl) 

가로 :

plan(multiprocess, workers = 2L) 

이 모든 운영 체제에서 동일하게 작동합니다.

+0

이 위대한 답변에 감사드립니다. J_F에서 위의 주석이 가장 빨리 수정되었으므로 가장 좋은 답변입니다. 그러나, 당신의 대답은 좋은 대안 접근법을 제공합니다. –