在使用quasiquotation的dplyr中,没有在拼接函数调用中看到列名

时间:2018-03-27 15:22:08

标签: r dplyr rlang

示例:

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

1 个答案:

答案 0 :(得分:0)

!!!用于更改对函数的调用。这意味着它会在当前环境中评估目标,以便在运行之前更改呼叫。您似乎想要使用函数调用后返回的on对象。但是为了在函数调用中使用b之类的东西,你需要延迟b的求值,直到函数实际运行。因此,!!!b的使用都需要在不同的时间进行评估,以便您遇到此问题。

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

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

或者,如果您要重新编写stats()函数,它可能看起来像这样

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

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