【发布时间】:2018-04-11 21:06:20
【问题描述】:
我正在使用dplyr 进行一些编程,我很好奇如何将表达式作为(特别是MoreArgs)参数传递给mapply?
考虑一个简单的函数F,它基于一些ids 和一个time_range 子集data.frame,然后输出基于其他一些列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)
因此,如果我愿意,我可以编写一个简单的 for 循环来解决我的问题。但是,如果我们尝试应用语法糖并将所有内容包装在 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呢?这是关于非标准评估的事情,很难编程。dplyr的做法是(或者至少是,我没有跟上)将有一个标准评估F_适合与您的mapply通话。