我想创建一个函数来判断向量中是否包含裸露的表达式.该函数应独立于输入数据的情况工作.
计算各种表达式的一个简单解决方案是使用tidyselect::eval_select()
.例如,这里有一个伪函数,它判断表达式是a
、b
还是c
.
is_abc <- function(...) {
expr <- rlang::expr(c(...))
data <- rlang::set_names(letters)
out <- tidyselect::eval_select(expr, data)
names(out) %in% letters[1:3]
}
is_abc(a, b, z)
#> [1] TRUE TRUE FALSE
is_abc(c(a, b, z))
#> [1] TRUE TRUE FALSE
由reprex package(v2.0.1)于2023-12-27创建
问题是,我认为不可能在不编辑tidyselect::eval_select()
(或使用特殊的 Select 帮助器)的情况下使其不区分大小写.
is_abc(c(a, B, z))
#> Error in `is_abc()`:
#> ! Can't subset columns that don't exist.
#> ✖ Column `B` doesn't exist.
或者,我可以使用rlang::enexprs()
来获取符号列表,然后在更改大小写或与向量进行比较时将其转换为字符类型:
is_abc <- function(...) {
exprs <- rlang::enexprs(...)
tolower(exprs) %in% tolower(letters[1:3])
}
is_abc(a, b, z)
#> [1] TRUE TRUE FALSE
is_abc(a, B, z)
#> [1] TRUE TRUE FALSE
由reprex package(v2.0.1)于2023-12-27创建
现在的问题是,这不适用于更复杂的表达式,因为这会将整个表达式转换为字符串:
is_abc(c(a, b, z))
#> [1] FALSE
这个问题有没有一个简单的解决方案,这样我就可以让一个函数在这两种情况下都工作,而不需要依赖于输入的大小写?
例如:
# desired behaviour
is_abc(c(a, B), z)
#> [1] TRUE TRUE FALSE