我希望能够使用省略号...
并在父函数内的多个子函数中使用它。这样做会抛出一个错误,因为我将z
传递给没有fun1
参数的z
。
tester <- function(x, ...) {
list(a=x, b=fun1(...), c=fun2(...))
}
fun1 <- function(y) y * 6
fun2 <- function(z) z + 1
tester(z=4, y=5, x=6)
## > tester(z=4, y=5, x=6)
## Error in fun1(...) : unused argument (z = 4)
在多个子函数中使用省略号中的参数的最通用方法是什么。假装问题变得更糟,我们有10000个子函数,每个函数从...
得到不同的参数。所需的输出是:
$a
[1] 6
$b
[1] 30
$c
[1] 5
我怀疑捕获每个子函数的形式并与...
中的命名参数匹配可能是有用的,但这看起来不那么普遍(但可能会有所好处)。
答案 0 :(得分:1)
如果您无法更改输入功能,可以试试这个:
tester <- function(x, ...) {
args <- as.list(match.call())[-1]
args1 <- head(names(as.list(args(fun1))), -1)
args2 <- head(names(as.list(args(fun2))), -1)
list(a=x, b=do.call(fun1, args[names(args) %in% args1]),
c=do.call(fun2, args[names(args) %in% args2]))
}
fun1 <- function(y) y * 6
fun2 <- function(z) z + 1
tester(z=4, y=5, x=6)
#$a
#[1] 6
#
#$b
#[1] 30
#
#$c
#[1] 5
它非常复杂,如果你遇到龙,我不会感到惊讶。
答案 1 :(得分:1)
@ nicola的回答:
tester <- function(x, ...) {
list(a=x, b=fun1(...), c=fun2(...), d=path.expand2(...))
}
fun1 <- function(y, ...) y * 6
fun2 <- function(z, ...) z + 1
path.expand2 <- function(path, ...) path.expand(path)
tester(z=4, y=5, x=6, path="~/thepath")
## $a
## [1] 6
##
## $b
## [1] 30
##
## $c
## [1] 5
##
## $d
## [1] "C:/Users/trinker/thepath"