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 中的列名称来选择列有点令人困惑。
我有一个使用 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 中的列名称来选择列有点令人困惑。