2017-09-05 9 views
1

foreach 문과 doMPI 백엔드에서 여러 중첩 함수가 포함 된 R 패키지를 작성하려고합니다. 그것은 ""XXX "개체 오류를 찾을 수 없습니다 던지고있다. 이상한 것은 내가 doParallel 백엔드로 사용하는 경우이 오류가 발생하지 않는 것입니다.이 문제의 예입니다 있지만 doMPI 많은 함께 작동하는 솔루션을 사용할 수 있습니다. 더 큰 문제.foreach가 포함 된 R 패키지는 doParallel과 함께 작동하지만 doMPI와는 작동하지 않으며 객체를 찾을 수 없습니다.

이것은 RStudio, roxygen를 사용하여 R-패키지로 컴파일 된 코드를 개발자 도구 등

#' Test function level 1 
#' @param var11 first variable for function 1 
#' @param var12 second variable for function 1 
#' @param var13 third variable for function 1 
#' @export fun1 

fun1 <- function (fun2.params, fun3.params, var11, var12, var13, ...) { 

    results <- data.frame (foreach::`%dopar%`(
       foreach::`%:%`(foreach::foreach(j = 1:var11, .combine = cbind), 
       foreach::foreach (i = 1:var12, .combine=rbind)), 
       { 
        out3 <- replicate(var13, 
            do.call(fun2, 
              c(list(fun3.params=fun3.params), 
               fun2.params))) 
        output2 <- data.frame(mean(out3)) 
     } 
    ) 
) 
    ## save outputs for subsequent analyses if required 
saveRDS(results, file = paste("./outputs/", var13 ,"_", var12, "_", var11, "_", 
           format(Sys.time(), "%d_%m_%Y"), ".rds", sep="")) 
} 

#' Test function level 2 
#' @param var21 first variable for function 2 
#' @param var22 second variable for function 2 
#' @export fun2 

fun2 <- function (fun3.params, var21, var22, ...) { 
    out2 <- `if` (rpois(1, var21) > 0, var22 * do.call(fun3, fun3.params), 0) 
} 

#' Test function level 3 
#' @param var31 first variable for function 3 
#' @param var32 second variable for function 3 
#' @param var33 third variable for function 3 
#' @export fun3 

fun3 <- function (var31, var32, var33, ...) { 
    out3 <- var31 * rnorm(1, mean=var32, sd= var33) 
} 

그때 라이브러리를로드하고 .R에서 최고 수준의 함수를 호출입니다 emacs ESS (또는 RStudio 편집기에서) 및이 명령을 사용하는 파일

library(toymod) 
library(doParallel) 
cl <-makeCluster(10) 
registerDoParallel(cl) 

fun1.params <- list(var11=10, var12=150, var13=365) 
fun2.params <- list(var21=0.05,var22=9.876) 
fun3.params <- list(var31=1.396,var32=14.387,var33=3.219) 

do.call(fun1, c(list(fun2.params = fun2.params, 
        fun3.params = fun3.params), 
       fun1.params)) 

나는 R 3.4.1을 사용하여, 잘 작동 병렬 백엔드, 내가

Error in { : task 12 failed - "object 'fun2' not found" 

이 우분투 16.04 리눅스에서 실행되는 다음과 같은 오류를 얻을, 그것은 doMPI를 사용하여 실행하지만 같은 doMPI을 doParallel를 사용하여 실행하는 경우 0.2.2 및 doParallel. 전체 패키지를 github에 두었습니다. https://github.com/jamaas/toymod.git

doMPI 코드를 변경해야 할 사람이 있습니까? R 패키지 제작과 관련이있는 것 같습니다.

+0

'doParallel'은 부모 R 환경을 * X * workers로 복제 할 것이기 때문일 수도 있지만'doMPI'는 아마도 이것을하지 않을 것입니다. 부모 환경에서 함수를 각각의 작업자 인'cl'로 내보내거나'foreach'의'{}'에 임베드해야합니다. – CPak

+0

doMPI는 snow-derived 인터페이스 (do 당신이하고있는)와 doParallel과 똑같이 동작해야하기 때문에 이것이 이상하다는 데 동의합니다. 나는 향상/버그 수정이 doMPar를 만들지 않은 doParallel에 만들어 졌다고 생각합니다. 나는 이것을 조사하기 시작했으나 시간이 걸릴 수 있습니다. –

답변

1

나는 foreach .packages='toymod' 옵션을 사용해야한다는 것이 문제라고 생각합니다. 이것은 foreach 루프의 본문이 실제로 'toymod'패키지의 일부가 아니기 때문에 다른 R 패키지의 함수에 액세스하는 것처럼 'toymod'를로드해야하기 때문입니다.

doParallel을 사용할 때 왜 이것이 필요하지 않은지 알 수 없습니다. doParallel은 foreach 루프가있는 패키지를 자동으로로드해야한다고 생각합니다.이 부분을 좀 더 살펴보고 doMPI를 수정하여 동일한 작업을 수행 할 것입니다.

+0

그게 효과가! 고마워. 그것은 나에게 약간 이상한 것처럼 보이지만 정확한 기술 용어는 모르지만 마음에 '순환'(Ouroboros) 또는 '근친 상간'봄. 그것 자체 내에서 함수를로드해야 논리적이지만, 아마도 이것은 일부 프로그래밍 패러다임에서 정상입니까? –

+0

@JimMaas R 프로세스가 원격 프로세스에서 평가되도록 환경을 설정하는 것은 까다 롭습니다. foreach 루프의 몸체가 정의되어있는 패키지에서 내보내기되지 않은 함수에 액세스 할 수 있기를 정말로 원하지만이 상황에서는 가능하지 않다고 생각합니다. 패키지를 자동으로로드하는 것이 합리적이라고 생각하지만, foreach 본체를 패키지의 2 등 시민으로 취급합니다. –