0

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

到目前为止,一切都很好。但是,在完成之前(当 Status = SUCCEEDED 时),以下函数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

4

1 回答 1

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
}

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

于 2019-04-25T14:28:49.300 回答