在函数中,我有时需要 Select 一个变量,如果它存在.

为此,函数dplyr::any_of()是完美的,但它只在标准判断下工作,将字符向量作为输入.

我正在寻找一个替代品,将工作作为一个替代品在下面的例子,感觉非常黑客:

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

该函数应该使用或不使用Species运行,就像在我的reprex中一样,但如果查询未知列时抛出错误是有意义的(与我的reprex不同).

推荐答案

给出您上一条关于请求缺少的变量需要错误的语句,这似乎并不是Any_Of类型的情况;当请求不可能的列时出错是很常见的,看起来您只是想有 Select 地传入一个额外的列名,即一个跳过的参数.

这可以通过简单地为第三个位置传递默认null来实现. ie.

library(tidyverse) 
library(rlang)
f2 = function(data, x1, x2,x3=NULL){
  data |>
    select({{x1}},
           {{x2}},
           {{x3}}) |> 
    names()
}

iris |> f2(Sepal.Length,Sepal.Width,Species)
iris |> f2(Sepal.Length,Sepal.Width)
iris |> f2(Sepal.Length,Sepal.Width,abc)

我们可以概括,取任意数量的位置,并try 用点来得到它们.

library(tidyverse) 
library(rlang)
f = function(data, x1, x2,...){
  data |>
    select({{x1}},
           {{x2}},
           !!!rlang::enquos(...)) |> 
    names()
}


#runs fine with a variable that is present
iris |> f(Sepal.Length,Sepal.Width,Species)
#  "Sepal.Length" "Sepal.Width"  "Species" 

#its optional and can be left out 
iris |> f(Sepal.Length,Sepal.Width)
#  "Sepal.Length" "Sepal.Width"  

# trying an absent variable correctly errors
iris |> f(Sepal.Length,Sepal.Width,SpeciesX)
# Error in `select()`:
#   ! Can't select columns that don't exist.
# ✖ Column `SpeciesX` doesn't exist.
# Run `rlang::last_trace()` to see where the error occurred.

R相关问答推荐

卸载安装了BRM的模型发出的警告

在特定列上滞后n行,同时扩展框架的长度

然后根据不同的列值有条件地执行函数

如何在emmeans中计算连续变量的对比度

将向量组合到一个数据集中,并相应地命名行

如何在ggplot中标记qqplot上的点?

如何优化向量的以下条件赋值?

非线性混合效应模型(NLME)预测变量的置信区间

我正在努力用R计算数据集中的中值逐步距离

R中边际效应包中Logistic回归的交互作用风险比

当我们有多个反斜杠和/特殊字符时使用Gsubing

如何在PackageStatus()中列出&q;不可用的包&q;?

如何根据数据帧中的值从该数据帧中提取值?

手动指定从相同数据创建的叠加图的 colored颜色

如何对r中包含特定(未知)文本的行求和?

有没有办法将不等长的列表转换为R中的数据帧

使用列名和r中的前缀 Select 列的CREATE函数

如何在R中使用因子行求和?

R:改进实现简单模型

以列名的字符向量作为参数按行应用自定义函数