Цикл ожидания результата или таймаута в r

Я написал очень быстрый сценарий взрыва в r, чтобы включить взаимодействие с NCBI blast API. Однако иногда загрузка URL-адреса результата занимает некоторое время, и мой сценарий выдает ошибку, пока URL-адрес не будет готов. Существует ли элегантный способ (т. Е. Опция tryCatch) для обработки ошибки до тех пор, пока результат не будет возвращен или тайм-аут после указанного времени?

  library(rvest)
  ## Definitive set of blast API instructions can be found here: https://www.ncbi.nlm.nih.gov/staff/tao/URLAPI/new/BLAST_URLAPI.html
  ## Generate query URL
  query_url <-
    function(QUERY,
             PROGRAM = "blastp", 
             DATABASE = "nr",
             ...) {
      put_url_stem <-
        'https://www.ncbi.nlm.nih.gov/blast/Blast.cgi?CMD=Put'
      arguments = list(...)
      paste0(
        put_url_stem,
        "&QUERY=",
        QUERY,
        "&PROGRAM=",
        PROGRAM,
        "&DATABASE=",
        DATABASE,
        arguments
      )
    }

  blast_url <- query_url(QUERY = "NP_001117.2")      ## test query
  blast_session <- html_session(blast_url)               ## create session
  blast_form <- html_form(blast_session)[[1]]         ## pull form from session
  RID <- blast_form$fields$RID$value      ## extract RID identifier

  get_url <- function(RID, ...) {
    get_url_stem <-
      "https://www.ncbi.nlm.nih.gov/blast/Blast.cgi?CMD=Get"
    arguments = list(...)
    paste0(get_url_stem, "&RID=", RID, "&FORMAT_TYPE=XML", arguments)
  }
  hits_xml <- read_xml(get_url(RID))    ## this is the sticky part 

Иногда это занимает несколько минут get_url чтобы начать жить так, что я хотел бы, это продолжать пытаться, скажем, каждые 20-30 секунд, пока он не выдаст URL или не истечет время по истечении предварительно определенного времени.

1 ответ

Решение

Я думаю, что вы можете найти этот ответ об использовании tryCatch полезным

Относительно части "продолжай пытаться до истечения времени ожидания". Я полагаю, вы можете работать над этим другим ответом о цикле tryCatch при ошибке

Надеюсь, поможет.

Другие вопросы по тегам