Как передать имя динамической переменной, созданное с помощью enquo (), в функцию dplyr mutate для оценки?

Я создаю рабочий процесс, который содержит те же шаги конвейера: переименование, выбор по, а затем изменение всего, используя имя, которое я предоставил до канала.

Мне удалось использовать enquo() и !! (bang bang), чтобы переименовать в желаемую строку, а затем выбрать ее снова, но когда я достигаю шага изменения, он либо повторяет текстовую строку как значения столбца, либо не будет оценивать.

Я воссоздал приведенный ниже код:

#Testing rename, select, and mutate use cases for enquo()

#Load packages
library(dplyr)
library(rlang)
library(magrittr)

#Create name I want to pass
new_var <- quo("new_name")

#Create Test Data
t1 <- tibble(Year = c(2000:2004),
             old_name = c(NA, 1, 1, 1, NA))

Я могу переименовать столбец с quo_name() и :=

t1 %>% 
  rename( !! quo_name(new_var) := old_name)

Я могу выбрать его с помощью !!

t1 %>% 
  rename( !! quo_name(new_var) := old_name) %>% 
  select(Year, !!new_var)

Но я не могу затем вызвать этот столбец в mutate и использовать значения

t1 %>% 
  rename( !! quo_name(new_var) := old_name) %>% 
  select(Year, !!new_var) %>% 
  mutate(test_var = (!! new_var))

person Adam Kemberling    schedule 07.02.2019    source источник


Ответы (2)


Объект 'new_var' - это quosure в строке. Извлеките строку, преобразуйте ее в символ и затем выполните оценку

t1 %>% 
   rename( !! quo_name(new_var) := old_name) %>% 
   select(Year, !!new_var) %>% 
   mutate(testvar = !! rlang::sym(rlang::quo_name(new_var)))
# A tibble: 5 x 3
#   Year new_name testvar
#  <int>    <dbl>   <dbl>
#1  2000       NA      NA
#2  2001        1       1
#3  2002        1       1
#4  2003        1       1
#5  2004       NA      NA

Кроме того, если мы начнем с new_var в quosure без кавычек, тогда код OP работает

new_var = quo(new_name)
t1 %>% 
     rename(!! new_var := old_name) %>% 
     select(Year, !!new_var) %>% 
     mutate(testvar = !! new_var)
# A tibble: 5 x 3
#   Year new_name testvar
#  <int>    <dbl>   <dbl>
#1  2000       NA      NA
#2  2001        1       1
#3  2002        1       1
#4  2003        1       1
#5  2004       NA      NA
person akrun    schedule 07.02.2019
comment
Это тоже работает и поддерживает мой оригинальный new_var <- enquo("new_name") - person Adam Kemberling; 07.02.2019

Попробуйте заменить первую строку на:

new_var <- sym("new_name")

В этом случае ваш существующий код должен работать, но вы также можете его упростить, например:

t1 %>% 
  rename( !! new_var := old_name) %>% 
  select(Year, !! new_var) %>% 
  mutate(test_var = (!! new_var))
person arg0naut91    schedule 07.02.2019
comment
Пожалуйста! Рассмотрите возможность принятия / голосования за ответ, если он был полезен. - person arg0naut91; 07.02.2019