Как использовать tidy eval NSE для расширения `выражения` - PullRequest
0 голосов
/ 01 марта 2020

Я хочу расширить выражение !!! так же, как это делают в dplyr-глаголах, например,

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() является динамическим c

do_something <- function(...) {
  iris %>%
    some_function(n = n())
}

Я попытался отследить код для dplyr::summarise, и я вижу, что enquos(...), который преобразует ... в список 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))

1 Ответ

1 голос
/ 01 марта 2020

Измените это так:

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

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