我已经构建了以下MWE,该MWE显示了一系列嵌套函数,这些功能被称为" foreach语句",MPI是后端。所有这些都包装在R包中。问题在于,当我加载软件包,然后致电FUN3时,我无法将其更改为FUN3ON的价值从True True更改为false。有什么建议么?完整的代码在https://github.com/jamaas/toymod3.git。
期望打电话
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)
}
问题是您没有将fun3on
传递给fun2
,因此不会将其传递给fun3
。
在do.call(fun2, list(var21, var22))
中,将其更改为do.call(fun2, list(var21, var22, fun3on = fun3on, ...))
。确保将它们作为命名参数传递(我添加了点,因为您似乎在fun3
中有一些)。
ps:除非您使用令人回味的名称,否则不要命名您的退货。
看起来很复杂。我会发表评论,但是由于这个潜在的答案更长,并且代表了回答您的问题的尝试,因此
我的猜测是你的问题在这里
在fun1
中,您致电fun2
fun2 <- function (var21=0.05, var22=9.876, ...) {
out2 <- `if` (rpois(1, var21) > 0,
var22 * fun3(...),
0)
}
fun2
调用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)
}
但是fun3on
是fun3
中的默认TRUE
也许如果您将(...)
更改为(fun3on=fun3on)
fun2 <- function (var21=0.05, var22=9.876, ...) {
out2 <- `if` (rpois(1, var21) > 0,
var22 * fun3(fun3on=fun3on),
0)
}
它可能起作用???