R 如何包装使用 tidyeval 的函数?

R how to wrap a function that uses tidyeval?

我有一个使用 tidyeval 的函数,如下面定义的 select_this。我有另一个函数 wrapper_select_this 包装它,但出现以下错误。有没有一种简单的方法来调整 wrapper_select_this 工作(在这种情况下:输出与函数 select_this 相同)?

library(tidyverse)

z <- c("a", "b")
df <- data.frame(Z = 1:3, a = 1:3, b = 1:3)

select_this <- function(df, x){
  x_upper <- enexpr(x) %>% str_to_upper
  
  df %>%
    select(
      all_of(x_upper), all_of(x)
    )
}

wrapper_select_this <- function(df, x){
  df %>% select_this(x)
  
}

df %>% select_this(z)
#>   Z a b
#> 1 1 1 1
#> 2 2 2 2
#> 3 3 3 3

df %>% wrapper_select_this(z)
#> Error: Can't subset columns that don't exist.
#> x Column `X` doesn't exist.

reprex package (v2.0.1)

于 2022-04-07 创建

如果您更改 select_this() 以支持 quosures,您可以使用 {{ 与之交互。在这种情况下,您可以使用 as_name() 将潜在的 quosured 符号转换为字符串:

z <- c("a", "b")
df <- data.frame(Z = 1:3, a = 1:3, b = 1:3)

select_this <- function(df, x) {
  x_upper <- toupper(rlang::as_name(enquo(x)))

  df %>%
    select(all_of(x_upper), all_of(x))
}

df %>% select_this(z)
#>   Z a b
#> 1 1 1 1
#> 2 2 2 2
#> 3 3 3 3

然后使用{{与之交互:

wrapper_select_this <- function(df, x){
  df %>% select_this({{ x }})
}

df %>% wrapper_select_this(z)
#>   Z a b
#> 1 1 1 1
#> 2 2 2 2
#> 3 3 3 3

我不得不说,我发现您同时通过分解名称和包含在同名 env-var 中的列名称来选择列有点令人困惑。