[英]Consistent error management in R
一旦你掌握了典型的R错误消息,它们就非常有用。
尽管如此,我经常发现R自己的错误消息并不像我期望的那样提供信息,所以我通常最终会编写某种自定义错误消息。
现在,我想知道是否存在一些系统方法(或者建议的最佳实践方法),以便为特定错误分配唯一的错误代码和附加信息。
我想我想为错误构建某种哈希表解决方案,其中可以存储和检索每个错误的附加信息。 您是否会使用某种“轻型”数据库解决方案(例如SQLite)或通过存储在某处( .rdata
)的简单data.frame
或list
对象来解决此问题,并在需要时进行检索?
说实话,我还没有做过那么多研究。 虽然这里至少有些东西;-)
我刚刚发现了报告器包,并将更详细地检查它。 有没有人有这个包或类似的经验?
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.