Как {{}} двойные фигурные скобки работают в dplyr?

#r #tidyverse #curly-braces #rlang

#r #tidyverse #фигурные скобки #rlang

Вопрос:

Я видел выступление Хэдли на RConf, и он упомянул использование двойных скобок для вызова переменных в аккуратных оценках.

Я искал в Google, но не смог найти ничего, что говорило бы о том, когда их использовать.

Каков вариант использования двойных скобок в dplyr?

Ответ №1:

{{}} (фигурные-фигурные) имеют множество приложений. Это называется метапрограммированием и используется для написания функций. Например, рассмотрим этот пример :

 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
  

Теперь, если вы хотите записать это как функцию, передающую переменные без кавычек (не строку), вы можете использовать {{}} как :

 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
  

Обратите внимание, что вы передаете все переменные без кавычек, а group-column ( cyl ) , столбец, который агрегируется ( mpg ), имя нового столбца ( new_mpg ) являются динамическими. Это был бы только один вариант его использования.

Чтобы узнать больше, обратитесь к:

Комментарии:

1. Ронак, значит, {{}} используется для замены операторов enquo() и !!? т.е. выполняет ли curly-curly кавычки и кавычки одновременно?

2. Да, точно. Он выполняет обе операции вместе.

3. Как это будет работать, если то, что заключено в {{}}, представляет собой группу переменных (например, в group_by ), а не только одну?

4. Привет. Какова цель использования ‘:=’ здесь вместо ‘=’?

5. Это объясняется здесь . По сути, левая часть = не может быть выражением, поэтому вам нужно использовать := вместо этого.