示例:
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
答案 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))