2017-09-10 7 views
0

次のmweは、foreach文の中で呼び出され、MPIをバックエンドとして呼び出される一連のネストされた関数を示しています。これらはすべてRパッケージ内にパッケージ化されています。問題は、パッケージを読み込んでfun3を呼び出すと、fun3onの値をTRUEからFALSEに変更できないということです。助言がありますか?完全なコードは https://github.com/jamaas/toymod3.gitです。foreach関数内のブール変数値をdoMPIで変更できません

FUN1(fun3on = FALSE)

を呼び出すと、出力値を変更することを期待するが、それはしないのですか?

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

しかしなし

fun2通話あなたが(...)

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

を変更した場合、それがうまくいくかもしれないたぶんfun3

にデフォルトTRUEあります?

1

fun3onfun2に渡すのではなく、fun3に渡されないという問題があります。

do.call(fun2, list(var21, var22))には、do.call(fun2, list(var21, var22, fun3on = fun3on, ...))に変更してください。名前付き引数として渡すようにしてください(fun3にいくつかあると思われるので、点を追加しました)。

PS:想起的な名前を使用しない限り、あなたのリターンの名前は付けないでください。

関連する問題