Menu
Coddy logo textTech

Warnungen und finally

Teil des Abschnitts Logik und Ablaufsteuerung der R-Journey von Coddy. Lektion 54 von 64.

Eine Warnung meldet ein Problem, ohne die Ausführung zu stoppen: Die Funktion gibt einen Wert zurück, und R gibt die Warnung am Ende aus. as.numeric() warnt bei Text, der keine Zahl ist, und gibt NA zurück:

x <- as.numeric("abc")
print(x)

Ausgabe:

[1] NA
Warning message:
NAs introduced by coercion 

Wie Fehler werden auch Warnungen an den Fehlerstream gesendet und führen daher auf Coddy zum Fehlschlagen eines Tests. suppressWarnings() unterdrückt sie, wenn du das Ergebnis selbst überprüfst, und tryCatch(..., warning = ) wandelt eine Warnung in einen Wert um:

x <- suppressWarnings(as.numeric("abc"))
print(is.na(x))
r <- tryCatch(as.numeric("abc"), warning = function(w) paste("warned:", conditionMessage(w)))
print(r)

Ausgabe:

[1] TRUE
[1] "warned: NAs introduced by coercion"

warning("message") löst eine Warnung aus deinem eigenen Code aus. Ein Handler dafür funktioniert genauso wie einer für einen Fehler:

ratio <- function(a, b) {
  if (b == 0) warning("b is zero, returning Inf")
  a / b
}
r <- tryCatch(ratio(1, 0), warning = function(w) conditionMessage(w))
print(r)

Ausgabe:

[1] "b is zero, returning Inf"

finally = ... wird nach dem Ausdruck und jedem Handler ausgeführt, unabhängig davon, ob ein Fehler aufgetreten ist oder nicht. Verwende es für Arbeiten, die immer ausgeführt werden müssen, beispielsweise eine Abschlussmeldung:

load <- function(x) {
  tryCatch({
    if (x < 0) stop("negative")
    x * 10
  }, error = function(e) NA,
  finally = cat("finished", x, "\n"))
}
print(load(2))
print(load(-1))

Ausgabe:

finished 2 
[1] 20
finished -1 
[1] NA
challenge icon

Aufgabe

Einfach

Vervollständige to_numbers(texts). Wandle jeden Text in eine Zahl um. Werte, die nicht umgewandelt werden können, werden zu NA, ohne dass eine Warnung ausgegeben wird. Gib zwei Zeilen zurück: Numbers: mit den umgewandelten, durch Leerzeichen verbundenen Zahlen (einschließlich der NA-Werte) und Invalid: mit der Anzahl der Werte, bei denen die Umwandlung fehlgeschlagen ist.

Der bereitgestellte Code liest die Texte als durch Kommas getrennte Zeile ein und gibt jede zurückgegebene Zeile aus.

Probier es selbst

to_numbers <- function(texts) {
  # Schreibe deinen Code hier
  c("Numbers: ", "Invalid: 0")
}

# Mitgelieferter Ein-/Ausgabecode: belasse ihn wie er ist
input <- suppressWarnings(readLines(file("stdin")))
cat(to_numbers(strsplit(input[1], ",")[[1]]), 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