目标
我想使用 dplyr 在参数网格上运行模拟。具体来说,我想要一个可以在另一个程序中使用的函数
- 获得一个 data.frame
- 对于每一行,使用每一列作为参数计算一些模拟
- 还传递了一些额外的数据(例如,初始条件)
这是我的方法
require(dplyr)
run <- function(data, fun, fixed_parameters, ...) {
## ....
## argument checking
##
fixed_parameters <- as.environment(fixed_parameters)
grouped_out <- do_(rowwise(data), ~ do.call(fun, c(., fixed_parameters, ...)))
ungroup(grouped_out)
}
这行得通。例如,对于
growth <- function(n, r, K, b) {
# some dynamical simulation
# this is an obviously-inefficient way to do this ;)
n + r - exp(n) / K - b - rnorm(1, 0, 0.1)
}
growth_runner <- function(r, K, b, ic, ...) {
# a wrapper to run the simulation with some fixed values
n0 = ic$N0
T = ic$T
reps = ic$reps
data.frame(n_final = replicate(reps, {for(t in 1:T) {
n0 <- growth(n0, r, K, b)
};
n0})
)
}
我可以定义和运行,
data <- expand.grid(b = seq(0.01, 0.5, length.out=10),
K = exp(seq(0.1, 5, length.out=10)),
r = seq(0.5, 3.5, length.out=10))
initial_data = list(N0=0.9, T=5, reps=20)
output <- run(data, growth_runner, initial_data)
问题
尽管这似乎可行,但我想知道是否有办法在没有do.call
. (部分原因是do.call 的问题。)
我真的对grouped_out <- do_(rowwise(data), ~ do.call(fun, c(., fixed_parameters, ...)))
用做同样事情但没有do.call
. 编辑:以某种方式避免使用do.call
上述链接中概述的性能损失的方法也可以。
注释和参考
- 这个关于 do.call 和 dplyr中的标准评估的问题很有帮助,但我正在寻找一种方法来避免 do.call 如果可能
- dplyr 的 nse vignette对写这篇文章很有帮助;让我觉得
.values
可以代替do.call