Цели
Я хочу использовать 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