gpt4 book ai didi

r - R 中的一致错误管理

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

一旦您掌握了典型的 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/

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