2017-09-10 3 views
0

MPI를 백엔드로 사용하여 일련의 중첩 함수 (예 : foreach 문 내에서 호출 됨)를 표시하는 다음 mwe를 작성했습니다. 이 모든 것은 R 패키지 안에 들어 있습니다. 문제는 패키지를로드하고 fun3을 호출 할 때 fun3on의 값을 TRUE에서 FALSE로 변경할 수 없다는 것입니다. 어떤 제안? 전체 코드는 https://github.com/jamaas/toymod3.git입니다.foreach 함수 내에서 부울 변수 값을 doMPI로 변경할 수 없습니다.

기대

fun1 전화 (FALSE fun3on =)

출력 값을 변경할 수 있지만, 그것을하지 않는?

#' 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 (var11=10, var12=8, var13=5, 
        var21=0.05, var22=9.876, 
        fun3on=TRUE, ...) { 

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

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

fun2 <- function (var21=0.05, var22=9.876, ...) { 
    out2 <- `if` (rpois(1, var21) > 0, 
        var22 * fun3(...), 
        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 
#' @param fun3on turn the formula on or off 
#' @export fun3 

fun3 <- function (var31=1.396, var32=14.387, 
        var33=3.219, fun3on = TRUE, ...) { 
    out3 <- `if` (fun3on, 
        var31 * rnorm(1, mean=var32, sd= var33), 
        500) 
} 

답변

0

복잡해 보입니다. 나는 주석으로 게시하지만 잠재적 인 대답은 더 이상 당신의 질문에 대답을 시도 나타내고 있기 때문에, 여기에 당신이 전화 내 생각 엔이 문제가 fun1에서 여기

자리 잡고있다

을가는 것 fun2

fun2 <- function (var21=0.05, var22=9.876, ...) { 
    out2 <- `if` (rpois(1, var21) > 0, 
        var22 * fun3(...), 
        0) 
} 
인수를 전달

fun3 <- function (var31=1.396, var32=14.387, 
        var33=3.219, fun3on = TRUE, ...) { 
    out3 <- `if` (fun3on, 
        var31 * rnorm(1, mean=var32, sd= var33), 
        500) 
} 

그러나 01,230없이

fun2 전화 fun3(...) 728,는 당신이 작동하지 않을 수 있습니다 (...)

fun2 <- function (var21=0.05, var22=9.876, ...) { 
    out2 <- `if` (rpois(1, var21) > 0, 
        var22 * fun3(fun3on=fun3on), 
        0) 
} 

(fun3on=fun3on)에 변경 어쩌면 경우

fun3 기본적 TRUE입니까 ???

1

fun3onfun2으로 전달하지 않으므로 fun3으로 전달되지 않는 것이 문제입니다.

do.call(fun2, list(var21, var22))에는 do.call(fun2, list(var21, var22, fun3on = fun3on, ...))으로 변경하십시오. 이름이 지정된 인수로 전달해야합니다 (점을 추가 했으므로 fun3에 일부가있는 것으로 보입니다).

추신 : 연상적인 이름을 사용하지 않으면 반품 이름을 지정하지 마십시오.