在 R (rlang/tidyevaluation) 中将 `c(x, y)` 作为函数参数转换为 `c("x", "y")`
Convert `c(x, y)` as function argument to `c("x", "y")` in R (rlang/tidyevaluation)
我想让我函数的用户以统一的数据屏蔽方式输入变量,即 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))
一种方法是使用 enexpr()
捕获表达式的 cols
变量(enquo()
也可以),然后使用 [=14= 从表达式中获取参数].这些现在是一个符号列表,因此您需要遍历它们以使它们成为具有 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 package (v2.0.1)
于 2021-09-03 创建
公平地说,这里根本不需要 data
参数。它就在那里,因为它在您的示例中就在那里。
我想让我函数的用户以统一的数据屏蔽方式输入变量,即 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))
一种方法是使用 enexpr()
捕获表达式的 cols
变量(enquo()
也可以),然后使用 [=14= 从表达式中获取参数].这些现在是一个符号列表,因此您需要遍历它们以使它们成为具有 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 package (v2.0.1)
于 2021-09-03 创建公平地说,这里根本不需要 data
参数。它就在那里,因为它在您的示例中就在那里。