Convalidare l'input
Fa parte della sezione Logica e flusso del percorso R di Coddy. Lezione 55 di 64.
L'input degli utenti o dei file è testo e può essere qualsiasi cosa. Controllalo prima di usarlo: suppressWarnings(as.numeric(s)) restituisce NA per il testo che non è un numero, e is.na() lo verifica:
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"))Output:
[1] "age 36"
[1] "not a number"
[1] "out of range"Un validatore può raccogliere tutti i problemi invece di fermarsi al primo, fornendo così un feedback più utile. Qui restituisce un vettore di messaggi, vuoto quando l’input è corretto:
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")))Output:
[1] "too short" "needs a digit"
[1] 0Scegli lo stile in base a chi chiama la funzione: restituisci un messaggio quando chi la chiama si aspetta un input non valido e lo mostra a un utente; genera un errore con stop() quando un input non valido indica un bug che non dovrebbe passare inosservato.
# il chiamante si aspetta un input non valido e mostra il messaggio
read_age("abc") # "not a number"
# un input non valido è un errore nel programma
if (!is.numeric(x)) stop("x must be numeric")Convalidare con tryCatch() attorno al passaggio di parsing mantiene il codice principale libero da controlli: ogni record viene convertito oppure segnalato:
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")
}Output:
tea,2 : ok 2
jam : expected 2 fields
oil,x : quantity is not a whole number Sfida
FacileCompleta check_signup(name, age, email). Raccogli tutti i problemi, in quest’ordine: name is empty (dopo aver rimosso gli spazi alle estremità), age must be a number, age must be 13 or older (solo quando l’età è un numero) e email needs @. Restituisci ok quando non ci sono problemi, altrimenti i problemi uniti da ; .
Il codice fornito legge il nome, l’età e l’indirizzo email (uno per riga) e stampa il valore restituito.
Provalo tu
check_signup <- function(name, age, email) {
# Scrivi qui il tuo codice
"ok"
}
# Codice di input/output fornito: lascialo così com'è
input <- suppressWarnings(readLines(file("stdin")))
cat(check_signup(input[1], input[2], input[3]), sep = "\n")
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Le stringhe in dettaglio
Sottostringhe con substr()Formattazione con sprintf()Dividere e unireRicerca nelle stringheSostituzione del testoRipasso - Generatore di nomi utente4Matrici
Creazione di matriciIndicizzazione delle matriciRiepiloghi di righe e colonneOperazioni aritmetiche con le matriciRipasso - Schema dei posti a sedere10Flusso di controllo avanzato
La funzione switch()ifelse() vettorialerepeat e breakFunzioni ricorsiveRiepilogo - Classificatore di voti2Ricerche chiave-valore
Ricerche in vettori con nomiControllare le chiaviAggiungere e rimuovere chiaviIterare sui nomiRiepilogo - Sportello titoli5Progetto - Registro dei voti
Aggiungere studentiRegistrare i voti8Ordinamento e raggruppamento
Ordinare i vettoriOrdinare in base a una chiaveRaggruppare con split()Riepiloghi dei gruppiRipasso - Classifica11Gestione degli errori
Generare errori con stop()Gestire gli errori con tryCatch()Avvisi e finallyConvalidare l'inputRiepilogo - Calcolatrice sicura3Insiemi e conteggio
Valori univociOperazioni sugli insiemiTest di appartenenzaConteggio con table()Riepilogo - Ospiti dell’evento6Le funzioni come valori
Funzioni anonimePassare funzioniRestituire funzioniClosure con statoRiepilogo - Regole di sconto9DataFrame
Creare DataFrameColonne e righeFiltrare le righeAggiungere e ordinareRiepilogo - Report delle vendite12Progetto - Gestione delle spese
Registrare le speseSpesa totaleEsercitati da solo: Compilatore R online