Menu
Coddy logo textTech

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] 0

Wä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 
challenge icon

Aufgabe

Einfach

Vervollstä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")
quiz iconTeste dich selbst

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

Übe selbstständig: Online-R-Compiler