我花了一段时间才明白,当在具有粘合语法列名的 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)
实际上,更重要的是要使用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)