我正在尝试编写一个函数来捕获它所调用的函数的参数.例如,
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
Run Code Online (Sandbox Code Playgroud)
不幸的是,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
Run Code Online (Sandbox Code Playgroud)
直接用"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]
}
Run Code Online (Sandbox Code Playgroud)
此版本在调用堆栈中进一步查找函数,获取其定义和调用,并将参数与其参数匹配.
Hon*_*Ooi 12
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]
}
Run Code Online (Sandbox Code Playgroud)
这里的关键是设置definition参数match.call是get_arg的调用函数.这应该(希望!)适用于get_args可以从任何地方调用的一般情况.
| 归档时间: |
|
| 查看次数: |
1512 次 |
| 最近记录: |