我有一个相当复杂的情况,我可能最终将一个不存在的变量传递给函数。我很清楚何时会发生这种情况,但修复它会很困难;我对能够可靠地检测到这种情况并在这种情况下执行解决方法感到满意。我可以简单地使用
inherits(try(eval(possibly_missing_variable),silent=TRUE),"try-error")
但如果可能的话,我想测试导致错误的具体情况object 'possibly_missing_variable' not found
。(我可以尝试在错误消息中使用 grep 查找“未找到”,但过去我在 r-devel 列表中被警告说,如果 R 以不同的语言运行,那么这将失败,以便翻译版本的出现错误信息。)
我尝试了 的各种组合deparse(substitute(...))
,但它们似乎在调用堆栈上运行得不够远。这是我对可重现示例的最佳拍摄:
f <- function(d) {
## test here
cat("'d' exists:",exists("d"),"\n") ## TRUE
cat("deparse(substitute(d)):",dd <- deparse(substitute(d)),"\n") ## OK
cat("exists('",dd,"'): ",exists(dd),"\n",sep="")
eval(d)
}
f2 <- function(ddd) {
f(ddd)
}
ddd <- 5
f2(junk)
结果是:
'd' exists: TRUE
deparse(substitute(d)): ddd
exists('ddd'): TRUE
Error in eval(d) : object 'junk' not found
我想要一个能够正确通知我(在遇到错误之前)评估将失败的测试,因为在环境/封闭环境等堆栈中的任何地方都找不到相关对象。有什么想法......?
更一般地说,有没有办法找出参数的最上游名称("junk"
在这种情况下)?如果我能做到这一点,那么exists(farthest_upstream_name)
将解决我的问题。