Я написал функцию быстрой, которая позволяет легко повторить работающее настраиваемое число раз, с настраиваемым ожиданием между попытками:
library(futile.logger)
library(utils)
retry <- function(expr, isError=function(x) "try-error" %in% class(x), maxErrors=5, sleep=0) {
attempts = 0
retval = try(eval(expr))
while (isError(retval)) {
attempts = attempts + 1
if (attempts >= maxErrors) {
msg = sprintf("retry: too many retries [[%s]]", capture.output(str(retval)))
flog.fatal(msg)
stop(msg)
} else {
msg = sprintf("retry: error in attempt %i/%i [[%s]]", attempts, maxErrors,
capture.output(str(retval)))
flog.error(msg)
warning(msg)
}
if (sleep > 0) Sys.sleep(sleep)
retval = try(eval(expr))
}
return(retval)
}
Таким образом, вы можете просто написать val = retry(func_that_might_fail(param1, param2), maxErrors=10, sleep=2)
повторить вызов этой функции с этими параметрами, сдаться после 10 ошибок и спать 2 секунды между попытками.
Кроме того, вы можете переопределить значение ошибки, передав другую функцию в качестве параметра isError
, который по умолчанию будет вызывать ошибку с сообщением stop
. Это полезно, если вызываемая функция делает что-то еще при ошибке, например, возвращает FALSE
или NULL
.
Это альтернатива, которую я нашел до сих пор, что приводит к более четкому и понятному коду.
Надеюсь, это поможет.
Должен установить попытку = 0 при запуске. – horaceT