在使用准引号的 dplyr 中,在拼接函数调用中看不到列名

In dplyr using quasiquotation, not seeing column name in spliced function call

示例:

library(dplyr)

df <- tibble(a = c(10, 10, 10, 20, 20),
             b = c(1, 2, 10, 2, 4))

## produces desired result:
df %>%
    group_by(a) %>%
    summarize(mn = mean(b), md = median(b))

stats <- function(x){
    list(mn = mean(x), md = median(x)) }

## object 'b' not found:
df %>%
    group_by(a) %>%
    summarize(!!! stats(b))

调用 stats(b) 没有看到列 b。不涉及更改 stats 函数的最简单解决方案是什么?

R 版本 3.4.3,dplyr 版本 0.7.2

!!! 是为了改变对函数的调用。这意味着它会评估当前环境中的目标,以便在 运行 之前更改调用。您似乎想使用函数调用后返回的 on 对象。但是为了在那个函数调用中使用像 b 这样的东西,你需要延迟 b 的计算直到函数实际上是 运行。所以 !!!b 的使用都需要评估不同的时间所以你 运行 进入这个问题。

这是您仍然应该使用 do() 的东西,请参阅 dplyr summarise() with multiple return values from a single function。例如你可以做

df %>%
  group_by(a) %>%
  do(data.frame(stats(.$b)))

或者,如果您要 re-write stats() 函数,它可能看起来像这样

stats <- function(x){
  x <- enquo(x)
  quos(mn = mean(!!x), md = median(!!x)) }

df %>%
  group_by(a) %>%
  summarize(!!! stats(b))