You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言如何将符号向量转换为`...`参数传入rlang::nesting函数

解决方案

有两种常用实现方式,都可以满足需求:

方案1:使用tidy evaluation适配tidyr::nesting

利用rlang的元编程能力拆分符号向量,注入到nesting的...参数位置:

library(rlang)
library(tidyr)
library(dplyr)

# 示例数据
set.seed(1)
data <- tibble(a = sample(1:5, size = 10, replace = TRUE),
               b = sample(1:5, size = 10, replace = TRUE))

f <- function(category) {
  # 捕获传入的未求值表达式
  cat_expr <- enexpr(category)
  # 提取c()调用的所有参数,非c调用则直接作为单元素列表
  cols <- if (is_call(cat_expr, "c")) call_args(cat_expr) else list(cat_expr)
  # 将列符号拼接为nesting的参数
  data |>
    expand(nesting(!!!cols))
}

# 测试调用
f(category = c(a,b))

原理说明:!!!是rlang的拼接操作符,可以将列表内的多个表达式拆解为独立参数传入函数的...位置,完美适配nesting的参数要求。

方案2:更简单的替代实现(无需处理...转换)

用dplyr::group_by + dplyr::summarise直接获取唯一组合,效果和expand(nesting(...))完全等价,且原生支持c(a,b)格式的参数输入:

f <- function(category) {
  data |>
    group_by({{ category }}) |>
    summarise(.groups = "drop") |>
    select({{ category }})
}

两种方案的运行结果都和参考代码完全一致。


内容的提问来源于stack exchange,提问作者jokroese

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:48:04