r语言 - 在for循环中出错后如何重做tryCatch



我正在尝试在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)})
}

你能给我一些提示吗?

你可以这样做:

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

如果您确定等待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(.))
}

相关内容

  • 没有找到相关文章

最新更新