从函数内部获取所有函数参数的列表

时间:2013-04-09 00:44:49

标签: r

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

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参数使名称以列表中的.开头。事实证明,方法调度为函数环境添加了几个参数,包括.Generic .Class .Method和其他几个参数。如果将这些问题传递给do.call中的函数,则可能会出现问题。其中一个答案可能是更好的解决方案,但我喜欢as.list(environment())的简单性。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

您可以使用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)