#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. Это объясняется здесь . По сути, левая часть
=
не может быть выражением, поэтому вам нужно использовать:=
вместо этого.