Capturar con tryCatch()
Parte de la sección Lógica y flujo del Journey de R de Coddy. Lección 53 de 64.
tryCatch(expr, error = function(e) ...) ejecuta expr. Si genera un error, el controlador se ejecuta en su lugar y su valor se convierte en el resultado; el script continúa:
safe_sqrt <- function(x) {
tryCatch(sqrt(x), error = function(e) NA)
}
print(safe_sqrt(16))
print(safe_sqrt("a"))
print("still running")Salida:
[1] 4
[1] NA
[1] "still running"El controlador recibe el error como e, y conditionMessage(e) devuelve el texto de su mensaje:
result <- tryCatch(
stop("file not found"),
error = function(e) paste("Problem:", conditionMessage(e))
)
print(result)Salida:
[1] "Problem: file not found"Envuelve solo la llamada que puede fallar y captúrala donde puedas hacer algo útil, como proporcionar un valor predeterminado o mostrar un mensaje al usuario:
to_number <- function(s) {
tryCatch({
if (s == "") stop("empty input")
as.integer(s)
}, error = function(e) -1L)
}
print(to_number("42"))
print(to_number(""))Salida:
[1] 42
[1] -1En un bucle, tryCatch() permite que un elemento problemático falle mientras los demás siguen procesándose:
inputs <- list(4, "x", 9)
for (v in inputs) {
r <- tryCatch(sqrt(v), error = function(e) "not a number")
cat(format(v), "->", r, "\n")
}Salida:
4 -> 2
x -> not a number
9 -> 3 Desafío
FácilCompleta safe_divide(a, b). Usa tryCatch(): dentro de ella, genera el error division by zero cuando b es 0 y, de lo contrario, calcula a / b. El controlador devuelve Error: seguido del mensaje. Devuelve el resultado redondeado a dos decimales como texto, 3.33, o el texto del error.
El código proporcionado lee pares de números como 10/3, separados por comas, e imprime el resultado de cada par en su propia línea.
Pruébalo tú mismo
safe_divide <- function(a, b) {
# Escribe tu código aquí
""
}
# Código de entrada/salida suministrado: déjalo como está
input <- suppressWarnings(readLines(file("stdin")))
for (pair in strsplit(input[1], ",")[[1]]) {
p <- as.numeric(strsplit(pair, "/")[[1]])
cat(safe_divide(p[1], p[2]), "\n", sep = "")
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y flujo
1Cadenas a fondo
Subcadenas con substr()Formateo con sprintf()Dividir y unirBuscar cadenasReemplazar textoRepaso - Constructor de nombres de usuario4Matrices
Creación de matricesIndexación de matricesResúmenes de filas y columnasAritmética de matricesRepaso: tabla de asientos2Búsquedas clave-valor
Búsquedas en vectores con nombreComprobar clavesAñadir y eliminar clavesRecorrer nombresRepaso: panel bursátil5Proyecto - Libro de calificaciones
Añadir estudiantesRegistrar calificaciones8Ordenación y agrupación
Ordenar vectoresOrdenar por una claveAgrupar con split()Resúmenes de gruposRepaso - Clasificación11Manejo de errores
Generar errores con stop()Capturar con tryCatch()Advertencias y finallyValidar la entradaRepaso: calculadora segura3Conjuntos y conteo
Valores únicosOperaciones con conjuntosPruebas de pertenenciaConteo con table()Repaso: invitados al evento6Funciones como valores
Funciones anónimasPasar funcionesDevolver funcionesClausuras con estadoRepaso: reglas de descuento9Marcos de datos
Creación de marcos de datosColumnas y filasFiltrado de filasAdición y ordenaciónRepaso - Informe de ventas12Proyecto: Rastreador de gastos
Registro de gastosGasto totalPractica por tu cuenta: Compilador de R online