Menu
Coddy logo textTech

Generar errores con stop()

Parte de la sección Lógica y flujo del Journey de R de Coddy. Lección 52 de 64.

stop("message") genera un error: la función se detiene de inmediato, no se ejecuta nada después y R imprime el mensaje. Úsala cuando una función recibe una entrada con la que no puede trabajar:

check_qty <- function(q) {
  if (q <= 0) stop("quantity must be positive")
  q
}
print(check_qty(3))
print(check_qty(-1))
print("never printed")

Salida:

[1] 3
Error in check_qty(-1) : quantity must be positive
Calls: print -> check_qty
Execution halted

El texto del error indica la llamada que falló, y Execution halted significa que todo el script se detuvo: el último print() nunca se ejecutó. Un error se escribe en el flujo de errores, no en la salida normal, por lo que en Coddy una prueba falla cuando se imprime cualquier error o advertencia.

stopifnot() comprueba varias condiciones a la vez y genera un error para la primera que sea FALSE. Una condición con nombre usa su nombre como mensaje:

area <- function(w, h) {
  stopifnot("width must be positive" = w > 0, "height must be positive" = h > 0)
  w * h
}
print(area(2, 3))
print(area(2, -1))

Salida:

[1] 6
Error in area(2, -1) : height must be positive
Calls: print -> area -> stopifnot
Execution halted

Construye el mensaje a partir de los valores con paste0() o sprintf(), para que el lector vea qué estaba mal:

get_item <- function(items, i) {
  if (i > length(items)) stop(sprintf("index %d is past the end (%d items)", i, length(items)))
  items[i]
}
print(get_item(c("a", "b"), 5))

Salida:

Error in get_item(c("a", "b"), 5) : index 5 is past the end (2 items)
Calls: print -> get_item
Execution halted

Genera errores al principio de una función, antes de realizar cualquier trabajo. Las comprobaciones que detienen la ejecución pronto mantienen simple el resto de la función, porque esta puede asumir que la entrada es válida:

withdraw <- function(balance, amount) {
  if (amount <= 0) stop("amount must be positive")
  if (amount > balance) stop("insufficient funds")
  balance - amount
}
challenge icon

Desafío

Fácil

Completa make_order(item, qty, stock). Genera un error con stop():

  • quantity must be at least 1 cuando qty es menor que 1
  • only <stock> left cuando qty es mayor que stock, como en only 3 left

De lo contrario, devuelve ordered <qty> x <item>.

El código proporcionado lee el artículo, la cantidad y las existencias, llama a tu función e imprime su resultado o bien Error: seguido del mensaje de error, por lo que ninguna prueba muestra el texto de error propio de R.

Pruébalo tú mismo

make_order <- function(item, qty, stock) {
  # Escribe tu código aquí
  ""
}

# Código de entrada/salida suministrado: mantenlo tal como está
input <- suppressWarnings(readLines(file("stdin")))
result <- tryCatch(make_order(input[1], as.numeric(input[2]), as.numeric(input[3])),
                   error = function(e) paste("Error:", conditionMessage(e)))
cat(result, 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