5

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)

参数n被传递给函数fand 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)
4

1 回答 1

11

您不能...在一个环境中拥有多个版本。但是,您可以做的是给每个被调用的子函数一个它们自己...的参数。这意味着他们将忽略任何与他们自己的形式参数不匹配的参数。

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

编辑以回答添加的问题:您可以制作 的新版本median,当您在自己的代码中调用它时,它将覆盖预定义的函数。(由于 R 命名空间的工作方式,其他预定义函数仍将使用现有版本。)

median <- function(x, na.rm=FALSE, ...)
base::median(x, na.rm)  # function median exported from base package
于 2013-07-13T15:50:10.627 回答