2017-02-03 2 views
-1

Ich habe ein sehr schnelles Blast-Skript in r geschrieben, um die Anbindung an die NCBI-Blast-API zu ermöglichen. Manchmal dauert es jedoch einige Zeit, bis die Ergebnis-URL geladen wird, und mein Skript gibt einen Fehler aus, bis die URL bereit ist. Gibt es einen eleganten Weg (d. H. Eine tryCatch-Option), um den Fehler zu behandeln, bis das Ergebnis zurückgegeben wird oder nach einer bestimmten Zeit abgelaufen ist?Schleife zum Warten auf Ergebnis oder Timeout in r

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 

Manchmal dauert es mehrere Minuten, bis die get_url leben so zu gehen, was Ich mag würde, ist zu tun, zu halten versuchen, die alle 20-30 Sekunden sagen lassen, bis sie entweder die URL oder wird nach einem prä- produziert angegebene Zeit.

Antwort

Verwandte Themen