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 秒。