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