如果函数抛出错误,则延迟该函数:try_catch以及其他情况

时间:2018-10-15 10:32:49

标签: r try-catch delay

我尝试编写一个function,如果它抛出错误,它将以一定的延迟重复(在我的示例中只有一次,最好以不同的时间延迟两次)。如果函数在2次尝试后仍无法正常工作,则应返回NAread.csv只是一个示例,在我的真实数据中,这是一个抓取功能。

这篇文章对您有帮助using tryCatch with Sys.sleep upon encountering an error。但是,我没有弄清楚如何进行多次尝试。

我的方法:

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 :(得分:1)

这是基于罗兰(Roland)建议的解决方案:

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解决方案来工作;我发现它的文档和有关它的博客文章都不透明。