【问题标题】:How do {{}} double curly brackets work in dplyr?{{}} 双花括号如何在 dplyr 中工作?
【发布时间】:2021-01-11 20:12:03
【问题描述】:

我在 RConf 看到了 Hadley 的演讲,他提到在整洁的 eval 中使用双括号来调用变量。

我在 Google 上进行了搜索,但找不到任何关于何时使用它们的信息。

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

【问题讨论】:

    标签: r tidyverse curly-braces rlang


    【解决方案1】:

    {{}} (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
    

    现在如果你想把它写成一个传递不带引号的变量(不是字符串)的函数,你可以使用{{}} 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
    

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

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

    【讨论】:

    • Ronak,所以用 {{}} 代替 enquo() 和 !!运营商?即 curly-curly 是否同时执行引用和取消引用?
    • 是的,完全正确。它同时执行这两个操作。
    • 如果包含在 {{}} 中的是一组变量(例如在 group_by 中)而不仅仅是一个变量,这将如何工作?
    • 嗨。在这里使用 ':=' 而不是 '=' 的目的是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 2015-04-14
    • 2013-08-07
    • 2019-07-24
    • 1970-01-01
    相关资源
    最近更新 更多