【发布时间】:2020-03-01 01:03:46
【问题描述】:
我想扩展 !!! 表达式,就像他们在 dplyr-verbs 中所做的那样,例如
aggregate_expressions <- list(n = quote(n()))
do_something(iris, !!!(aggregate_expressions))
并说我希望do_something 执行
do_something <- function(...) {
iris %>%
some_function( # expand the ... # ) # some_function(n = n())
}
会这样做,但 n = n() 是动态的
do_something <- function(...) {
iris %>%
some_function(n = n())
}
我试图追踪dplyr::summarise 的代码,我看到enquos(...) 将... 转换为quosure 的列表,但是我该如何应用 quosures?我想我打算从 quosure 创建代码 summarise(n = n()),然后使用 eval_tidy 评估我,但我不知道如何生成代码。我知道 pass ... summarise 有效,但实际用例是将其传递给 summarise.disk.frame,这意味着我不能只重用 dplyr::summarise
实际情况我不是
例如在 dplyr 中,下面通过使用 !!! 扩展 aggregate_expression 来工作
aggregate_expressions <- list(n = quote(n()))
iris %>%
group_by(Species) %>%
summarise(!!!(aggregate_expressions))
【问题讨论】:
-
你想要得到的最终结果是什么?
-
do_something % summarise( # expand the ... # ) # summarise(n = n()) }
-
但是当您致电
do_something(iris, !!!(aggregate_expressions))时,您期望得到什么? -
更新更明确
-
你不应该只打电话给
do_something(!!!aggregate_expressions)吗?您在函数内部调用iris,因此无需将其作为参数传递。