Ricerca…


Parametri

Parametro Dettagli
espr Nel caso in cui la "parte prova" sia stata completata con successo, tryCatch restituirà l' ultima espressione valutata . Quindi, il valore effettivo che viene restituito nel caso in cui tutto è andato bene e non vi è alcuna condizione (cioè un avvertimento o un errore ) è il valore di ritorno di readLines . Si noti che non è necessario dichiarare esplicitamente il valore restituito tramite return come codice nella "try parte" non è racchiuso all'interno di un ambiente di funzione (diversamente da quello per i condition conditioner per gli avvertimenti e gli errori di seguito)
warning / error / etc Fornire / definire una funzione di gestore per tutte le condizioni che si desidera gestire in modo esplicito. AFAIU, puoi fornire gestori per qualsiasi tipo di condizioni (non solo avvertenze ed errori , ma anche condizioni personalizzate ; vedi simpleCondition e amici per quello) purché il nome della rispettiva funzione di gestore corrisponda alla classe della rispettiva condizione (vedi Dettagli parte del documento per tryCatch ).
finalmente Qui va tutto ciò che dovrebbe essere eseguito alla fine, indipendentemente dal fatto che l'espressione nella "parte di prova" sia riuscita o se ci fosse qualche condizione. Se vuoi che più di un'espressione venga eseguita, devi avvolgerli tra parentesi graffe, altrimenti potresti semplicemente scrivere finally = <expression> (vale a dire la stessa logica di "prova parte".

Osservazioni

tryCatch

tryCatch restituisce il valore associato all'esecuzione di expr meno che non ci sia una condizione: un avviso o un errore. In questo caso, è possibile specificare specifici valori di ritorno (ad es. return(NA) sopra) fornendo una funzione di gestione per le rispettive condizioni (vedere argomenti warning e error in ?tryCatch ). Queste possono essere funzioni che esistono già, ma puoi anche definirle all'interno di tryCatch (come abbiamo fatto sopra).

Implicazioni nella scelta di specifici valori di ritorno delle funzioni del gestore

Come abbiamo specificato che NA dovrebbe essere restituito in caso di un errore nella "parte prova", il terzo elemento in y è NA . Se avessimo scelto NULL come valore di ritorno, la lunghezza di y sarebbe stata 2 anziché invece di 3 poiché lapply semplicemente "ignora / rilascia" i valori di ritorno che sono NULL . Si noti inoltre che se non si specifica un valore di ritorno esplicito tramite return , le funzioni del gestore restituiranno NULL (cioè in caso di errore o condizione di avvertenza ).

Messaggio di avviso "indesiderato"

Quando il terzo elemento del nostro vettore urls raggiunge la nostra funzione, riceviamo il seguente avviso oltre al fatto che si verifica un errore ( readLines lamenta per prima di non poter aprire la connessione tramite un avviso prima di fallire effettivamente con un errore ):

Warning message:
    In file(con, "r") : cannot open file 'I'm no URL': No such file or directory

Un errore "vince" su un avvertimento , quindi non siamo veramente interessati all'avvertimento in questo caso particolare. Quindi abbiamo impostato warn = FALSE in readLines , ma ciò non sembra avere alcun effetto. Un modo alternativo per sopprimere l'avviso è da usare

suppressWarnings(readLines(con = url))

invece di

readLines(con = url, warn = FALSE)

Utilizzando tryCatch ()

Stiamo definendo una versione robusta di una funzione che legge il codice HTML da un determinato URL. Robusto nel senso che vogliamo che gestisca situazioni in cui qualcosa va storto (errore) o non proprio come l'abbiamo programmato (avvertimento). Il termine generico per errori e avvertenze è condizione

Definizione della funzione usando tryCatch

readUrl <- function(url) {
    out <- tryCatch(

        ########################################################
        # Try part: define the expression(s) you want to "try" #
        ########################################################

        {
            # Just to highlight: 
            # If you want to use more than one R expression in the "try part" 
            # then you'll have to use curly brackets. 
            # Otherwise, just write the single expression you want to try and 

            message("This is the 'try' part")
            readLines(con = url, warn = FALSE) 
        },

        ########################################################################
        # Condition handler part: define how you want conditions to be handled #
        ########################################################################

        # Handler when a warning occurs:
        warning = function(cond) {
            message(paste("Reading the URL caused a warning:", url))
            message("Here's the original warning message:")
            message(cond)

            # Choose a return value when such a type of condition occurs
            return(NULL)
        },

        # Handler when an error occurs:
        error = function(cond) {
            message(paste("This seems to be an invalid URL:", url))
            message("Here's the original error message:")
            message(cond)

            # Choose a return value when such a type of condition occurs
            return(NA)
        },

        ###############################################
        # Final part: define what should happen AFTER #
        # everything has been tried and/or handled    #
        ###############################################

        finally = {
            message(paste("Processed URL:", url))
            message("Some message at the end\n")
        }
    )    
    return(out)
}

Test delle cose

Definiamo un vettore di URL in cui un elemento non è un URL valido

urls <- c(
    "http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html",
    "http://en.wikipedia.org/wiki/Xz",
    "I'm no URL"
)

E passare questo come input per la funzione che abbiamo definito sopra

y <- lapply(urls, readUrl)
# Processed URL: http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html
# Some message at the end
#
# Processed URL: http://en.wikipedia.org/wiki/Xz
# Some message at the end
#
# URL does not seem to exist: I'm no URL 
# Here's the original error message:
# cannot open the connection
# Processed URL: I'm no URL
# Some message at the end
#
# Warning message:
# In file(con, "r") : cannot open file 'I'm no URL': No such file or directory

Indagare l'output

length(y)
# [1] 3

head(y[[1]])
# [1] "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"      
# [2] "<html><head><title>R: Functions to Manipulate Connections</title>"      
# [3] "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">"
# [4] "<link rel=\"stylesheet\" type=\"text/css\" href=\"R.css\">"             
# [5] "</head><body>"                                                          
# [6] ""    

y[[3]]
# [1] NA


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow