首页 > 解决方案 > 下载文件直到它工作

问题描述

我有以下循环功能,我下载数据的网站不太好,有时会出错并且循环停止。如何创建一个函数来尝试下载它直到它工作?

for (i in 1:length(urls)) {
  
  Sys.sleep(0.5)
  
  if (file.exists(paste0("Data/", file.name[i],".zip"))) {
    message(paste0(file.name[i], ".zip", '\tFile already exists'), 
            appendLF = TRUE)
  } else {
    download.file(urls[i], 
                  destfile = paste0("Data/", file.name[i],".zip"),
                  mode = "wb")
  }
}

标签: r

解决方案


几年前我在另一篇文章中找到了这个功能,我再也找不到了。但从那时起我就在使用这个坏男孩。

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)
}

请记住,这是一个自定义函数,因此除了您通常的包之外,还必须加载。

如何使用:

retry(any_function(x), maxErrors = 100, sleep = 20)

maxErrors = 重试次数

sleep = 两次尝试之间的时间(以秒为单位)


推荐阅读