{{}} 双大括号如何在 dplyr 中工作?

Cau*_*der 7 r curly-braces tidyverse rlang

我在RConf 上看到 Hadley 的演讲,他提到在 tidy evals 中使用双括号调用变量。

我搜索了谷歌,但我找不到任何关于何时使用它们的信息。

dplyr 中双括号的用例是什么?

Ron*_*hah 17

{{}}(curly-curly) 有很多应用。它被称为元编程,用于编写函数。例如,考虑这个例子:

library(dplyr)
library(rlang)

mtcars %>% group_by(cyl) %>% summarise(new_mpg = mean(mpg))

# A tibble: 3 x 2
#    cyl new_mpg
#  <dbl>   <dbl>
#1     4    26.7
#2     6    19.7
#3     8    15.1
Run Code Online (Sandbox Code Playgroud)

现在如果你想把它写成一个传递不带引号的变量(不是字符串)的函数,你可以使用{{}}as :

my_fun <- function(data, group_col, col, new_col) {
  data %>%
    group_by({{group_col}}) %>%
    summarise({{new_col}} := mean({{col}}))
}

mtcars %>% my_fun(cyl, mpg, new_mpg)

#    cyl new_mpg
#  <dbl>   <dbl>
#1     4    26.7
#2     6    19.7
#3     8    15.1
Run Code Online (Sandbox Code Playgroud)

请注意,您传递的所有变量都没有引号,并且组列 ( cyl)、正在聚合的列 ( mpg)、新列的名称 ( new_mpg) 都是动态的。这只是它的一个用例。

要了解更多信息,请参阅:

  • Ronak,所以用 {{}} 来代替 enquo() 和 !! 运营商?即 curly-curly 是否同时执行引用和取消引用? (2认同)
  • 对,就是这样。它同时执行这两个操作。 (2认同)
  • 你好。这里使用':='而不是'='的目的是什么? (2认同)
  • [此处]对此进行了解释(https://adv-r.hadley.nz/quasiquotation.html#tidy-dots)。基本上,“=”的左侧不能是表达式,因此您需要使用“:=”代替。 (2认同)