【问题标题】:In dplyr using quasiquotation, not seeing column name in spliced function call在使用 quasiquotation 的 dplyr 中,在拼接函数调用中看不到列名
【发布时间】:2023-08-20 14:09:01
【问题描述】:

例子:

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

【问题讨论】:

  • 如果您尝试进行汇总以便拥有平均列和中值列,您可以这样做:summarize(mn = stats(b)[['mn']], md = stats(b)[['md']])

标签: r dplyr rlang


【解决方案1】:

!!! 旨在更改对函数的调用。这意味着它会评估当前环境中的目标,以便在运行之前更改调用。您似乎想使用函数调用后返回的 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))

【讨论】:

  • 谢谢。你的第一个答案就是我想要的。
最近更新 更多