私は最近この質問を提起し、ありがたいことにwithRestarts()
、私にとって非常に素晴らしく強力なように思われることを指摘されました:-) 今、私はRのエラー処理機能をもう少し詳しく理解したいと思っています.
実際の質問
- のおすすめの使い方は
simpleCondition()
?これまで使用したことはありませんでしたが、実際には「真」の状態であるカスタム エラーと警告を設計するのに役立つかもしれないと思いました。特定のハンドラーが利用可能な特定の条件のデータベースを構築するために使用できますか? - Rワークスペース全体の特定の状態を「凍結」し、そこに戻って特定の時点で計算を再開する方法はありますか? 私は知っていますが、知る限り、これは検索パス(または)
save.image()
の「状態」を保存しません。search()
searchpaths()
興味のある方へ
2 つのコード例
- このブログ投稿
withRestarts
に依存する私の現在の使用の図 - 「カスタム条件」を定義しようとする
何を改善すべきかについてのコメント/提案をいただければ幸いです;-)
例 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")