【问题标题】:How to use tidy eval NSE to expand a `an expression`如何使用 tidy eval NSE 扩展“表达式”
【发布时间】: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,因此无需将其作为参数传递。

标签: r rlang tidyeval nse


【解决方案1】:

修改如下:

do_something <- function(x) {
  iris %>%
    summarise(!!!x)
}

aggregate_expressions <- list(n = quote(n()))
do_something(aggregate_expressions)
##     n
## 1 150

【讨论】:

  • (请注意,为了稳健性,最好将表达式列表创建为 quosures,例如使用 vars()。)
  • 这没有抓住重点,因为 summarise(!!!x) 有效,因为 summarise 旨在处理 !!!但它不适用于其他一些功能,
  • 除了我直接从问题中获取的代码之外,没有给出do_something 的示例。请修正问题并提供完整示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多