私はdplyr
を使っていくつかのプログラミングをしていますが、mapply
に式を(具体的にはMoreArgs
)引数として渡す方法が不思議ですか?`mapply`の` MoreArgs`に式を渡す
いくつかids
とtime_range
に基づいdata.frame
をサブセット単純な関数F
を検討し、次にいくつかの他の列x
に基づいて要約統計量を出力します。
require(dplyr)
F <- function(ids, time_range, df, date_column, x) {
date_column <- enquo(date_column)
x <- enquo(x)
df %>%
filter(person_id %chin% ids) %>%
filter(time_range[1] <= (!!date_column) & (!!date_column) <= time_range[2]) %>%
summarise(newvar = sum(!!x))
}
私たちは、関数F
を適用できるいくつかのサンプルデータを作り上げることができます。
person_ids <- lapply(1:2, function(i) sample(letters, size = 10))
time_ranges <- lapply(list(c("2014-01-01", "2014-12-31"),
c("2015-01-01", "2015-12-31")), as.Date)
require(data.table)
dt <- CJ(person_id = letters,
date_col = seq.Date(from = as.Date('2014-01-01'), to = as.Date('2015-12-31'), by = '1 day'))
dt[, z := rnorm(nrow(dt))] # The variable we will later sum over, i.e. apply F to.
私たちは正常に私たちの入力をそれぞれの入力に適用することができます。
F(person_ids[[1]], time_ranges[[1]], dt, date_col, z)
F(person_ids[[2]], time_ranges[[2]], dt, date_col, z)
だから私が望むなら、簡単なループを書くことで問題を解決できます。しかし、文法的な砂糖を適用してすべてをmapply
にラップしようとすると、エラーが発生します。 mapply
で
mapply(F, ids = person_ids, time_range = time_ranges, MoreArgs = list(df = dt, date_column = date_col, x = z))
# Error in mapply... object 'date_col' not found
これを 'quote'または' enquo'することはできますか?
pmap
を使用してください。これは非標準的な評価についてのことです。プログラムするのは難しいです。それを行うための 'dplyr'方法は、あなたの' mapply'で呼び出すのにふさわしい標準評価 'F_'を持つことです。 – Gregor