我试图编写一个函数来捕获函数的参数。例如,在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]
}
该版本进一步求解函数调用栈,抓住它的定义和调用,以及相匹配的参数及其参数。
有意思的答案,但不幸的是get_args必须是一个零变量的参数。我同意这种方式会使生活更轻松,但功能(尽管有很多修改)将被用于CRAN的生产代码,他们不会允许。内部调用。 – RyanGrannell
请参阅我的编辑以从'get_call'中移除参数。我仍然没有看到为什么自定义函数是必要的。也许你应该把潜在的问题作为一个新问题提出来,人们可以用一种不需要语言转换的方式来帮助你解决问题。 –
公平点。我编辑了我原来的帖子。 – RyanGrannell