for循环出错后如何重做tryCatch

How to redo tryCatch after error in for loop

我正在尝试在 for 循环中实现 tryCatch。

构建循环是为了从远程服务器下载数据。有时服务器不再响应(当查询很大时)。

为了保持循环,我已经实现了 tryCatch。

我还添加了一个 sys.sleep() 暂停,以便在发生错误时等待几分钟,然后再将下一个查询发送到远程服务器(有效)。

问题是 我不知道如何要求循环重做失败的查询并导致 tryCatch 错误(以及 sys.sleep ()).

for(i in 1:1000){
    tmp <- tryCatch({download_data(list$tool[i])},
           error = function(e) {Sys.sleep(800)})
}

你能给我一些提示吗?

如果您确定等待 800 秒总能解决问题,则应该进行此更改。

for(i in 1:1000) {
  tmp <- tryCatch({
    download_data(list$tool[i])
  },
  error = function(e) {
    Sys.sleep(800)
    download_data(list$tool[i])
  })
}

一种更复杂的方法可能是,收集有关哪个请求失败的信息,然后重新运行脚本,直到所有请求都成功。

一种方法是使用 purrr 包中的 possibly() 函数。它看起来像这样:

todo <- rep(TRUE, length(list$tool))
res <- list()
while (any(todo)) {
  res[todo] <- map(list$tool[todo],
                   possibly(download_data, otherwise = NA))
  todo <- map_lgl(res, ~ is.na(.))
}

你可以这样做:

for(i in 1:1000){
   
   download_finished <- FALSE

   while(!download_finished) {

    tmp <- tryCatch({

             download_data(list$tool[i])
             download_finished <- TRUE

           },
           error = function(e) {Sys.sleep(800)})
   }
}