gpt4 book ai didi

r - 使用名称获取R中父函数的参数

转载 作者:行者123 更新时间:2023-12-04 06:20:30 26 4
gpt4 key购买 nike

我正在尝试编写一个函数,以捕获从中调用该函数的参数。例如,

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()返回与调用方2相同的输出?我知道可以使用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]

}

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

最佳答案

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]
}

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

关于r - 使用名称获取R中父函数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17256834/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com