我花了一段时间才明白,当在具有粘合语法列名的 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)
但是如果
var_x <- ensym(var_x)
被删除,我得到
Error in eval(parse(text = text, keep.source = FALSE), envir) :
object 'x' not found
当我们转换为符号时,使用
!!
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)
# A tibble: 5 × 3
a x is_four_in_x
<int> <dbl> <dbl>
1 1 2 NA
2 2 4 4
3 3 6 NA
4 4 8 NA
5 5 10 NA
或没有
ensym
test1 <- function(data, var_x) {
data %>% mutate("is_four_in_{{var_x}}" :=
if_else({{var_x}}==4,{{var_x}},NA_integer_))
}
> data_set %>% test1(x)
# A tibble: 5 × 3
a x is_four_in_x
<int> <dbl> <dbl>
1 1 2 NA
2 2 4 4
3 3 6 NA
4 4 8 NA
5 5 10 NA
ensym
也可以使用字符串作为输入。为此,我们可能不得不使用 !!
而不是 {{}}
.