gpt4 book ai didi

r - 应该如何为 R 实现 "is.error()",以识别和解析错误?

转载 作者:行者123 更新时间:2023-12-03 14:56:53 27 4
gpt4 key购买 nike

我正在尝试测试对象是否是错误的结果。用例主要来自 foreach()产生错误的循环(尽管为了测试,将 simpleError() 分配给变量似乎就足够了),而且我对如何识别发生这种情况的时间感到困惑:我如何测试给定的对象是,其实是错误?一旦我确定这是一个错误,除了消息之外,我还能提取什么?也许我遗漏了一些关于 R 错误处理设施的东西,因为似乎有必要从头编写一个错误对象测试函数。

这里有两个例子,一个使用 foreach , 与 .errorhandling参数设置为 pass .我已经开始使用它作为大规模或无人值守处理的默认值,以防数据切片出现异常。这种异常很少见,不值得让整个 for 循环崩溃(特别是如果该异常发生在最后,这似乎是我的 murphysListSortingAlgorithm() 的默认行为;-))。相反,需要事后检测。

library(foreach)
library(doMC)
registerDoMC(2)
results = foreach(ix = 1:10, .errorhandling = "pass") %dopar%{
if(ix == 6){
stop("Perfect")
}
if(ix == 7){
stop("LuckyPrime")
} else {
return(ix)
}
}

为简单起见,这是一个非常简单的错误(根据定义):
a = simpleError("SNAFU")

虽然似乎没有像 is.error() 这样的命令, 以及类似 typeof() 的命令和 mode()似乎毫无意义,我发现最好的方法是使用 class()attributes() , 给出指示错误的属性。我如何以一种保证确定我有错误并完全处理该错误的方式使用这些?例如 a$message返回 SNAFU ,但是 a$callNULL .我应该期望能够从 res[[6]]$call 中提取任何有用的信息吗? ?

注 1:如果没有多核功能来重现第一个示例,我应该指出 results[[6]]simpleError("Perfect") 不同:
> b = simpleError("Perfect")
> identical(results[[6]], b)
[1] FALSE
> results[[6]]
<simpleError in eval(expr, envir, enclos): Perfect>
> b
<simpleError: Perfect>

这说明了为什么我不能(非常天真地)测试列表元素是否为 vanilla simpleError .

注 2. 我知道 trytryCatch ,并在某些情况下使用这些。但是,我不完全确定如何使用它们对 foreach 的输出进行后处理。环形。例如, results第一个例子中的对象:在我看来,用 tryCatch 处理它的元素没有意义。 wrapper 。对于操作的 RHS,即 foreach()循环,我不确定 tryCatch也会做我想做的。我可以用它来捕捉错误,但我想我需要获取消息并在那时插入处理。我看到两个问题:每个循环都需要用 tryCatch() 包裹起来。 ,否定部分 .errorhandling争论,我仍然无法稍后对 results 进行后期处理目的。如果这是进行此处理的唯一方法,那么它就是解决方案,但这意味着无法以与许多其他 R 对象(例如矩阵、向量、数据框等)类似的方式识别和处理错误。

更新 1. 我在 foreach 中添加了一个额外的停止触发器循环,给出两个不同的消息来识别和解析,以防万一这有帮助。

更新 2. 我选择 Richie Cotton 的答案。这似乎是我应该寻找什么的最完整的解释,尽管完整的实现需要其他几位代码(以及 R 的最新版本)。最重要的是,他指出我们需要牢记两种类型的错误,这对于彻底检查尤为重要。也可以看看别人的评论和回答,才能充分发展自己的 is.error()测试功能;在查找结果列表中的错误时,我给出的答案可能是一个有用的开始,而 Richie 的代码是测试函数的一个很好的起点。

最佳答案

您可能在野外看到的仅有的两种类型的错误是 simpleError就像你来到这里一样,try-error s 是在对 try 的调用中包装一些异常抛出代码的结果.有人可以创建自己的错误类,尽管这些很少见,并且应该基于这两个类之一。事实上(自 R2.14.0 起)try-error s 包含 simpleError :

e <- try(stop("throwing a try-error"))
attr(e, "condition")

检测 simpleError很简单。
is_simple_error <- function(x) inherits(x, "simpleError")

try catch 错误的等价物是
is_try_error <- function(x) inherits(x, "try-error")

因此,在这里,您可以通过将其应用于您的结果列表来检查问题的结果。
the_fails <- sapply(results, is_simple_error)

同样,返回消息和调用是单行的。为方便起见,我已将调用转换为字符串,但您可能不希望这样。
get_simple_error_message <- function(e) e$message
get_simple_error_call <- function(e) deparse(e$call)

sapply(results[the_fails], get_simple_error_message)
sapply(results[the_fails], get_simple_error_call)

关于r - 应该如何为 R 实现 "is.error()",以识别和解析错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9249344/

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