2017-09-10 5 views
0

Ich habe die folgende mwe, die eine Reihe von geschachtelten Funktionen, die innerhalb einer foreach-Anweisung aufgerufen werden, mit MPI als Backend erstellt. All dies ist in einem R-Paket verpackt. Das Problem ist, dass wenn ich das Paket lade, und dann fun3 aufrufen, kann ich es nicht bekommen, um den Wert von fun3on von WAHR zu FALSCH zu ändern. Irgendwelche Vorschläge? Der vollständige Code lautet https://github.com/jamaas/toymod3.git.Kann booleschen Variablenwert in Foreach-Funktion nicht mit DoMPI ändern

Erwarten Sie, dass

fun1 Aufruf (fun3on = FALSE)

die Ausgangswerte zu ändern, aber es funktioniert nicht?

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

Antwort

0

Sieht kompliziert aus. Ich würde schreiben als Kommentar, aber da dieses Potential Antwort mehr und stellt einen Versuch, Ihre Frage zu beantworten, geht hier

Meine Vermutung ist Ihr Problem hier

liegt

In fun1 Sie rufen fun2

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

fun2 Anrufe fun3(...) ohne Durch Argumente

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

Aber fun3on ist standardmäßig TRUE in fun3

Vielleicht, wenn Sie (...) zu (fun3on=fun3on)

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

es könnte funktionieren ändern ???

1

Das Problem ist, dass Sie fun3on nicht an fun2 übergeben, so dass es nicht an fun3 übergeben wird.

In do.call(fun2, list(var21, var22)), ändern Sie es zu do.call(fun2, list(var21, var22, fun3on = fun3on, ...)). Stelle sicher, dass du sie als benannte Argumente übergibst (ich habe die Punkte hinzugefügt, weil du anscheinend einige in fun3 hast).

PS: Benennen Sie Ihre Rückgaben nur, wenn Sie aussagekräftige Namen verwenden.

Verwandte Themen