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

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

Я искал в Google, но не нашел ничего, говорящего о том, когда их использовать.

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


person Cauder    schedule 25.09.2020    source источник


Ответы (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

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

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

person Ronak Shah    schedule 25.09.2020
comment
Ронак, поэтому {{}} используется для замены enquo () и !! операторы? т.е. curly-curly выполняет как кавычки, так и отмены кавычек одновременно? - person Karthik S; 26.09.2020
comment
Да, точно. Он выполняет обе операции вместе. - person Ronak Shah; 26.09.2020
comment
Как это будет работать, если то, что заключено в {{}}, представляет собой группу переменных (например, в group_by), а не только одну? - person user11151932; 02.01.2021