Menu
Coddy logo textTech

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] NA
challenge icon

Desafío

Fácil

Completa 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")
quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de R online