V1:假设功能f(x, ...)和g(x , ...)可以传递不同的参数.如果我要使用它们来定义一个新函数,我可以通过...明确定义的运算符传递参数吗?举个简单的例子:
f1 = function(x, n = 1) x + n
g1 = function(x, m = 1) x + m
f = function(x, ...) f1(x, ...)
g = function(x, ...) g1(x, ...)
h = function(x, ...) {
fgList = list()
fgList[["f"]] = f(x, ...)
fgList[["g"]] = g(x, ...)
return(fgList)
}
h(1:4)
# $f
# [1] 2 3 4 5
# $g
# [1] 2 3 4 5
h(1:4, n = 2)
# Error in g1(x, ...) : unused argument (n = 2)
Run Code Online (Sandbox Code Playgroud)
该参数n被传递到函数f和g,但它仅用于函数定义良好的f.我想减轻这种情况.
V2:如果它们是我定义的功能,那么Hong Ooi的解决方案可以完美地运行.
这个解决方案是否可以扩展为没有...参数或等效...的预定义函数,可以将参数"添加"到没有参数的预定义函数中吗?例如:
h = function(x, ...) mean(x, ...) * median (x, ...)
h(1:4, test = 1)
## Error in median(x, ...) : unused argument (test = 1)
Run Code Online (Sandbox Code Playgroud)
Hon*_*Ooi 10
您不能...在一个环境中拥有多个版本.但是,你可以做的是给每个被调用的子函数一个自己的...参数.这意味着他们将忽略传递的任何与自己的正式参数不匹配的参数.
f1 = function(x, n = 1, ...) x + n
g1 = function(x, m = 1, ...) x + m
> h(1:4, n = 2)
$f
[1] 3 4 5 6
$g
[1] 2 3 4 5
Run Code Online (Sandbox Code Playgroud)
编辑以回答添加的问题:您可以创建一个新版本median,当您在自己的代码中调用它时,它将覆盖预定义的函数.(由于R命名空间如何工作,其他预定义函数仍将使用现有版本.)
median <- function(x, na.rm=FALSE, ...)
base::median(x, na.rm) # function median exported from base package
Run Code Online (Sandbox Code Playgroud)