задержать функцию, если она выдает ошибку: try_catch и если еще - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь написать function, который будет повторяться с определенной задержкой (только один раз в моем примере, лучше будет дважды с другой задержкой), если он выдаст ошибку.Если функция не работает после 2 попыток, она должна вернуть NA.read.csv это просто пример для иллюстрации, в моих реальных данных это функция очистки.

Этот пост был несколько полезен с использованием tryCatch с Sys.sleep при обнаружении ошибки .Однако я не понял, как реализовать несколько попыток.

Мой подход:

muhur <- function(x){if (is.na(try_catch({read.csv(x)},
                                         .w=function(w){message("error1")},
                                         .e=function(e){return(NA_character_)})))
{message("warning, delay 10 s")
  Sys.sleep(10)
  try_catch({read.csv(x)},
            .w=function(w){message("error2")},
            .e=function(e){return(NA_character_)})}
  else {try_catch({read.csv(x)},
                  .w=function(w)message("error3"),
                  .e=function(e)return(NA_character_))}
  }

Моя проблема:

Мой подход довольно трудоемкий и не выдает первое сообщение об ошибке.Более того, я не знаю, как осуществить вторую попытку.

test<- data.frame(a=c("test1","test"))
test%>% group_by(a) %>% mutate(b=muhur(a))

warning, delay 10 s
warning, delay 10 s
# A tibble: 2 x 2
# Groups:   a [2]
  a     b    
  <fct> <chr>
1 test1 <NA> 
2 test  <NA> 

Мой вопрос:

Есть ли какой-нибудь лучший (более надежный, более ясный) подход к моей проблеме?

1 Ответ

0 голосов
/ 15 октября 2018

Вот решение, основанное на предложении Роланда:

muhur <- function(x, tries = 2){
  if (tries <= 0)
    stop("Too many tries")
  result <- try(read.csv(x))
  if (inherits(result, "try-error")) {
    cat("Failed, trying again in 10 seconds...\n")
    Sys.sleep(10)
    muhur(x, tries = tries - 1)
  } else
    result
}

Я не смог заставить работать withRestarts решение;Я нахожу его документацию и записи в блогах об этом довольно непрозрачными.

...