【问题标题】:Converting a vector of symbols to input for `...`将符号向量转换为“...”的输入
【发布时间】:2021-11-22 04:57:34
【问题描述】:

我有一个 R 函数,我想将符号向量 (c(a, b)) 转换为 ... 的输入(例如 a, b)。

# create data
set.seed(1)
data <- dplyr::tibble(a = sample(1:5, size = 10, replace = TRUE),
                      b = sample(1:5, size = 10, replace = TRUE))

函数应该如下所示:

f <- function(category) {
  # trying to work out
}
f(category = c(a,b))

并给出结果:

data |>
  tidyr::expand(tidyr::nesting(a, b))

困难在于我的函数将输入作为符号向量提供,而rlang::nesting 将输入作为...

如何从一种格式转换为另一种格式?还是应该使用rlang::nesting以外的其他功能?

【问题讨论】:

  • 为什么不能定义f &lt;- function(...) {category &lt;- do.call(c, list(...))}
  • 你能扩展这个想法@Roland吗?我不清楚我们如何将其整合到答案中。
  • 我可能可以,但你需要问一个不涉及 tidyverse 的问题。

标签: r lazy-evaluation evaluation rlang tidyeval


【解决方案1】:

通过c() 提供一组变量的接口应基于 tidyselect。最简单的方法是使用select()

先选择然后拼接数据:

f <- function(data, category) {
  sel <- dplyr::select(data, {{ category }})
  tidyr::expand(data, tidyr::nesting(!!!sel))
}

f(data, category = c(a, b))
#> # A tibble: 8 × 2
#>       a     b
#>   <int> <int>
#> 1     1     2
#> 2     1     5
#> 3     2     2
#> 4     2     5
#> 5     3     1
#> 6     3     5
#> 7     4     5

因为您通过select() 进行交互,您可以获得所有 tidyselect 功能:

f(data, category = starts_with(c("a", "b")))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多