有没有办法从函数中获取所有函数参数?
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())
的简单性。
答案 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)
您可以使用ls
和mget
。 ls
将(默认情况下)列出调用框架中的对象(在本例中,在函数内),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)