我正在创建一个工作流,其中包含相同的管道步骤,包括重命名,选择方式,然后使用我在管道之前提供的名称进行全部变异。
我已经成功使用enquo()
和!!
(爆炸)重命名为所需的字符串,然后再次选择它,但是当我到达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))
答案 0 :(得分:0)
尝试将第一行替换为:
new_var <- sym("new_name")
在这种情况下,您现有的代码应该运行,但是您也可以简化它,例如:
t1 %>%
rename( !! new_var := old_name) %>%
select(Year, !! new_var) %>%
mutate(test_var = (!! new_var))
答案 1 :(得分:0)
“ 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