r - 下载文件直到它工作
问题描述
我有以下循环功能,我下载数据的网站不太好,有时会出错并且循环停止。如何创建一个函数来尝试下载它直到它工作?
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")
}
}
解决方案
几年前我在另一篇文章中找到了这个功能,我再也找不到了。但从那时起我就在使用这个坏男孩。
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 = 两次尝试之间的时间(以秒为单位)
推荐阅读
- ios - 以编程方式推送 ViewController
- uwp - UWP 与设备取消配对失败
- android - 如果我已经在使用 admob,是否需要集成 InMobi sdk
- facebook-graph-api - Instagram 故事 API
- android - 您可能无权在此组织中创建项目
- node.js - 在 node.js Express 服务器上部署 Angular Universal
- google-data-studio - 数据洞察社区连接器:结合基于时间和非时间的指标
- docker - apt-key 命令在 shell 上有效,但在 Dockerfile 上失败
- php - 空对象模式无法解决多种返回类型的问题
- regex - 评估多个正则表达式的优化