4

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

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

现在,我想知道在为特定错误分配唯一错误代码以及附加信息方面是否有一些系统方法(或推荐的最佳实践方法)。

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

家庭作业

老实说,我还没有对它做太多的研究。虽然这里至少有一些东西;-)

包裹记者

我刚刚发现了记者包,并将更详细地检查它。有没有人有使用该软件包或类似软件包的经验?

我自己的方法大纲(部分是伪代码)

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
4

1 回答 1

1

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

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

但是要给出如何做到这一点的答案/提示(使用 some regexp),我已经实现了类似的东西,这可能值得在我的eval.msgs函数中参考(这是在那里调用的更强大的函数的助手evals)。

此函数的工作原理类似于evaluate,因此评估给定的 R 命令会尝试捕获可能的信息/警告/错误messages以及stdout 返回的原始 R 对象。在那里我意识到这些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
于 2012-06-18T10:22:41.313 回答