gpt4 book ai didi

r - 确定参数的评估是否会因不存在而失败

转载 作者:行者123 更新时间:2023-12-04 14:30:24 25 4
gpt4 key购买 nike

我有一个相当复杂的情况,我可能最终将一个不存在的变量传递给函数。我很清楚什么时候会发生这种情况,修复它会很困难;我对能够可靠地检测到条件并在这种情况下执行解决方法感到满意。我可以简单地使用

inherits(try(eval(possibly_missing_variable),silent=TRUE),"try-error")

但如果可能的话,我想测试导致错误 object 'possibly_missing_variable' not found 的特定条件. (我可以尝试在错误消息中搜索“未找到”,但我过去曾在 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)会解决我的问题。

最佳答案

也许是这样的(从我对 this question 的第二个回答中窃取的)?

f <- function(d) {
## test here
ff <- sys.frames()
ex <- substitute(d)
ii <- rev(seq_along(ff))
for(i in ii) {
ex <- eval(substitute(substitute(x, env=sys.frames()[[n]]),
env = list(x = ex, n=i)))
}
if(!exists(deparse(ex))) stop("Substitute real error action here")
eval(d)
}

f2 <- function(ddd) {
f(ddd)
}

ddd <- 5
f2(junk)
## Error in f(ddd) (from #10) : Substitute real error action here

关于r - 确定参数的评估是否会因不存在而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14945274/

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