在函数中,有时我需要仅选择存在的变量。
为此,函数
dplyr::any_of()
是完美的,但它仅适用于标准评估,以字符向量作为输入。
我正在寻找一种替代方案,可以作为以下示例中的替代品,感觉非常hacky:
library(tidyverse)
library(rlang)
f = function(data, x1, x2, gp){
gpname = as_label(enquo(gp))
data %>%
select(x1={{x1}}, x2={{x2}}, gp=any_of(gpname)) %>%
names()
}
iris %>% f(Sepal.Length,Sepal.Width,Species)
#> [1] "x1" "x2" "gp"
iris %>% f(Sepal.Length,Sepal.Width)
#> [1] "x1" "x2"
创建于 2024-03-15,使用 reprex v2.1.0
一种方法是使用
tidyselect::eval_select(strict=FALSE)
创建一个命名向量以传递给 select()
。 strict
参数允许忽略失败的选择:
library(tidyselect)
library(dplyr)
f <- function(data, x1, x2, gp){
vars <- eval_select(expr(c(x1 = {{x1}}, x2 = {{x2}}, {{gp}})), data, strict = FALSE)
iris %>%
select(vars) %>%
names()
}
iris %>% f(Sepal.Length, Sepal.Width, Species)
[1] "x1" "x2" "Species"
iris %>% f(Sepal.Length, Sepal.Width, foo)
[1] "x1" "x2"