gpt4 book ai didi

r - 有没有办法在 R 中使用 tryCatch (或类似的)作为循环,或者操作警告参数中的 expr ?

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

我有一个回归模型( lmglmlmer ...),我有 fitmodel <- lm(inputs)哪里inputs循环内发生变化(公式和数据)。然后,如果模型函数没有产生任何警告,我想保留 fitmodel ,但如果我收到警告,我想 update模型,并且我希望打印警告,所以我这样做 fitmodel <- lm(inputs)里面tryCatch 。因此,如果它产生警告,则 warning = function(w){f(fitmodel)} 内, f(fitmodel)会是这样的

fitmodel <- update(fitmodel, something suitable to do on the model)

事实上,这个分配将在 if-else 内结构的方式取决于警告 if(w$message satisfies something)我会调整 suitable to do on the model里面update .

问题是我得到 Error in ... object 'fitmodel' not found 。如果我使用 withCallingHandlersinvokeRestarts ,它只是完成了模型的计算,并带有警告,没有 update它。如果我再添加fitmodel <- lm(inputs)里面something suitable to do on the model ,我收到打印的警告;现在我想我可以尝试suppresswarnings(fitmodel <- lm(inputs)) ,但我认为这不是一个优雅的解决方案,因为我必须添加 2 倍行 fitmodel <- lm(inputs) ,使所有计算量增加 2 倍(在 expr 内和在 warning 内)。

总结一下,我想要但失败的是:

tryCatch(expr = {fitmodel <- lm(inputs)},
warning = function(w) {if (w$message satisfies something) {
fitmodel <- update(fitmodel, something suitable to do on the model)
} else if (w$message satisfies something2){
fitmodel <- update(fitmodel, something2 suitable to do on the model)

}
}
)

我能做什么?

问题的循环部分是因为我认为它如下(也许是另一个问题,但目前我将其留在这里):在 update 之后可能会发生这种情况我收到另一个警告,所以我会做类似 while(get a warning on update){update} 的事情;在某种程度上,这个update里面warning也应该理解为expr 。这样的事情可能吗?

非常感谢!


带有最少示例的问题的通用版本:

假设我有一个 tryCatch(expr = {result <- operations}, warning = function(w){f(...)}如果我在 expr 中收到警告(实际上是在 operations 中生成的)我想用 result 做一些事情,所以我会这样做warning = function(w){f(result)} ,但后来我得到 Error in ... object 'result' not found .

一个最小的例子:

y <- "a"
tryCatch(expr = {x <- as.numeric(y)},
warning = function(w) {print(x)})
Error in ... object 'x' not found

我尝试使用withCallingHandlers而不是tryCatch没有成功,并且还使用 invokeRestart但它执行的是表达式部分,而不是我收到警告时想要执行的操作。

你能帮我吗?

谢谢!

最佳答案

从根本上来说,问题在于处理程序在赋值发生之前被调用。即使情况并非如此,处理程序也会在与 tryCatch 表达式不同的作用域中运行,因此处理程序无法访问其他作用域中的名称。

我们需要将处理与值转换分开。

对于错误(但不是警告),R 基础提供了函数 try,它包装了 tryCatch 以实现此效果。但是,不鼓励使用 try,因为它的返回类型是 unsound .1 如前所述 in the answer by ekoam , ‘purrr’ 提供清晰的输入 functional wrappers (例如安全地)以达到类似的效果。

但是,我们也可以构建自己的,这可能更适合这种情况:

with_warning = function (expr) {
self = environment()
warning = NULL

result = withCallingHandlers(expr, warning = function (w) {
self$warning = w
tryInvokeRestart('muffleWarning')
})
list(result = result, warning = warning)
}

这为我们提供了一个区分结果值和警告的包装器。我们现在可以使用它来实现您的要求:

fitmodel = with(with_warning(lm(inputs)), {
if (! is.null(warning)) {
if (conditionMessage(warning) satisfies something) {
update(result, something suitable to do on the model)
} else {
update(result, something2 suitable to do on the model)
}
} else {
result
}
})

1 这意味着 try 的返回类型不区分 try-error< 类型的错误和非错误值。这是可能发生的真实情况,例如,在嵌套多个 try 调用时。

关于r - 有没有办法在 R 中使用 tryCatch (或类似的)作为循环,或者操作警告参数中的 expr ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65035226/

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