Eingaben validieren
Teil des Abschnitts Logik und Ablaufsteuerung der R-Journey von Coddy. Lektion 55 von 64.
Eingaben von Benutzern oder aus Dateien sind Text und können beliebig sein. Überprüfe sie, bevor du sie verwendest: suppressWarnings(as.numeric(s)) ergibt NA für Text, der keine Zahl ist, und is.na() prüft das:
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"))Ausgabe:
[1] "age 36"
[1] "not a number"
[1] "out of range"Ein Validator kann jedes Problem sammeln, anstatt beim ersten anzuhalten, wodurch er nützlicheres Feedback liefert. Hier gibt er einen Vektor mit Meldungen zurück, der leer ist, wenn die Eingabe in Ordnung ist:
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")))Ausgabe:
[1] "too short" "needs a digit"
[1] 0Wähle den Stil danach, wer die Funktion aufruft: Gib eine Meldung zurück, wenn der Aufrufer ungültige Eingaben erwartet und sie einem Benutzer anzeigt; löse mit stop() einen Fehler aus, wenn eine ungültige Eingabe einen Fehler im Programm bedeutet, der nicht unbemerkt bleiben sollte.
# der Aufrufer erwartet fehlerhafte Eingaben und zeigt die Meldung
read_age("abc") # "not a number"
# fehlerhafte Eingabe ist ein Fehler im Programm
if (!is.numeric(x)) stop("x must be numeric")Die Validierung mit tryCatch() um den Parsing-Schritt herum hält den Hauptcode frei von Prüfungen: Jeder Datensatz wird entweder konvertiert oder gemeldet:
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")
}Ausgabe:
tea,2 : ok 2
jam : expected 2 fields
oil,x : quantity is not a whole number Aufgabe
EinfachVervollständige check_signup(name, age, email). Sammle jedes Problem in dieser Reihenfolge: name is empty (nach dem Entfernen von Leerzeichen an den Enden), age must be a number, age must be 13 or older (nur wenn das Alter eine Zahl ist) und email needs @. Gib ok zurück, wenn kein Problem vorliegt, andernfalls die Probleme, verbunden mit ; .
Der bereitgestellte Code liest den Namen, das Alter und die E-Mail-Adresse (jeweils eine Angabe pro Zeile) und gibt den zurückgegebenen Wert aus.
Probier es selbst
check_signup <- function(name, age, email) {
# Schreibe deinen Code hier
"ok"
}
# Mitgelieferter Ein-/Ausgabe-Code: belasse ihn wie er ist
input <- suppressWarnings(readLines(file("stdin")))
cat(check_signup(input[1], input[2], input[3]), sep = "\n")
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik und Ablaufsteuerung
1Strings im Detail
Teilstrings mit substr()Formatierung mit sprintf()Aufteilen und VerbindenStrings durchsuchenText ersetzenWiederholung – Benutzernamen-Generator4Matrizen
Matrizen erstellenMatrizen indizierenZusammenfassungen von Zeilen und SpaltenMatrizenarithmetikRückblick – Sitzplan10Fortgeschrittener Kontrollfluss
Die switch()-FunktionVektorisierter ifelse()repeat und breakRekursive FunktionenRückblick – Notenklassifizierung2Schlüssel-Wert-Suchen
Benannte Vektor-SuchenSchlüssel prüfenSchlüssel hinzufügen und entfernenNamen durchlaufenRückblick – Aktienübersicht5Projekt – Notenbuch
Schüler hinzufügenNoten eintragen8Sortieren und Gruppieren
Vektoren sortierenNach einem Schlüssel sortierenGruppieren mit split()GruppenzusammenfassungenRückblick – Rangliste11Fehlerbehandlung
Fehler mit stop() auslösenMit tryCatch() abfangenWarnungen und finallyEingaben validierenZusammenfassung – Sicherer Rechner3Mengen und Zählen
Eindeutige WerteMengenoperationenZugehörigkeitstestsZählen mit table()Rückblick – Gäste einer Veranstaltung6Funktionen als Werte
Anonyme FunktionenFunktionen übergebenFunktionen zurückgebenClosures mit ZustandRückblick – Rabattregeln9Datenrahmen
Datenrahmen erstellenSpalten und ZeilenZeilen filternHinzufügen und SortierenZusammenfassung – Verkaufsbericht12Projekt – Ausgaben-Tracker
Ausgaben erfassenGesamtausgabenÜbe selbstständig: Online-R-Compiler