Buscar..


Parámetros

Parámetro Detalles
expr En caso de que la "parte de prueba" se completara exitosamente, tryCatch devolverá la última expresión evaluada . Por lo tanto, el valor real que se devuelve en caso de que todo haya ido bien y no haya ninguna condición (es decir, una advertencia o un error ) es el valor de retorno de readLines . Tenga en cuenta que no necesita indicar explícitamente el valor de retorno a través del return ya que el código en la "parte de prueba" no se incluye en un entorno de funciones (a diferencia de los controladores de condición para advertencias y errores a continuación)
advertencia / error / etc Proporcione / defina una función de controlador para todas las condiciones que quiera manejar explícitamente. AFAIU, puede proporcionar manejadores para cualquier tipo de condiciones (no solo advertencias y errores , sino también condiciones personalizadas ; consulte simpleCondition y amigos), siempre y cuando el nombre de la función del manejador respectivo coincida con la clase de la condición respectiva (vea el Detalles de la parte del documento para tryCatch ).
finalmente Aquí va todo lo que debe ejecutarse al final, independientemente de si la expresión en la "parte de prueba" tuvo éxito o si hubo alguna condición. Si desea que se ejecute más de una expresión, entonces debe ajustarlas entre corchetes, de lo contrario, podría haber escrito finally = <expression> (es decir, la misma lógica que para "probar parte").

Observaciones

tryCatch

tryCatch devuelve el valor asociado a la ejecución de expr menos que exista una condición: una advertencia o un error. Si ese es el caso, los valores de retorno específicos (p. Ej., El return(NA) anterior) se pueden especificar proporcionando una función de controlador para las condiciones respectivas (consulte los argumentos warning y error en ?tryCatch ). Estas pueden ser funciones que ya existen, pero también puede definirlas dentro de tryCatch (como hicimos anteriormente).

Implicaciones de elegir valores de retorno específicos de las funciones del controlador

Como hemos especificado que NA debe devolverse en caso de un error en la "parte de prueba", el tercer elemento en y es NA . Si hubiésemos elegido NULL para ser el valor de retorno, la longitud de y solo habría sido 2 lugar de 3 ya que lapply simplemente "ignorará / caerá" los valores de retorno que sean NULL . También tenga en cuenta que si no especifica un valor de retorno explícito a través de return , las funciones del controlador devolverán NULL (es decir, en caso de un error o una condición de advertencia ).

Mensaje de advertencia "no deseado"

Cuando el tercer elemento de nuestro vector urls llega a nuestra función, recibimos la siguiente advertencia además del hecho de que se produce un error ( readLines primero se queja de que no puede abrir la conexión a través de una advertencia antes de fallar con un error ):

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

Un error "gana" sobre una advertencia , por lo que no estamos realmente interesados ​​en la advertencia en este caso en particular. Por lo tanto, hemos configurado warn = FALSE en readLines , pero eso no parece tener ningún efecto. Una forma alternativa de suprimir la advertencia es usar

suppressWarnings(readLines(con = url))

en lugar de

readLines(con = url, warn = FALSE)

Usando tryCatch ()

Estamos definiendo una versión robusta de una función que lee el código HTML de una URL determinada. Robusto en el sentido de que queremos que maneje situaciones en las que algo salga mal (error) o no de la forma en que lo planeamos (advertencia). El término paraguas para errores y advertencias es condición

Definición de funciones 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)
}

Probando cosas

Definamos un vector de URL donde un elemento no es una URL válida

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

Y pase esto como entrada a la función que definimos anteriormente

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

Investigando la salida

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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow