发送到多个函数的命名省略号参数的通用方法

时间:2014-09-15 12:47:42

标签: r

我希望能够使用省略号...并在父函数内的多个子函数中使用它。这样做会抛出一个错误,因为我将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

我怀疑捕获每个子函数的形式并与...中的命名参数匹配可能是有用的,但这看起来不那么普遍(但可能会有所好处)。

2 个答案:

答案 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"