【问题标题】:With rlang, convert contents of `...` to a character vector使用 rlang,将 `...` 的内容转换为字符向量
【发布时间】:2018-08-02 22:13:17
【问题描述】:

我希望能够根据提供给函数... 部分的名称创建字符向量。

例如,如果我有函数foo(...) 并输入foo(x, y),我如何创建一个看起来像c("x", "y") 的字符向量?

我最感兴趣的是弄清楚如何为此使用rlang,但base 解决方案也很棒。

【问题讨论】:

  • 不是骗子,但几个月前我问了一个类似的问题,得到的答案可能会有所帮助:stackoverflow.com/q/50555526/5325862
  • 谢谢@camille!你是对的,这是密切相关的。

标签: r rlang


【解决方案1】:

你的意思是这样的吗?

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.characterNULL 转换为"NULL"map_chr(..., as.character) 由于NULL list 条目而引发错误。

【讨论】:

  • 有没有as.character(exprs(...))会失败的情况?
  • @joran 嗯,好问题。我不确定TBH;据我所知,NULL 条目的处理方式似乎有所不同。
  • 这正是我想要的!感谢@joran 和您的回答,我知道要小心 NULL 值。
  • 非常高兴它帮助了@bschneidr
  • 也可以考虑:foo &lt;- function(...) purrr:::map_chr(rlang::quos(...), rlang::quo_text)
猜你喜欢
  • 2021-09-24
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 2023-03-25
  • 2019-12-21
  • 2020-02-27
相关资源
最近更新 更多