等待 rgbif 下载完成后再继续

Wait for rgbif download to complete before proceeding

我正在用 R Shiny 开发一个小应用程序。部分应用需要查询GBIF下载物种发生数据。这可以使用 rgbif。函数 rgbif::occ_download() 将下载数据,而 rgbif::occ_download_meta() 将检查 GBIF 是否已满足您的请求。例如:

geometry <- "POLYGON((30.1 10.1,40 40,20 40,10 20,30.1 10.1))"
res <- occ_download(paste0("geometry within ", geometry), type = "within", format = "SPECIES_LIST")
occ_download_meta(res)

<<gbif download metadata>>
  Status: RUNNING
  Format: SPECIES_LIST
  Download key: 0004089-190415153152247
  Created: 2019-04-25T09:18:20.952+0000
  Modified: 2019-04-25T09:18:21.045+0000
  Download link: http://api.gbif.org/v1/occurrence/download/request/0004089-190415153152247.zip
  Total records: 0

到目前为止,还不错。但是,在 occ_download_meta(res) 完成(当 Status = SUCCEEDED)之前,以下函数 rgbif::occ_download_get() 无法下载数据用于下游分析。

如何让会话等到 GBIF 下载完成?我无法将等待时间硬编码到脚本中,因为不同大小的范围将花费 GBIF 更长或更短的时间来处理。此外,查询该服务的其他活跃用户的数量也可能会改变等待时间。因此,在继续之前,我需要某种标志,其中 Status == Succeeded。

我已经复制了一些框架代码,下面有注释。

library(rgbif)

geometry <- "POLYGON((30.1 10.1,40 40,20 40,10 20,30.1 10.1))" # Define boundary
res <- occ_download(paste0("geometry within ", geometry), type = "within", format = "SPECIES_LIST")

# WAIT HERE UNTIL Status == SUCCEEDED
occ_download_meta(res)

x <- occ_download_get(res, overwrite = TRUE) # Download data 
data<-occ_download_import(x) # Import into R

这里是 rgbif 维护者。您可以像我们在 occ_download_queue() 函数中那样做一些事情:

res <- occ_download(paste0("geometry within ", geometry), type = "within", format = "SPECIES_LIST")
still_running <- TRUE
status_ping <- 3
while (still_running) {
  meta <- occ_download_meta(res)
  status <- meta$status
  still_running <- status %in% c("succeeded", "killed")
  Sys.sleep(status_ping) # sleep between pings
}

你可能想检查成功和被杀死,如果被杀死则做一些不同的事情