gpt4 book ai didi

r - 如何在被调用例程中获取调用函数的名称?

转载 作者:行者123 更新时间:2023-12-03 07:50:00 25 4
gpt4 key购买 nike

是否有“非内部”方式来获取调用者的姓名,如函数 stop做?

这个想法是我有一个小函数来检查输入并在不满足某些条件时停止执行。此函数由其他几个使用相同验证代码的函数调用。如果输入无效,调用者的环境将被转储(因此我可以看到传递给函数的参数),并且执行停止。

简化示例:

check <- function(x)
{
if(x<0)
{
print(as.list(parent.frame()))

evalq(stop("invalid input."), parent.frame())
}
}

test <- function(x, y)
{
check(x)
}

我认为评估表达式 quote(stop("blah"))在来电者的环境中会使其显示来电者的姓名。但是,结果如下:
test(-1, 2)

# $x
# [1] -1
#
# $y
# [1] 2
#
# Error in eval(substitute(expr), envir, enclos) : invalid input.

如果我使用 parent.frame(n),这不会改变与 n>1evalq .

所以这里是问题,实际上是两个问题: 1. 有没有办法获得创建环境的函数的名称(假设它是这样创建的)? 2. 为什么上述解决方法失败?

编辑:我说上面的解决方法失败,因为我希望错误消息显示为
Error in test(x, y) : invalid input.

好像 stop声明是 test 的一部分 body 。所以问题 2 可以重述为: 2':为什么没有对 stop("invalid input.") 的评估捕获调用者的姓名,考虑到它是在调用者的环境中评估的?

最佳答案

感谢@GavinSimpson 和@RicardoSporta,但我已经想通了。如果有人在 SO 中搜索这个,我会发布一个答案。

可以通过以下方式检索生成当前调用的函数的名称

deparse(sys.calls()[[sys.nframe()-1]])

这将返回一个字符串,该字符串不仅包含函数的名称,还包含整个调用对象。可以通过子集 sys.calls()[[sys.nframe()-1]] 来检索单独的名称。在离开之前。

我想要这个是因为我写了一个函数来检查参数并在出现错误时停止执行。但我希望这个函数 (i) 转储环境和 (ii) 在执行堆栈中显示上一级函数的名称。 (i) 很容易,但我被困在 (ii) 中。

至于我帖子中的第二个问题,这是发生了什么:表达式 stop("invalid input")test 的环境中进行评估函数,但这与表达式是 test 的一部分不同。的主体,因为在这 2 个场景中执行堆栈是不同的。在后一种情况下, stop只有 test在它上面,但在第一个中,它有 eval , check然后 test向上。执行栈,由 sys.calls() 返回与封闭环境不同。这就是可能导致混淆的原因。

关于r - 如何在被调用例程中获取调用函数的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15595478/

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