R 循环仅完成 2504 次迭代中的 3 次
R loop completes only 3 iterations out of 2504
我编写了一个从 NOAA 数据库下载多个文件的函数。首先,我有 sites
这是我要从网站下载的网站 ID 列表。它看起来像这样:
> head(sites)
[[1]]
[1] "9212"
[[2]]
[1] "10158"
[[3]]
[1] "11098"
> length(sites)
[1] 2504
我的函数如下图所示。
tested<-lapply(seq_along(sites), function(x) {
no<-sites[[x]]
data=GET(paste0('https://www.ncdc.noaa.gov/paleo-search/data/search.json?xmlId=', no))
v<-content(data)
check=GET(v$statusUrl)
j<-content(check)
URL<-j$archive
download.file(URL, destfile=paste0('./tree_ring/', no, '.zip'))
})
奇怪的问题是它适用于前三个站点(正确下载),但在三个站点之后停止并抛出以下错误:
Error in charToRaw(URL) : argument must be a character vector of length 1
我试过手动下载第 4 个和第 5 个站点(使用与上面相同的代码,但不是在函数内)并且它工作正常。这里可能发生了什么?
编辑 1:根据要求显示更多站点 ID
> dput(sites[1:6])
list("9212", "10158", "11098", "15757", "15777", "15781")
我将您的代码转换为 for
循环,这样当事情失败时我可以看到所有变量的最新值。
失败并不总是出现在第 4 个站点上。 运行 你的代码几次,有时它在 2、3 或 4 上失败。当它失败时,如果我查看 j
,我会看到:
$message
[1] "finalizing archive"
$status
[1] "working"
$message
[1] "finalizing archive"
$status
[1] "working"
如果我在几秒后重新运行 check=GET(v$statusUrl); j<-content(check)
,那么我会看到
$archive
[1] "https://www.ncdc.noaa.gov/web-content/paleo/bundle/1986420067_2020-04-23.zip"
$status
[1] "complete"
所以,我认为服务器需要一点时间来准备下载文件,有时 R 会在文件准备好之前请求它,这会导致错误。一个简单的修复可能如下所示:
check_status <- function(v) {
check <- GET(v$statusUrl)
content(check)
}
for(x in seq_along(sites)) {
no<-sites[[x]]
data=GET(paste0('https://www.ncdc.noaa.gov/paleo-search/data/search.json?xmlId=', no))
v<-content(data)
try_counter <- 0
j <- check_status(v)
while(j$status != "complete" & try_counter < 100) {
Sys.sleep(0.1)
j <- check_status(v)
}
URL<-j$archive
download.file(URL, destfile=paste0(no, '.zip'))
}
如果状态未就绪,此版本将等待 0.1 秒,然后再次检查,最多 10 秒。
我编写了一个从 NOAA 数据库下载多个文件的函数。首先,我有 sites
这是我要从网站下载的网站 ID 列表。它看起来像这样:
> head(sites)
[[1]]
[1] "9212"
[[2]]
[1] "10158"
[[3]]
[1] "11098"
> length(sites)
[1] 2504
我的函数如下图所示。
tested<-lapply(seq_along(sites), function(x) {
no<-sites[[x]]
data=GET(paste0('https://www.ncdc.noaa.gov/paleo-search/data/search.json?xmlId=', no))
v<-content(data)
check=GET(v$statusUrl)
j<-content(check)
URL<-j$archive
download.file(URL, destfile=paste0('./tree_ring/', no, '.zip'))
})
奇怪的问题是它适用于前三个站点(正确下载),但在三个站点之后停止并抛出以下错误:
Error in charToRaw(URL) : argument must be a character vector of length 1
我试过手动下载第 4 个和第 5 个站点(使用与上面相同的代码,但不是在函数内)并且它工作正常。这里可能发生了什么?
编辑 1:根据要求显示更多站点 ID
> dput(sites[1:6])
list("9212", "10158", "11098", "15757", "15777", "15781")
我将您的代码转换为 for
循环,这样当事情失败时我可以看到所有变量的最新值。
失败并不总是出现在第 4 个站点上。 运行 你的代码几次,有时它在 2、3 或 4 上失败。当它失败时,如果我查看 j
,我会看到:
$message
[1] "finalizing archive"
$status
[1] "working"
$message
[1] "finalizing archive"
$status
[1] "working"
如果我在几秒后重新运行 check=GET(v$statusUrl); j<-content(check)
,那么我会看到
$archive
[1] "https://www.ncdc.noaa.gov/web-content/paleo/bundle/1986420067_2020-04-23.zip"
$status
[1] "complete"
所以,我认为服务器需要一点时间来准备下载文件,有时 R 会在文件准备好之前请求它,这会导致错误。一个简单的修复可能如下所示:
check_status <- function(v) {
check <- GET(v$statusUrl)
content(check)
}
for(x in seq_along(sites)) {
no<-sites[[x]]
data=GET(paste0('https://www.ncdc.noaa.gov/paleo-search/data/search.json?xmlId=', no))
v<-content(data)
try_counter <- 0
j <- check_status(v)
while(j$status != "complete" & try_counter < 100) {
Sys.sleep(0.1)
j <- check_status(v)
}
URL<-j$archive
download.file(URL, destfile=paste0(no, '.zip'))
}
如果状态未就绪,此版本将等待 0.1 秒,然后再次检查,最多 10 秒。