Robuste Funktionen mit stop() und warning() schreiben
Lösen Sie benutzerdefinierte Bedingungen innerhalb Ihrer eigenen Funktionen aus.
Robuste Funktionen mit stop() und warning() schreiben ist eine kostenlose R Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des R Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum Eingabevalidierung wichtig ist
Defensive Funktionen prüfen ihre Eingaben und schlagen mit aussagekräftigen Fehlern deutlich fehl, anstatt unbemerkt falsche Ergebnisse zu erzeugen. Eine Funktion, die fehlerhafte Eingaben an der Grenze erkennt, lässt sich wesentlich leichter debuggen als eine Funktion, die unbrauchbare Daten durch eine Verarbeitungskette weitergibt.
# Without validation: wrong result, no error
bad_mean <- function(x) sum(x) / length(x)
bad_mean('hello') # no error, just NA
# With validation: clear error
good_mean <- function(x) {
if (!is.numeric(x)) stop('x must be numeric')
sum(x) / length(x)
}
tryCatch(good_mean('hello'), error = function(e) cat(e$message, '\n'))Aussagekräftige Fehlermeldungen
Allgemeine Fehler wie stop('bad input') sind beim Debuggen frustrierend. Verwenden Sie paste0() oder sprintf() innerhalb von stop(), um den tatsächlichen Wert und den erwarteten Typ in die Meldung aufzunehmen. Das spart Zeit beim Nachverfolgen von Fehlern in Verarbeitungsketten.
check_numeric <- function(x, arg_name = 'x') {
if (!is.numeric(x)) {
stop(sprintf(
"'%s' must be numeric, but got class '%s'",
arg_name, class(x)
))
}
}
tryCatch(check_numeric('abc', 'score'),
error = function(e) cat(e$message, '\n'))Länge und Wertebereich validieren
Häufige Validierungen sind: prüfen, dass ein Vektor nicht leer ist (length(x) == 0), dass ein Skalar innerhalb eines Wertebereichs liegt oder dass ein Dataframe die erwarteten Spalten enthält. Jede Prüfung sollte eine eigene, passende Fehlermeldung haben.
validate_prob <- function(p) {
if (!is.numeric(p)) stop(paste0('p must be numeric, got: ', class(p)))
if (length(p) != 1) stop(paste0('p must be length 1, got: ', length(p)))
if (p < 0 || p > 1) stop(paste0('p must be in [0,1], got: ', p))
p
}
cat(validate_prob(0.7), '\n')
tryCatch(validate_prob(1.5), error = function(e) cat(e$message, '\n'))warning() für nicht fatale Probleme verwenden
Verwenden Sie warning(), wenn die Funktion weiterhin ein sinnvolles Ergebnis liefern kann, die aufrufende Stelle aber über eine ungewöhnliche Situation informiert werden sollte – etwa beim Umwandeln eines Werts, beim Einsetzen eines Standardwerts oder beim Erkennen einer grenzwertigen Eingabe.
clamp <- function(x, lo, hi) {
if (any(x < lo)) warning(paste0(sum(x < lo), ' value(s) below lo, clamped'))
if (any(x > hi)) warning(paste0(sum(x > hi), ' value(s) above hi, clamped'))
pmax(lo, pmin(hi, x))
}
result <- clamp(c(2, -5, 7, 100, 4), 0, 10)
cat('Result:', result, '\n')call. = FALSE in stop()
Standardmäßig stellt stop() der Meldung Error in funcname(...): voran. Übergeben Sie call. = FALSE, um dieses Präfix zu unterdrücken, wenn der Aufrufkontext offensichtlich ist oder die Funktion als Dienstprogramm für Benutzende gedacht ist.
# With call. = TRUE (default): shows calling function
f1 <- function(x) stop('bad input')
tryCatch(f1(1), error = function(e) cat(conditionMessage(e), '\n'))
# With call. = FALSE: cleaner message
f2 <- function(x) stop('bad input', call. = FALSE)
tryCatch(f2(1), error = function(e) cat(conditionMessage(e), '\n'))Benutzerdefinierte Bedingungsklassen für stop()
Erstellen Sie mit structure() eine benutzerdefinierte Fehlerklasse, damit aufrufender Code nur die Fehler Ihrer Funktion abfangen kann, ohne alle Fehler abzufangen. Das ist die professionelle Vorgehensweise für Fehler auf Paketebene.
value_error <- function(msg, call = sys.call(-1)) {
structure(
class = c('value_error', 'error', 'condition'),
list(message = msg, call = call)
)
}
check_positive <- function(x) {
if (x <= 0) stop(value_error(paste0('Expected positive, got: ', x)))
x
}
tryCatch(check_positive(-3),
value_error = function(e) cat('ValueError:', e$message, '\n'),
error = function(e) cat('Other error:', e$message, '\n'))Spalten eines Dataframes prüfen
Wenn eine Funktion einen Dataframe erwartet, validieren Sie vor der Verwendung, dass die erforderlichen Spalten vorhanden sind. Verwenden Sie %in%, um Spaltennamen zu prüfen, und setdiff(), um die fehlenden Spalten zu ermitteln.
require_cols <- function(df, cols) {
missing <- setdiff(cols, names(df))
if (length(missing) > 0) {
stop(paste0('Missing columns: ', paste(missing, collapse = ', ')))
}
invisible(df)
}
df <- data.frame(x = 1:3, y = 4:6)
tryCatch(
require_cols(df, c('x', 'z', 'w')),
error = function(e) cat(e$message, '\n')
)stopifnot() für kompakte Zusicherungen
stopifnot(condition1, condition2, ...) löst einen Fehler aus, wenn eine der Bedingungen FALSE ist. Damit können Sie Vorbedingungen am Anfang einer Funktion kompakt zusichern, ohne separate Blöcke mit if (!...) stop(...) schreiben zu müssen.
compute_area <- function(width, height) {
stopifnot(
is.numeric(width),
is.numeric(height),
width > 0,
height > 0
)
width * height
}
cat(compute_area(5, 3), '\n')
tryCatch(compute_area(-1, 3), error = function(e) cat(e$message, '\n'))Benanntes stopifnot() für bessere Meldungen
In R 4.0+ ersetzen benannte Ausdrücke in stopifnot() die automatisch generierte Meldung durch Ihre eigene Beschreibung. Verwenden Sie den Ausdruckstext als Namen, um aussagekräftige Fehlermeldungen zu erzeugen.
validate_age <- function(age) {
stopifnot(
'age must be numeric' = is.numeric(age),
'age must be positive' = age > 0,
'age must be under 150' = age < 150
)
invisible(age)
}
tryCatch(validate_age(-5), error = function(e) cat(e$message, '\n'))
tryCatch(validate_age('x'), error = function(e) cat(e$message, '\n'))Validierung und Geschäftslogik kombinieren
Eine gut strukturierte Funktion trennt die Validierung von der Logik. Validieren Sie am Anfang und führen Sie anschließend die Operation aus. Dadurch wird die Funktion übersichtlicher und Fehler werden erkannt, bevor Berechnungen beginnen.
discount_price <- function(price, pct) {
if (!is.numeric(price) || price <= 0)
stop(paste0('price must be positive numeric, got: ', price))
if (!is.numeric(pct) || pct < 0 || pct > 100)
stop(paste0('pct must be in [0,100], got: ', pct))
if (pct > 50) warning('discount > 50% is unusual')
price * (1 - pct / 100)
}
cat(discount_price(100, 20), '\n')
cat(suppressWarnings(discount_price(100, 60)), '\n')tryCatch in Hilfsfunktionen
Manchmal sollte eine Hilfsfunktion Fehler intern behandeln und bei einem Fehlschlag einen Ersatzwert zurückgeben, anstatt sie weiterzugeben. Umschließen Sie die Kernlogik mit tryCatch() und geben Sie bei einem Fehler einen vereinbarten Platzhalter wie NA oder NULL zurück.
safe_log <- function(x) {
tryCatch({
if (!is.numeric(x)) stop('not numeric')
if (x <= 0) stop('must be positive')
log(x)
}, error = function(e) {
warning(paste0('safe_log failed for x=', x, ': ', e$message))
NA_real_
})
}
results <- sapply(list(10, -1, 'a', 100), safe_log)
cat(results, '\n')Kurze Überprüfung
Was bewirkt call. = FALSE, wenn es an stop() übergeben wird?
Robuste Funktionen: Wichtigste Erkenntnisse
Wichtigste Erkenntnisse zum Schreiben robuster Funktionen:
- Validieren Sie Eingaben am Anfang und brechen Sie mit aussagekräftigen
stop()-Meldungen deutlich ab - Nehmen Sie den tatsächlichen Wert in Fehlermeldungen auf:
paste0('Expected numeric, got: ', class(x)) - Verwenden Sie
warning()für nicht fatale Probleme, bei denen die Berechnung fortgesetzt werden kann call. = FALSEunterdrückt das Präfix der aufrufenden Funktion in Fehlermeldungenstopifnot()eignet sich für kompakte Zusicherungen; die benannte Form ermöglicht eigene Meldungen (R 4.0+)- Benutzerdefinierte Bedingungsklassen ermöglichen das gezielte Abfangen durch aufrufenden Code
robust_divide <- function(x, y) {
stopifnot('x must be numeric' = is.numeric(x),
'y must be numeric' = is.numeric(y))
if (y == 0) stop('Division by zero', call. = FALSE)
if (abs(y) < 1e-10) warning('y is very small; result may be inaccurate')
x / y
}
cat(robust_divide(10, 2), '\n')
tryCatch(robust_divide(10, 0), error = function(e) cat(e$message, '\n'))Lerne R mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 43
- Lektionen
- 159
Häufig gestellte Fragen
Ist die Lektion „Robuste Funktionen mit stop() und warning() schreiben“ kostenlos?
Ja — der vollständige Text von „Robuste Funktionen mit stop() und warning() schreiben“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des R Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Robuste Funktionen mit stop() und warning() schreiben“?
Lösen Sie benutzerdefinierte Bedingungen innerhalb Ihrer eigenen Funktionen aus. Du übst R Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um R Academy zu starten?
Keine Vorkenntnisse erforderlich. R Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Robuste Funktionen mit stop() und warning() schreiben“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser R Academy-Lektion Code schreiben und ausführen?
Ja. Jede R Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Fehler, Warnungen und Meldungen in R
- Fehlerbehandlung mit tryCatch()
- withCallingHandlers() und Restarts
- Robuste Funktionen mit stop() und warning() schreiben