我有一个允许大量参数的函数,为了使事情更容易,我决定包含另一个变量,其中参数作为列表引入(在下面的例子中名为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
时会发生什么。
我非常感谢你的帮助。
答案 0 :(得分:1)
这允许通过args
列表或...
传递参数,在这种情况下,它们会覆盖args
中的参数。如果两个参数都没有传递,那么它将采用默认值。如果在stopifnot
或defaults
中传递...
中列出的参数以外的参数,则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