与 NSE 一起使用的 `any_of()` 的替代方案?

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

在函数中,有时我需要仅选择存在的变量。

为此,函数

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

r dplyr
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"
© www.soinside.com 2019 - 2024. All rights reserved.