Лучшая практика для расстановки кавычек имен переменных в правой части глаголов dplyr - PullRequest
2 голосов
/ 02 октября 2019

Как лучше использовать имена переменных в качестве аргументов функций в правой части глаголов dplyr, таких как mutate?

Чтобы применить функцию к переменной в таблице с помощью mutate,тривиально, если мы используем имя столбца напрямую:

mtcars %>%
    select(mpg) %>%
    mutate(mpg = as.character(mpg)) %>%
    glimpse()
# Observations: 32
# Variables: 1
# $ mpg <chr> "21", "21", "22.8", "21.4", "18.7", "18.1", "14.3", "24.4", "22.8", "19.2", "17.8", "16.4", "17.3", "15.2", ...

Что если мы не знаем имя столбца, но оно хранится в переменной в виде строки? В качестве простого примера давайте сохраним строку «mpg» в var_of_interest, а затем изменим все значения на «5». Это хорошо с простым присваиванием в правой части выражения mutate (например, присвоение 5 всем значениям), если мы заключаем в кавычки с !! и :=:

var_of_interest <- colnames(mtcars)[1]
glimpse(var_of_interest)
# chr "mpg"

mtcars %>% select(var_of_interest) %>%
    mutate(!! var_of_interest := 5) %>%
    glimpse()
# Observations: 32
# Variables: 1
# $ mpg <dbl> 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5

Howмы должны использовать var_of_interest внутри функции в правой части вызова mutate? Например, внутри as.character. Следующее будет работать, без кавычек as.name(var_of_interest). ( Благодаря этому сообщению SO и ответу, используя as.symbol .)

mtcars %>%
    select(var_of_interest) %>%
    mutate(!! var_of_interest := as.character(!! as.name(var_of_interest))) %>%
    glimpse()
# Observations: 32
# Variables: 1
# $ mpg <chr> "21", "21", "22.8", "21.4", "18.7", "18.1", "14.3", "24.4", "22.8", "19.2", "17.8", "16.4", "17.3", "15.2", ...

Следующее, используя rlang::sym, также работает ( благодаря этому сообщению SO иответ ):

mtcars %>%
    select(var_of_interest) %>%
    mutate(!! var_of_interest := as.character(!! rlang::sym(var_of_interest))) %>%
    glimpse()
# Observations: 32
# Variables: 1
# $ mpg <chr> "21", "21", "22.8", "21.4", "18.7", "18.1", "14.3", "24.4", "22.8", "19.2", "17.8", "16.4", "17.3", "15.2", ...

Есть ли недостатки у любого из этих методов? Должны ли мы использовать quo или enquo вместо этого? Последние обсуждаются в этой виньетке , но я изо всех сил пытаюсь понять их использование, и я хотел бы услышать больше об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...