在 dplyr>=1.0 中,为什么当在 mutate 中使用动态列名时,列名必须是 ensym ?

Pon*_*lis 5 syntax r dplyr

我花了一段时间才明白,当在具有粘合语法列名的 mutate 函数中使用时,函数中的列名必须是 ensym。理由是什么?为什么我必须使用 ensym?为什么 和 不够{{}}{}

工作正常:

a <- 1:5
data_set <- tibble(a,x=a*2)

test_function <- function(data,var_x){
  var_x <- ensym(var_x)
  data %>% mutate("is_four_in_{var_x}":=if_else({{var_x}}==4,{{var_x}},NA_integer_)) %>% 
    return()
}


data_set %>% test_function(x)
Run Code Online (Sandbox Code Playgroud)

但如果

var_x <- ensym(var_x) 被删除,我得到

Error in eval(parse(text = text, keep.source = FALSE), envir) :
Run Code Online (Sandbox Code Playgroud)
object 'x' not found 
Run Code Online (Sandbox Code Playgroud)

MrF*_*ick 1

实际上,更重要的是要使用glue语法,您需要一组额外的{}. 所以你真的需要

test_function <- function(data,var_x){
  data %>% 
  mutate("is_four_in_{{var_x}}":=if_else({{var_x}}==4,{{var_x}},NA_integer_)) %>% 
    return()
}
Run Code Online (Sandbox Code Playgroud)

如果您只有一个{},那么这只是一个简单的字符串值。您需要额外的 {} 来获取捕获的符号名称。比较一下

test_function <- function(data,var_x){
  number <- "four"
  data %>% 
  mutate("is_{number}_in_{{var_x}}":=if_else({{var_x}}==4,{{var_x}},NA_integer_)) %>% 
    return()
}
Run Code Online (Sandbox Code Playgroud)