2013-06-23 66 views
6

我试图编写一个函数来捕获函数的参数。例如,在R中获取父函数的参数,名称为

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在返回它的父函数参数之前会做一些其他的事情。我试过在sys.parent()中以几种方式使用match.call(),但是我不能获得返回调用者参数的函数;它只是返回get_args()的参数。

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

如果需要澄清,请在下面留言。谢谢。

EDIT 1:

get_args的目的()是作为与获得其中函数被调用的参数的用户友好的方式。输入as.list(match.call())[ - 1]变老,但由于match.call抓取最近的函数调用,它现在只是获取get_args()的参数。

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

SOLUTION:

感谢香港大井,关键看使用match.call似乎是同时提供呼叫你想了解该函数的定义。稍微修改,get_args匿名的版本下面是为子孙后代

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

} 

该版本进一步求解函数调用栈,抓住它的定义和调用,以及相匹配的参数及其参数。

回答

8
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.callget_arg的调用函数。这应该(希望!)适用于get_args可以从任何地方调用的一般情况。

+0

有意思的答案,但不幸的是get_args必须是一个零变量的参数。我同意这种方式会使生活更轻松,但功能(尽管有很多修改)将被用于CRAN的生产代码,他们不会允许。内部调用。 – RyanGrannell

+0

请参阅我的编辑以从'get_call'中移除参数。我仍然没有看到为什么自定义函数是必要的。也许你应该把潜在的问题作为一个新问题提出来,人们可以用一种不需要语言转换的方式来帮助你解决问题。 –

+0

公平点。我编辑了我原来的帖子。 – RyanGrannell