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

问题描述 投票:0回答:1

我花了一段时间才明白,当在具有粘合语法列名的 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 
r dplyr syntax
1个回答
1
投票

当我们转换为符号时,使用

!!

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
也可以使用字符串作为输入。为此,我们可能不得不使用
!!
而不是
{{}}
.

© www.soinside.com 2019 - 2024. All rights reserved.