覆盖函数内的参数

时间:2016-12-05 10:30:22

标签: r function arguments

我有一个允许大量参数的函数,为了使事情更容易,我决定包含另一个变量,其中参数作为列表引入(在下面的例子中名为args)。

foo <- function(x, a, b, c, args, ...) {

ifelse(missing(a)==TRUE, a<-1, NA)
ifelse(missing(b)==TRUE, b<-2, NA)
ifelse(missing(c)==TRUE, c<-3, NA)

if(missing(args)==FALSE) {
for(i in 1:length(args)) {
    tmp <- as.vector(args[[i]])
    assign(names(args)[i], get("tmp"))
}
}

# Need something that overwrites "args" when the 
# other arguments are specified

print(list(x=x, a=a, b=b, c=c))

}

函数foo给出以下内容:

foo(0)
$x
[1] 0

$a
[1] 1

$b
[1] 2

$c
[1] 3

此处my_args记录配置文件参数。

my_args <- list(a=1, b=1, c=1)

生产:

foo(0, args=my_args)
$x
[1] 0

$a
[1] 1

$b
[1] 1

$c
[1] 1


每当在函数中指定相应的参数时,我想找到一种方法来覆盖args中的值。虽然用户为同一个参数指定了两个不同的值,但在某些情况下这是有意义的。

例如,

foo(0, args=my_args, c=3)
$x
[1] 0

$a
[1] 1

$b
[1] 1

$c
[1] 3

这是为了查看在c=3中记录的个人资料中my_args时会发生什么。

我非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

这允许通过args列表或...传递参数,在这种情况下,它们会覆盖args中的参数。如果两个参数都没有传递,那么它将采用默认值。如果在stopifnotdefaults中传递...中列出的参数以外的参数,则args语句会引发错误。它可用于防止传递defaults中未列出的其他参数。或者,可以完全省略该行以允许无限制的参数。

foo <- function(x, ..., args = list()) {   
  defaults <- list(a = -1, b = -2, c = -3, d = -4)  
  Args <- Reduce(modifyList, list(defaults, args, list(...)))
  stopifnot(all(names(Args) %in% names(defaults)))
  Args
}

foo(0, a = 1, b = 2, args = list(a = 10, c = 20))

,并提供:

$a
[1] 1

$b
[1] 2

$c
[1] 20

$d
[1] -4