У меня есть общие функции, чтобы поймать все исключения включены в моем пакете logR::tryCatch2
определяется как:Invoke прерывания от R кода
tryCatch2 <- function(expr){
V=E=W=M=I=NULL
e.handler = function(e){
E <<- e
NULL
}
w.handler = function(w){
W <<- c(W, list(w))
invokeRestart("muffleWarning")
}
m.handler = function(m){
attributes(m$call) <- NULL
M <<- c(M, list(m))
}
i.handler = function(i){
I <<- i
NULL
}
V = suppressMessages(withCallingHandlers(
tryCatch(expr, error = e.handler, interrupt = i.handler),
warning = w.handler,
message = m.handler
))
list(value=V, error=E, warning=W, message=M, interrupt=I)
}
Как вы можете видеть в последней строке она возвращает список, который более или менее самостоятельно описывая.
Это делает реальную реакцию на исключения задержанных после tryCatch2
вызова простым !is.null
:
f = function(){ warning("warn1"); warning("warn2"); stop("err") }
r = tryCatch2(f())
if(!is.null(r$error)) cat("Error detected\n")
# Error detected
if(!is.null(r$warning)) cat("Warning detected, count", length(r$warning), "\n")
# Warning detected, count 2
Он работает, как и ожидалось, я могу реагировать с моим собственным кодом. Но в некоторых случаях я бы не остановил процесс прерывания , который тоже пойман. На данный момент мне кажется, мне нужно добавить дополнительный параметр в tryCatch2
, который будет контролировать, если прерывания должны быть уловом или нет. Таким образом, вопрос спрашивает о каком-то invokeInterrupt
функции, которую я мог бы использовать следующим образом:
g = function(){ Sys.sleep(60); f() }
r = tryCatch2(g())
# interrupt by pressing ctrl+c/stop while function is running!
if(!is.null(r$interrupt)) cat("HERE I would like to invoke interrupt\n")
# HERE I would like to invoke interrupt
Я думаю, что если R способен поймать один он должен быть также способен вызывать один.
Как я могу достичь invokeInterrupt
функциональности?
Почему бы не изменить интерфейс? Вместо 'if (! Is.null (r $ interrupt))', предоставить функцию, чтобы пользователь выполнял 'if (r $ has_interrupt())', и вы можете вызвать прерывание в этой функции. –
@KonradRudolph для этого мне все еще нужно знать, как вызвать прерывание из R-кода, не так ли? – jangorecki
Ах, тогда я неправильно понял вопрос. Я действительно не знаю, как это сделать в R, и если я правильно понимаю некоторые документы, это может быть невозможно. –