是否有像函数一样获取调用者姓名的“非内部”方式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)
如果我使用with n>1
in ,这不会改变evalq
。
所以这是一个问题,实际上是两个问题: 1. 有没有办法获取创建环境的函数的名称(假设它是这样创建的)?2. 为什么上面的解决方法失败了?
编辑:我说上面的解决方法失败了,因为我希望错误消息显示为
Error in test(x, y) : invalid input.
好像stop
语句是test
身体的一部分。所以问题2可以重述为: 2':stop("invalid input.")
考虑到在调用者的环境中评估它,为什么没有捕获调用者的名字?