【发布时间】:2013-02-28 01:42:08
【问题描述】:
我最近发布了this question,幸好有人指向withRestarts(),这对我来说似乎非常棒且强大:-) 现在我渴望更详细地了解 R 的错误处理能力。
实际问题
-
simpleCondition()的推荐用法是什么?以前从未使用过它,但我认为它可能对设计实际上是“真实”条件的自定义错误和警告很有用。它是否可以用于构建一个包含特定处理程序可用的特定条件的数据库? - 有没有办法“冻结”整个 R 工作区的某个状态并返回到它以在某个点重新开始计算?我知道
save.image(),但是AFAIU,它不存储搜索路径的“状态”(search()或searchpaths())。
对于那些感兴趣的人
两个代码示例
- 说明我当前使用
withRestarts依赖于这个blog post - 尝试定义“自定义条件”
如果有任何关于如何做得更好的 cmets/建议,我将不胜感激 ;-)
示例 1
require("forecast")
autoArimaFailsafe <- function(
x,
warning=function(w, ...) {
message("autoArimaFailsafe> warning:")
message(w)
invokeRestart("donothing")},
error=function(e, ...) {
message("autoArimaFailsafe> error:")
message(e)
invokeRestart("abort")}
) {
withRestarts(
out <- tryCatch(
{
expr <- expression(auto.arima(x=x))
return(eval(expr))
},
warning=warning,
error=error
),
donothing=function(...) {
return(eval(expr))
},
abort=function(...) {
message("aborting")
return(NULL)
}
)
}
data(AirPassengers)
autoArimaFailsafe(x=AirPassengers)
autoArimaFailsafe(x="a")
示例 2
require("forecast")
autoArimaFailsafe <- function(
x,
warning=function(w, ...) {
message("autoArimaFailsafe> warning")
invokeRestart("donothing")},
error=function(e, ...) {
message("autoArimaFailsafe> error")
invokeRestart("abort")},
condition=function(cond, ...) {
out <- NULL
message(cond)
condmsg <- conditionMessage(c=cond)
condclass <- class(cond)
if (any(class(cond) == "simpleWarning")) {
out <- warning(w=cond)
} else if (any(class(cond) == "simpleError")) {
out <- error(e=cond)
} else if (any(class(cond) == "simpleCondition")) {
if (condmsg == "invalid class: character") {
out <- invokeRestart("forcedefault")
}
}
return(out)
}
) {
withRestarts(
out <- tryCatch(
{
expr <- expression(auto.arima(x=x))
if (class(x) == "character") {
expr <- signalCondition(
simpleCondition("invalid class: character",
call=as.call(expr))
)
}
return(eval(expr))
},
condition=condition
),
donothing=function(...) {return(eval(expr))},
abort=function(...) {
message("aborting")
return(NULL)
},
forcedefault=function(...) {
data(AirPassengers)
expr <- expression(auto.arima(x=AirPassengers))
return(eval(expr))
}
)
}
autoArimaFailsafe(x=AirPassengers)
autoArimaFailsafe(x=NULL)
autoArimaFailsafe(x="a")
【问题讨论】:
标签: r error-handling conditional-statements application-restart