目標do.call
私はパラメータのグリッド上でシミュレーションを実行するためにdplyr使用することなく、パラメータのグリッド上でシミュレーションを実行するために、標準的な評価とDO_を使用しました。具体的には、私は、引数
- は、行ごとに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)
}
THさん作品です。 do.call
せずにそれを行うための方法がありますたとえば、
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)
質問、
を定義して実行することができます。 (部分的には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'とまったく同じように聞こえる。残念ながら、2つのパッケージはどちらかというと互換性がありません。 – baptiste
ダグ、私は 'plyr'のその部分を発見したことがない!ポインタのおかげで – jaimedash
私はあなたがおそらく 'purrr :: invoke_rows'を望んでいると思います。これは' mdply'の現代的なものです。 http://rpackages.ianhowson.com/cran/purrr/man/by_row.html – Shorpy