r - 将 `c(x, y)` 作为函数参数转换为 R 中的 `c("x", "y")` (rlang/tidyevaluation)
问题描述
我想让我的函数的用户以 tidyeval 数据屏蔽方式输入变量,fun(x, c(y, z))
而不是fun("x", c("y", "z"))
,但是当他们输入参数时c(y, z)
,我希望能够将其用作字符向量,例如c("y", "z")
.
对于使用列名,我确实有一个严重过度的解决方法。也就是说,我{{
在dpylr::select()
调用中使用,然后提取列名:
fun_overkill <- function(data, cols) {
data_subset <- dplyr::select(data, {{cols}})
args_as_character_vector <- colnames(data_subset)
args_as_character_vector
}
fun_overkill(mtcars, c(mpg, drat))
显然,这不是最好的方法,也不能推广到我的向量参数不代表列名的情况。
我怀疑{rlang}
可能有答案,但有很多选择,我不明白术语。
这可能有用的一种情况是在创建模型公式时,您可以as.formula
在字符串上使用,该字符串是从字符向量创建的:
rhs <- paste(fun_overkill(mtcars, c(mpg, drat)), collapse = " + ")
lhs <- "~ "
as.formula(paste0(lhs, rhs))
解决方案
一种方法是使用(也可以) 捕获cols
表达式的变量,然后使用 . 从表达式中获取参数。这些现在是符号列表,因此您需要循环它们以使它们成为带有.enexpr()
enquo()
call_args()
as_string()
library(rlang)
fun <- function(data, cols) {
vars <- call_args(enexpr(cols))
vapply(vars, as_string, character(1), USE.NAMES = FALSE)
}
(fun(mtcars, c(mpg, drat)))
#> [1] "mpg" "drat"
rhs <- paste(fun(mtcars, c(mpg, drat)), collapse = " + ")
lhs <- "~ "
as.formula(paste0(lhs, rhs))
#> ~mpg + drat
由reprex 包(v2.0.1)于 2021-09-03 创建
公平地说,data
这里根本不需要争论。它就在那里,因为它在你的例子中。
推荐阅读
- javascript - 如何检查是否在数组中找到输入?
- angular - Angular EventEmitter 返回未定义的对象
- python - Python 使用 Setuptools 在 API 模式下构建 CFFI
- jquery - 根据价值选择选项
- go - 如何使用 go-mega 递归地列出文件
- parsing - yylval 可能是结构而不是联合?
- python - 用张量流训练模型,但损失不会下降?
- javascript - d3.scaleLinear 第二次调用时返回 NaN
- java - JAVAFX - 如何在启动应用程序时调用方法
- python - Python:从循环中更改列表值