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