我正在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
答案 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
}
您可能要检查是否成功并被杀死,如果被杀死,请执行其他操作