在使用准引号的 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))
示例:
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))