我想用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
。 (部分原因是issues with do.call。)
我真的很感兴趣的方法是用一些做同样的事情,但没有do.call
的东西来代替行grouped_out <- do_(rowwise(data), ~ do.call(fun, c(., fixed_parameters, ...)))
。 编辑:某种方式可以避免使用上述链接中列出的do.call
的性能损失也会奏效。
注释和参考文献
- this question on do.call and standard evaluation in dplyr是有益的,但我正在寻找一种方式,如果可能避免do.call
- dplyr的nse vignette是在写这篇帮助的;而让我觉得
.values
可以在工作地点do.call
FWIW听起来很像'plyr :: mdply'。不幸的是,这两个软件包相当不兼容。 – baptiste
dang,我从来没有发现'plyr'的那部分!感谢您的指针 – jaimedash
我想你可能需要'purrr :: invoke_rows',这是'mdply'的现代等价物。 http://rpackages.ianhowson.com/cran/purrr/man/by_row.html – Shorpy