Advertencias y finally
Parte de la sección Lógica y flujo del Journey de R de Coddy. Lección 54 de 64.
Una advertencia informa de un problema sin detener la ejecución: la función devuelve un valor y R imprime la advertencia al final. as.numeric() emite una advertencia para el texto que no es un número y devuelve NA:
x <- as.numeric("abc")
print(x)Salida:
[1] NA
Warning message:
NAs introduced by coercion Al igual que los errores, las advertencias van al flujo de errores, por lo que en Coddy hacen que una prueba falle. suppressWarnings() las silencia cuando compruebas el resultado por tu cuenta, y tryCatch(..., warning = ) convierte una advertencia en un valor:
x <- suppressWarnings(as.numeric("abc"))
print(is.na(x))
r <- tryCatch(as.numeric("abc"), warning = function(w) paste("warned:", conditionMessage(w)))
print(r)Salida:
[1] TRUE
[1] "warned: NAs introduced by coercion"warning("message") genera una advertencia desde tu propio código. Un controlador para ella funciona de la misma manera que uno para un error:
ratio <- function(a, b) {
if (b == 0) warning("b is zero, returning Inf")
a / b
}
r <- tryCatch(ratio(1, 0), warning = function(w) conditionMessage(w))
print(r)Salida:
[1] "b is zero, returning Inf"finally = ... se ejecuta después de la expresión y de cualquier controlador, haya ocurrido un error o no. Úsalo para el trabajo que siempre debe realizarse, como un mensaje de cierre:
load <- function(x) {
tryCatch({
if (x < 0) stop("negative")
x * 10
}, error = function(e) NA,
finally = cat("finished", x, "\n"))
}
print(load(2))
print(load(-1))Salida:
finished 2
[1] 20
finished -1
[1] NADesafío
FácilCompleta to_numbers(texts). Convierte cada texto en un número. Los valores que no se puedan convertir se convierten en NA sin que se muestre ninguna advertencia. Devuelve dos líneas: Numbers: con los números convertidos unidos por espacios (incluidos los valores NA), y Invalid: con el número de valores que fallaron.
El código proporcionado lee los textos como una línea separada por comas e imprime cada línea devuelta.
Pruébalo tú mismo
to_numbers <- function(texts) {
# Escribe tu código aquí
c("Numbers: ", "Invalid: 0")
}
# Código de entrada/salida suministrado: mantenlo tal como está
input <- suppressWarnings(readLines(file("stdin")))
cat(to_numbers(strsplit(input[1], ",")[[1]]), sep = "\n")
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