12

我正在尝试编写一个函数来捕获调用它的函数的参数。例如,

get_args <- function () as.list( sys.call(sys.parent()) )[-1]

caller <- function (x, y, z) {
    get_args()
}
caller(1,2,3)

[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

sys.call() 不幸的是没有添加匹配参数名称和参数值,我想编写一个类似的 get_args 版本,它返回类似于

caller2 <- function (x, y, z) {
    as.list( match.call() )[-1]
}
caller2(1,2,3)

$x
[1] 1

$y
[1] 2

$z
[1] 3

直接用“match.call()”替换“get_args()”不是我正在寻找的解决方案,因为实际上 get_args 在返回其父函数参数之前会做一些其他事情。

我尝试以多种方式将 match.call() 与 sys.parent() 一起使用,但我无法让函数返回调用者的参数;它只返回 get_args() 的参数。

对于上述测试用例,有没有办法让 get_args() 返回的输出与 caller2 的输出相同?我知道可以使用formals()手动命名参数,但这可以保证是等价的吗?

如果需要任何澄清,请在下面发表评论。谢谢。

编辑1:

get_args() 的目的是作为一种用户友好的方式来获取调用函数的参数。打字 as.list( match.call() )[-1] 变老了,但是因为 match.call 抓住了最近的函数调用,它现在只获取 get_args() 的参数。

get_args() 也会从父函数获取默认参数,但这很容易实现。

解决方案:

感谢 Hong Ooi,使用 match.call 的关键似乎是提供调用您想要了解的函数的定义。下面是一个稍微修改的、匿名友好的 get_args 版本,以供后代使用

get_args <- function () {
as.list( match.call(
    def = sys.function( -1 ),
    call = sys.call(-1)) )[-1]

}

此版本在调用堆栈的更上方找到函数,获取其定义和调用,并将参数与其参数匹配。

4

1 回答 1

17
get_args <- function()
{
    cl <- sys.call(-1)
    f <- get(as.character(cl[[1]]), mode="function", sys.frame(-2))
    cl <- match.call(definition=f, call=cl)
    as.list(cl)[-1]
}

这里的关键是将definition参数设置match.call为是get_arg的调用函数。get_args这应该(希望!)适用于可以从任何地方调用的一般情况。

于 2013-06-23T01:56:11.787 回答