R语言do.call调用时能否传入当前函数不需要的额外参数?
方案1:修改函数定义,添加...参数
R函数中...可以捕获所有未匹配的命名参数,不会触发未使用参数的报错,是最简便的实现方式。
修改后的代码示例:
# 函数定义添加...捕获多余参数 a <- function(p, q, ...){p * q} b <- function(m, n, ...){paste(m, n)} funs <- c("a", "b") for(i in funs){ res <- do.call(i, list(p = 3, q = 3, m = "Yes", n = "No")) print(res) }
运行输出:
[1] 9 [1] "Yes No"
方案2:调用前过滤参数列表(无需修改原函数)
如果无法修改原函数定义(比如调用的是第三方包的内置函数),可以在调用前通过formals()获取目标函数的形参列表,从总参数集中筛选出匹配的参数再传入do.call。
代码示例:
# 无需修改原函数定义 a <- function(p, q){p * q} b <- function(m, n){paste(m, n)} funs <- c("a", "b") # 统一的总参数集 all_args <- list(p = 3, q = 3, m = "Yes", n = "No") for(i in funs){ # 获取当前函数的所有形参名 target_args <- names(formals(i)) # 筛选匹配的参数 used_args <- all_args[names(all_args) %in% target_args] # 执行调用 res <- do.call(i, used_args) print(res) }
运行结果和方案1完全一致。如果目标函数本身已经定义了...接收动态参数,调整筛选逻辑保留对应参数即可适配。
内容的提问来源于stack exchange,提问作者thebilly
相关产品推荐
相关产品推荐

