Ada*_*ing 5 r dplyr rlang quosure
我正在创建一个工作流程,其中包含相同的管道步骤:重命名、选择依据,然后使用我在管道之前提供的名称来更改所有内容。
我已经成功使用enquo()and !!(bang bang) 重命名为我想要的字符串,然后再次选择它,但是当我到达 mutate 步骤时,它要么重复文本字符串作为列值,要么不会计算。
我重新创建了下面的代码:
#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))
“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_varin开始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