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 haltedEl 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 haltedConstruye 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 haltedGenera 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
}Desafío
FácilCompleta make_order(item, qty, stock). Genera un error con stop():
quantity must be at least 1cuandoqtyes menor que 1only <stock> leftcuandoqtyes mayor questock, como enonly 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")
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