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
相关产品推荐
相关产品推荐

