【发布时间】:2021-11-01 21:56:42
【问题描述】:
我想让我的函数的用户以 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))
【问题讨论】: