代码之家  ›  专栏  ›  技术社区  ›  captcoma

如果函数抛出错误,则延迟它:try\u catch,否则

  •  0
  • captcoma  · 技术社区  · 6 年前

    function 如果它抛出一个错误,它将以一定的延迟重复(在我的示例中只有一次,最好是两次不同的延迟)。如果函数在两次尝试后不起作用,它应该返回 NA read.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 回复  |  直到 6 年前
        1
  •  1
  •   user2554330    6 年前

    以下是基于罗兰建议的解决方案:

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