R语言:如何从ellipsis中移除参数,解决重复传参报错?
解决R函数中...参数重复传递na.rm的问题
嘿,这个问题我太熟了!你遇到的是R里参数重复传递的典型问题——手动指定了na.rm,但...里又带了同一个参数,导致mean()收到两份na.rm赋值,可不就报错嘛。核心解决思路就是:从...对应的参数列表里把na.rm删掉,再传递给mean()。
给你修改后的可运行代码:
mymean <- function(x, ...){ dots <- list(...) # 先提取na.rm参数的值,然后把它从dots里移除 na_arg <- dots$na.rm dots$na.rm <- NULL # 这一步是关键!删掉dots里的na.rm,避免重复传递 # 如果用户没传na.rm,就用默认值TRUE if (is.null(na_arg)) { na_arg <- TRUE } # 现在传递处理后的dots,就不会有重复参数冲突了 mean(x, na.rm = na_arg, ... = dots) }
测试你给出的例子,现在都能正常运行:
set.seed(10); a <- c(rnorm(20), NA) mymean(a) ## [1] -0.06053267 mymean(a, trim = .5) ## [1] -0.08275319 mymean(a, na.rm = TRUE, trim = .1) # 现在不会报错,输出正常结果:-0.05349805
如果你平时常用tidyverse工具,还有更简洁的写法,用rlang包的函数来简化参数处理:
library(rlang) mymean <- function(x, ...){ dots <- list2(...) # 用%||%运算符快速处理默认值:如果dots$na.rm是NULL就取TRUE na_arg <- dots$na.rm %||% TRUE dots$na.rm <- NULL # 用exec()展开处理后的参数列表,写法更优雅 exec(mean, x = x, na.rm = na_arg, !!!dots) }
补充说明下报错原因
你原来的代码里,虽然提取了dots$na.rm的值,但没有把它从dots里删掉。调用mean(x, na.rm = na_arg, ...)时,...依然会把包含na.rm的原始参数传递进去,导致mean()同时收到手动指定的na.rm = na_arg和...里的na.rm,自然触发"formal argument matched by multiple actual arguments"的错误啦。
内容的提问来源于stack exchange,提问作者Tyler Rinker
相关产品推荐
相关产品推荐

