Szukaj…


Parametry

Parametr Detale
expr W przypadku pomyślnego ukończenia „części tryCatch zwróci ostatnio ocenione wyrażenie . Stąd faktyczna wartość zwracana na wypadek, gdyby wszystko poszło dobrze i nie ma żadnego warunku (tj. Ostrzeżenie lub błąd ) jest wartością readLines . Zauważ, że nie musisz wyjaśniać wartości zwracanej przez return ponieważ kod w „części próbnej” nie jest zawinięty wewnątrz środowiska funkcji (inaczej niż w przypadku procedur obsługi warunków dla ostrzeżeń i błędów poniżej)
ostrzeżenie / błąd / itp Podaj / zdefiniuj funkcję modułu obsługi dla wszystkich warunków, które chcesz jawnie obsłużyć. AFAIU, możesz dostarczyć moduły obsługi dla dowolnego typu warunków (nie tylko ostrzeżenia i błędy , ale także warunki niestandardowe ; zobacz simpleCondition i przyjaciele, jeśli to możliwe), o ile nazwa odpowiedniej funkcji modułu obsługi pasuje do klasy odpowiedniego warunku (patrz Szczegółowa część dokumentu tryCatch ).
Wreszcie Oto wszystko, co należy wykonać na samym końcu, niezależnie od tego, czy wyrażenie w części „try part” się powiodło, czy też wystąpił jakiś warunek. Jeśli chcesz wykonać więcej niż jedno wyrażenie, musisz zawinąć je w nawiasy klamrowe, w przeciwnym razie możesz po prostu napisać w finally = <expression> (tzn. Taką samą logikę jak dla „wypróbuj część”).

Uwagi

tryCatch

tryCatch zwraca wartość związaną z wykonaniem expr chyba że występuje warunek: ostrzeżenie lub błąd. W takim przypadku określone wartości zwracane (np. return(NA) powyżej) można określić, podając funkcję modułu obsługi odpowiednich warunków (patrz argumenty warning i error w ?tryCatch ). Mogą to być funkcje, które już istnieją, ale możesz je również zdefiniować w tryCatch (tak jak to zrobiliśmy powyżej).

Implikacje wyboru określonych wartości zwracanych przez funkcje obsługi

Jak ustaliliśmy, że NA powinien zostać zwrócony w przypadku błędu w „części próbnej”, trzecim elementem y jest NA . Gdybyśmy wybrali NULL jako wartość zwracaną, długość y byłaby po prostu 2 zamiast 3 ponieważ lapply po prostu „ignoruje / upuszcza” zwracane wartości, które są NULL . Zauważ również, że jeśli nie określisz wyraźnej wartości zwracanej przez return , funkcje modułu obsługi zwrócą NULL (tj. W przypadku błędu lub warunku ostrzegawczego ).

Komunikat ostrzegawczy „niepożądany”

Kiedy trzeci element naszego urls trafi w naszą funkcję, otrzymujemy następujące ostrzeżenie oprócz faktu, że wystąpił błąd ( readLines najpierw skarży się, że nie może otworzyć połączenia za pomocą ostrzeżenia, zanim faktycznie zawiedzie z błędem ):

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

Błąd „wygrywa” nad ostrzeżeniem , więc tak naprawdę nie jesteśmy zainteresowani ostrzeżeniem w tym konkretnym przypadku. Dlatego ustawiliśmy warn = FALSE w readLines , ale to nie wydaje się mieć żadnego efektu. Alternatywnym sposobem eliminacji ostrzeżenia jest użycie

suppressWarnings(readLines(con = url))

zamiast

readLines(con = url, warn = FALSE)

Korzystanie z tryCatch ()

Definiujemy solidną wersję funkcji, która odczytuje kod HTML z danego adresu URL. Solidny w tym sensie, że chcemy, aby poradził sobie z sytuacjami, w których coś pójdzie nie tak (błąd) lub niezupełnie tak, jak to zaplanowaliśmy (ostrzeżenie). Ogólny termin na błędy i ostrzeżenia to warunek

Definicja funkcji za pomocą 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)
}

Testowanie rzeczy

Zdefiniujmy wektor adresów URL, w których jeden element nie jest prawidłowym adresem URL

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"
)

I przekaż to jako dane wejściowe do funkcji, którą zdefiniowaliśmy powyżej

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

Badanie wyników

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow