Validar la entrada
Parte de la sección Lógica y flujo del Journey de R de Coddy. Lección 55 de 64.
La entrada de los usuarios o de los archivos es texto y puede ser cualquier cosa. Compruébala antes de usarla: suppressWarnings(as.numeric(s)) devuelve NA para el texto que no es un número, y is.na() lo comprueba:
read_age <- function(s) {
n <- suppressWarnings(as.numeric(s))
if (is.na(n)) return("not a number")
if (n < 0 || n > 130) return("out of range")
paste("age", n)
}
print(read_age("36"))
print(read_age("abc"))
print(read_age("200"))Salida:
[1] "age 36"
[1] "not a number"
[1] "out of range"Un validador puede recopilar todos los problemas en lugar de detenerse en el primero, lo que proporciona comentarios más útiles. Aquí devuelve un vector de mensajes, vacío cuando la entrada es correcta:
check_password <- function(p) {
problems <- c()
if (nchar(p) < 8) problems <- c(problems, "too short")
if (!grepl("[0-9]", p)) problems <- c(problems, "needs a digit")
problems
}
print(check_password("abc"))
print(length(check_password("secret123")))Salida:
[1] "too short" "needs a digit"
[1] 0Elige el estilo según quién llame a la función: devuelve un mensaje cuando el llamador espera una entrada incorrecta y se la muestra al usuario; genera un error con stop() cuando una entrada incorrecta significa un error en el programa que no debería pasar desapercibido.
# el llamador espera una entrada incorrecta y muestra el mensaje
read_age("abc") # "not a number"
# la entrada incorrecta es un error en el programa
if (!is.numeric(x)) stop("x must be numeric")Validar con tryCatch() alrededor del paso de análisis mantiene el código principal libre de comprobaciones: cada registro se convierte o se informa:
parse_record <- function(line) {
parts <- strsplit(line, ",")[[1]]
if (length(parts) != 2) stop("expected 2 fields")
qty <- suppressWarnings(as.integer(parts[2]))
if (is.na(qty)) stop("quantity is not a whole number")
list(item = parts[1], qty = qty)
}
for (line in c("tea,2", "jam", "oil,x")) {
r <- tryCatch(parse_record(line), error = function(e) conditionMessage(e))
cat(line, ":", if (is.list(r)) paste("ok", r$qty) else r, "\n")
}Salida:
tea,2 : ok 2
jam : expected 2 fields
oil,x : quantity is not a whole number Desafío
FácilCompleta check_signup(name, age, email). Recopila todos los problemas, en este orden: name is empty (después de eliminar los espacios de los extremos), age must be a number, age must be 13 or older (solo cuando la edad es un número) y email needs @. Devuelve ok cuando no haya ningún problema; de lo contrario, devuelve los problemas unidos con ; .
El código proporcionado lee el nombre, la edad y el correo electrónico (uno por línea) e imprime el valor devuelto.
Pruébalo tú mismo
check_signup <- function(name, age, email) {
# Escribe tu código aquí
"ok"
}
# Código de entrada/salida suministrado: mantenlo tal como está
input <- suppressWarnings(readLines(file("stdin")))
cat(check_signup(input[1], input[2], input[3]), 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