9

有没有办法从函数中获取所有函数参数?

match.call()不返回设置了默认值但未覆盖的参数。例如:

xf <- function (a, b="Hi", c=TRUE) {
  print(as.list(match.call(expand.dots=FALSE)))
}

>xf(3)
[[1]]
xf

$a
[1] 3

我正在编写一个带有调用现有函数的函数的包,但我希望能够设置不在现有函数上的默认值。(我打算使用来自的列表match.call,将其传递给另一个函数do.call并返回结果。

更新:一个与 S3 方法相关的有趣问题。我创建了一个新的 S3 方法,并使用了@Ferdinand.kraft 的答案。as.list(environment(), all.names=TRUE)all.names 参数保留列表中以 a 开头.的名称。事实证明,方法调度向函数环境添加了几个参数,包括.Generic .Class .Method和其他几个参数。如果将这些传递给do.call. 其他答案之一可能是一个更好的全方位解决方案,但我喜欢as.list(environment()).

4

2 回答 2

10

您还可以在函数开头返回环境:

xf <- function (a, b="Hi", c=TRUE) {
  as.list(environment(), all=TRUE)
}

结果:

> xf(a=1)
$a
[1] 1

$b
[1] "Hi"

$c
[1] TRUE
于 2013-04-09T01:38:16.960 回答
5

您可以使用lsmgetls将(默认情况下)列出调用框架中的对象(在这种情况下,在函数内),mget将获取这些对象。

例如

xf <- function(a,b='Hi',c){
  # this gets the current definitions of `a`, `b`, and `c` 
  incall <-mget(ls())
  incall}

 xf(3)
## $a
## [1] 3
## 
## $b
## [1] "Hi"
##
## $c

然后你可以使用do.call(whatever, incall)

于 2013-04-09T00:55:01.643 回答