繁体   English   中英

R中的一致错误管理

[英]Consistent error management in R

一旦你掌握了典型的R错误消息,它们就非常有用。

尽管如此,我经常发现R自己的错误消息并不像我期望的那样提供信息,所以我通常最终会编写某种自定义错误消息。

现在,我想知道是否存在一些系统方法(或者建议的最佳实践方法),以便为特定错误分配唯一的错误代码和附加信息。

我想我想为错误构建某种哈希表解决方案,其中可以存储和检索每个错误的附加信息。 您是否会使用某种“轻型”数据库解决方案(例如SQLite)或通过存储在某处( .rdata )的简单data.framelist对象来解决此问题,并在需要时进行检索?

家庭作业

说实话,我还没有做过那么多研究。 虽然这里至少有些东西;-)

报告器

我刚刚发现了报告器包,并将更详细地检查它。 有没有人有这个包或类似的经验?

我自己的方法概要(部分伪代码)

myFoo <- function(x, ...) {
    tryCatch(
        x * 100,
        error=function(e) {
            record <- retrieveErrorRecord(e) # Does not exist yet
            # 'record' would be some sort of list or Ref Class Object

            if (!length(record)) {
                uid <- generateUid(e) # Does not exist yet
                msg <- paste(
                    "expecting arg 'x' to be of class 'numeric' (was '", 
                    class(x), "')", sep="")
                insertErrorRecord( # Does not exist yet
                    list(
                        uid=uid, 
                        message=msg, 
                        original=e
                    )
                )
                record <- retrieveErrorRecord(e)
            } 
            msg <- c(
                "myFoo/error:\n",
                paste("* Code:     ", record$uid, "\n", sep=""),
                paste("* Message:  ", record$message, "\n", sep=""),
                paste("* Original: ", record$original, "\n", sep="")  
            )
            stop(msg)            
        }
    )
}

这就是消息的样子

require("digest")
x <- "abc"
e <- simpleError("test error")
record <- list(
    uid=digest(e),
    message=paste("expecting arg 'x' to be of class 'numeric' (was '", 
        class(x), "')", sep=""),
    original=e
)
msg <- c(
    "myFoo/error:\n",
    paste("* Code:     ", record$uid, "\n", sep=""),
    paste("* Message:  ", record$message, "\n", sep=""),
    paste("* Original: ", record$original, "\n", sep="")  
)
> stop(msg)
Error: myFoo/error:
* Code:     e78e73054b93d2bf682df32845cd064d
* Message:  expecting arg 'x' to be of class 'numeric' (was 'character')
* Original: Error: test error

恕我直言,一种方法是将当前R错误消息“翻译”为更符合您需求的内容。 这可以在(目前正在下载?) http://translation.r-project.org/pootle页面上轻松完成。 这需要大量的工作/时间......

但我认为标准的R错误/警告信息非常简单,虽然技术性很强,但是,嘿,我们编程还是什么? :)

但是要给出答案/提示如何做到这一点(使用一些正则regexp ),我已经在我的eval.msgs函数中实现了类似的值得引用的东西(这是一个更强大的函数,称为evals那里的帮助器) )。

此函数与evaluate类似,因此评估给定的R命令会尝试捕获除stdout 返回的原始R对象之外的可能的信息/警告/错误messages 在那里,我意识到syntax error消息在一行中相当蹩脚,因此应用了上面的regexp ,这导致了以下示例:

> x <- 'foobar'
> eval.msgs('x 100')
$src
[1] "x 100"

$result
NULL

$output
NULL

$type
[1] "error"

$msg
$msg$messages
NULL

$msg$warnings
NULL

$msg$errors
[1] "Unexpected numeric constant at character 3 in line 1: ` x 100`"


$stdout
NULL

> eval.msgs('x foo')
$src
[1] "x foo"

$result
NULL

$output
NULL

$type
[1] "error"

$msg
$msg$messages
NULL

$msg$warnings
NULL

$msg$errors
[1] "Unexpected symbol at character 3 in line 1: ` x foo`"


$stdout
NULL

> eval.msgs('x*100')
$src
[1] "x*100"

$result
NULL

$output
NULL

$type
[1] "error"

$msg
$msg$messages
NULL

$msg$warnings
NULL

$msg$errors
[1] "non-numeric argument to binary operator"


$stdout
NULL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM