等待rgbif下载完成,然后继续

时间:2019-04-25 10:39:05

标签: r ropensci

我正在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

到目前为止,太好了。但是,以下功能rgbif::occ_download_get()不能下载数据进行下游分析,直到occ_download_meta(res)完成(状态=成功)时。

如何使会话等待直到从GBIF下载完成?我无法将等待时间硬编码到脚本中,因为不同大小的扩展区将花费GBIF更长或更短的时间。同样,查询该服务的其他活动用户的数量也可能会更改等待时间。因此,在继续操作之前,我需要某种状态==成功的标志。

我在下面复制了一些带有注释的框架代码。

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

1 个答案:

答案 0 :(得分:1)

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
}

您可能要检查是否成功并被杀死,如果被杀死,请执行其他操作