r - R 中的一致错误管理

标签 r error-handling

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

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

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

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

在家工作

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

套餐reportr

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

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

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 命令试图捕捉可能的信息/警告/错误 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

关于r - R 中的一致错误管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11080419/

相关文章:

r - 如何通过另一个 data.frame 中的某些列合并行名?

typescript - 函数返回另一个函数的Promise时的错误处理

java - JSP:即使我无法显示错误页面,我如何才能让代码继续运行?

c++ - C++候选函数不可行: no known conversion from 'int' to 'int *' for 1st argument; take the address of the argument with &

java - 当过滤器阻止对jsp的访问时,导航到错误的jsp

mysql - 使用交易数据库使用 R 或 SQL 计算某个项目出现在未来交易中的概率

r - 将 apply 与 Spatial*DataFrame 一起使用

r - 为什么 data.table 上的 class(.SD) 显示 "data.frame"?

r - 在 data.table 中合并因子与非因子会导致意外结果

c - 整数错误C