使用 rlang,将 `...` 的内容转换为字符向量
With rlang, convert contents of `...` to a character vector
我希望能够根据提供给函数 ...
部分的名称创建字符向量。
例如,如果我有函数 foo(...)
并键入 foo(x, y)
,我如何创建一个看起来像 c("x", "y")
的字符向量?
我最感兴趣的是弄清楚如何为此使用 rlang
,但是 base
解决方案也很棒。
你的意思是这样的吗?
foo <- function(...) unname(purrr::map_chr(rlang::exprs(...), as.character))
foo(x, y)
#[1] "x" "y"
identical(foo(x, y), c("x", "y"))
#[1] TRUE
或者我们可以直接在从 rlang::exprs
返回的 list
上使用 as.character
foo <- function(...) as.character(rlang::exprs(...))
在回答@joran 的问题时,说实话我不确定;考虑以下情况
as.character(rlang::exprs(NULL, a, b))
#[1] "NULL" "a" "b"
map_chr(rlang::exprs(NULL, a, b), as.character)
#Error: Result 1 is not a length 1 atomic vector
因此 as.character
将 NULL
转换为 "NULL"
而 map_chr(..., as.character)
会因 NULL
list
条目而引发错误。
我希望能够根据提供给函数 ...
部分的名称创建字符向量。
例如,如果我有函数 foo(...)
并键入 foo(x, y)
,我如何创建一个看起来像 c("x", "y")
的字符向量?
我最感兴趣的是弄清楚如何为此使用 rlang
,但是 base
解决方案也很棒。
你的意思是这样的吗?
foo <- function(...) unname(purrr::map_chr(rlang::exprs(...), as.character))
foo(x, y)
#[1] "x" "y"
identical(foo(x, y), c("x", "y"))
#[1] TRUE
或者我们可以直接在从 rlang::exprs
list
上使用 as.character
foo <- function(...) as.character(rlang::exprs(...))
在回答@joran 的问题时,说实话我不确定;考虑以下情况
as.character(rlang::exprs(NULL, a, b))
#[1] "NULL" "a" "b"
map_chr(rlang::exprs(NULL, a, b), as.character)
#Error: Result 1 is not a length 1 atomic vector
因此 as.character
将 NULL
转换为 "NULL"
而 map_chr(..., as.character)
会因 NULL
list
条目而引发错误。