Недавно я задал этот вопрос и, к счастью, был отмечен withRestarts()
, который кажется мне довольно впечатляющим и мощным:-) Теперь я очень хочу понять ошибку R возможности обработки немного более подробно.
Актуальные вопросы
- Какое рекомендуемое использование
simpleCondition()
? Никогда не использовал его раньше, но я думал, что это может быть полезно для разработки пользовательских ошибок и предупреждений, которые на самом деле являются "истинными" условиями. Может ли он использоваться для создания базы данных конкретных условий, для которых доступны специальные обработчики? - Есть ли способ "заморозить" определенное состояние рабочего пространства всего R и вернуться к нему, чтобы перезапустить вычисление в определенной точке? Я знаю
save.image()
, но AFAIU, это не сохраняет "состояние" пути поиска (search()
илиsearchpaths()
).
Для заинтересованных
Два примера кода
- Иллюстрация моего текущего использования
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")