目標
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