如何通过`...`扩展R tidyverse函数以支持任意自定义参数
需求实现说明
这个需求在R中完全可以实现,核心思路是捕获...传入的所有动态参数,统一应用和原有三个参数一致的处理逻辑,再动态传入到网格生成、分组汇总的步骤中即可。
修改后的完整函数代码
library(dplyr) library(stringr) foo <- function(time = 1, outcome = 1, trt_gr = 1, ...){ # 处理原有固定参数 fixed_params <- list( time = seq_len(time), outcome = seq_len(outcome), trt_gr = seq_len(trt_gr) ) # 捕获...传入的动态参数,逐个应用seq_len处理 dot_params <- list(...) dot_params <- lapply(dot_params, seq_len) # 合并所有参数 all_params <- c(fixed_params, dot_params, list(info. = c("control","treatment"))) # 生成全量网格 data <- expand.grid(all_params) # 动态提取所有非info.的列作为分组列 group_cols <- setdiff(names(all_params), "info.") # 分组汇总 data %>% group_by(across(all_of(group_cols))) %>% summarise(info. = str_c(sort(info., decreasing = TRUE), collapse = ' vs. '), .groups = 'drop') }
调用测试示例
比如新增两个动态参数gender和age_group,调用方式和输出如下:
# 传入自定义动态参数 foo(gender = 2, age_group = 3)
输出结果会自动包含新增的gender、age_group两个维度,每个维度的取值都是对应的seq_len生成的序列,info.字段的生成逻辑和原有逻辑完全一致。
关键逻辑说明
- 用
list(...)捕获用户传入的所有动态参数,统一执行seq_len处理,保证和原有三个参数的处理逻辑一致 - 动态生成分组列,不需要手动修改分组规则,新增的参数会自动加入分组维度
- 完全兼容原有调用方式,原有不带
...参数的调用逻辑不会受到任何影响
内容的提问来源于stack exchange,提问作者Reza
相关产品推荐
相关产品推荐

