Прежде чем продолжить, дождитесь завершения загрузки rgbif - PullRequest
0 голосов
/ 25 апреля 2019

Я занимаюсь разработкой небольшого приложения в 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) (когда Status = SUCCEEDED).

Как заставить сеанс ждать, пока загрузка из GBIF не будет завершеназавершена?Я не могу жестко запрограммировать время ожидания в сценарии, так как экстенты разных размеров будут обрабатывать GBIF больше или меньше.Кроме того, количество других активных пользователей, обращающихся к службе, также может изменить время ожидания.Поэтому мне нужен какой-то флаг, где Status == Успешно перед продолжением.

Я скопировал скелетный код с комментариями ниже.

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 Ответ

1 голос
/ 25 апреля 2019

сопровождающий 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
}

Вы, вероятно, хотите проверить, успешны ли и убиты, и сделать что-то другое, если убили

...