0Pricing
R Academy · Lekcja

Błędy, ostrzeżenia i komunikaty w R

Poznaj trzy typy sygnałów i dowiedz się, kiedy każdy z nich jest zgłaszany.

Błędy, ostrzeżenia i komunikaty w R to bezpłatna lekcja R Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej R Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs R Academy zawiera 4 lekcji w sumie.

System warunków w R

R ma formalny system warunków służący do komunikowania problemów. Istnieją trzy główne klasy warunków: błędy (krytyczne — zatrzymują wykonanie), ostrzeżenia (niekrytyczne — są wyświetlane po zakończeniu kodu) oraz komunikaty (informacyjne — trafiają do stderr).

# Each condition type behaves differently
message('This is a message')
warning('This is a warning')
# stop() would halt here, so wrap it
tryCatch(stop('This is an error'), error = function(e) print(e))

stop() — Generowanie błędów

stop(msg) sygnalizuje warunek błędu. Wykonanie natychmiast się zatrzymuje, a komunikat błędu zostaje wyświetlony. Funkcji tej używa się wewnątrz funkcji, aby przerwać działanie, gdy dane wejściowe są nieprawidłowe lub wykryto sytuację, z której nie można się odzyskać.

divide <- function(x, y) {
  if (y == 0) stop('Division by zero is not allowed')
  x / y
}
tryCatch(divide(10, 0), error = function(e) cat('Error:', conditionMessage(e), '\n'))
divide(10, 2)

warning() — Ostrzeżenia niekrytyczne

warning(msg) sygnalizuje warunek ostrzeżenia. W przeciwieństwie do błędów ostrzeżenia nie zatrzymują wykonania — funkcja działa dalej, a ostrzeżenie zostaje zebrane. Domyślnie ostrzeżenia są wyświetlane po zakończeniu całego kodu lub natychmiast, jeśli ustawiono options(warn=1).

safe_sqrt <- function(x) {
  if (x < 0) {
    warning('Negative input; returning NaN')
    return(NaN)
  }
  sqrt(x)
}
result <- safe_sqrt(-4)
cat('Result:', result, '\n')

message() — Warunki informacyjne

message(msg) sygnalizuje warunek komunikatu. Trafia on do stderr, zawiera automatycznie dodany znak nowej linii i może zostać wyciszony za pomocą suppressMessages(). Używaj go do informowania o postępie działania funkcji, a nie do sygnalizowania błędów lub ostrzeżeń.

load_data <- function(n) {
  message('Loading ', n, ' records...')
  seq_len(n)
}
data <- suppressMessages(load_data(100))
cat('Got', length(data), 'records\n')

Obiekty simpleError i simpleWarning

Gdy R tworzy warunek, umieszcza komunikat w obiekcie warunku. Funkcje simpleError('msg') i simpleWarning('msg') ręcznie tworzą takie obiekty. Można je analizować za pomocą conditionMessage().

e <- simpleError('something went wrong')
w <- simpleWarning('this looks suspicious')
cat('Error class   :', class(e), '\n')
cat('Warning class :', class(w), '\n')
cat('Error message :', conditionMessage(e), '\n')
cat('Warning msg   :', conditionMessage(w), '\n')

conditionMessage() i conditionCall()

conditionMessage(cond) wyodrębnia komunikat tekstowy z dowolnego obiektu warunku. conditionCall(cond) wyodrębnia wywołanie, które wywołało warunek. Obie funkcje są przydatne wewnątrz procedur obsługi błędów do rejestrowania warunków lub ponownego ich sygnalizowania.

tryCatch(
  log(-1),
  warning = function(w) {
    cat('Caught warning :', conditionMessage(w), '\n')
    cat('From call      :', deparse(conditionCall(w)), '\n')
  }
)

options(warn = 2) — Traktowanie ostrzeżeń jak błędów

Ustawienie options(warn = 2) zamienia wszystkie ostrzeżenia w błędy, powodując natychmiastowe zatrzymanie wykonania. Jest to przydatne podczas tworzenia kodu, aby wcześnie wykrywać kod generujący ostrzeżenia. Przywróć ustawienie za pomocą options(warn = 0).

old_warn <- options(warn = 0)  # default: collect warnings
log(-1)  # just a warning
options(warn = 0)
tryCatch({
  options(warn = 2)
  log(-1)   # now fatal
}, error = function(e) cat('Caught as error:', conditionMessage(e), '\n'),
finally = options(old_warn))

Ostrzeżenia natychmiastowe a odroczone

Przy options(warn = 0) (ustawienie domyślne) ostrzeżenia są zbierane i wyświetlane na końcu. Przy options(warn = 1) każde ostrzeżenie jest wyświetlane natychmiast po wystąpieniu. Przy warn = 2 ostrzeżenia stają się błędami.

# warn=1: print warnings immediately as they happen
old <- options(warn = 1)
result1 <- log(-1)
result2 <- sqrt(-4)
cat('Results:', result1, result2, '\n')
options(old)

Błąd a ostrzeżenie: krytyczne a niekrytyczne

Najważniejsza różnica jest następująca: błąd całkowicie zatrzymuje wykonanie, chyba że zostanie przechwycony przez procedurę obsługi. Ostrzeżenie zostaje zarejestrowane, ale wykonanie jest kontynuowane. Oznacza to, że nieprawidłowe dane wejściowe mogą po cichu prowadzić do błędnych wyników, jeśli użyje się ostrzeżeń tam, gdzie powinny być użyte błędy.

# With warning: execution continues
f_warn <- function(x) { if (x < 0) warning('negative'); x^2 }
cat('warn result:', f_warn(-3), '\n')  # still computes 9

# With error: execution stops
f_stop <- function(x) { if (x < 0) stop('negative'); x^2 }
tryCatch(f_stop(-3), error = function(e) cat('stopped:', e$message, '\n'))

Zagnieżdżanie warunków

Warunki można zgłaszać wewnątrz innych procedur obsługi warunków. Procedura obsługi ostrzeżenia może wywołać stop(), aby przekształcić ostrzeżenie w błąd. Jest to często stosowany sposób zaostrzania działania kodu zewnętrznych pakietów.

strict_log <- function(x) {
  withCallingHandlers(
    log(x),
    warning = function(w) {
      stop(paste('Strict mode: warning treated as error:', conditionMessage(w)))
    }
  )
}
tryCatch(strict_log(-1), error = function(e) cat('Error:', e$message, '\n'))
cat('log(4) =', strict_log(4), '\n')

suppressWarnings() i suppressMessages()

suppressWarnings(expr) oblicza wyrażenie, jednocześnie po cichu przechwytując i odrzucając wszystkie ostrzeżenia. suppressMessages(expr) działa tak samo w przypadku warunków komunikatów. Używaj tych funkcji oszczędnie — wyciszanie ostrzeżeń może ukryć rzeczywiste problemy.

# Without suppression: warning shown
result1 <- log(-1)
# With suppression: warning hidden
result2 <- suppressWarnings(log(-1))
cat('Both are NaN:', is.nan(result1), is.nan(result2), '\n')

Szybkie sprawdzenie

Które z poniższych stwierdzeń dotyczących warning() i stop() jest prawidłowe?

Warunki: najważniejsze informacje

Najważniejsze informacje o warunkach w R:

  • stop() = błąd = warunek krytyczny, natychmiast zatrzymuje wykonanie; warning() = warunek niekrytyczny, wykonanie jest kontynuowane; message() = warunek informacyjny, trafia do stderr
  • Wszystkie trzy funkcje tworzą obiekty warunków z hierarchią klas
  • conditionMessage(e) wyodrębnia tekst z dowolnego warunku
  • options(warn=1) wyświetla ostrzeżenia natychmiast; warn=2 traktuje je jak błędy
  • suppressWarnings() / suppressMessages() wyciszają warunki
  • W przypadku nieprawidłowych danych wejściowych używaj raczej stop(), jeśli dalsze wykonywanie byłoby niewłaściwe
# Summary of the three condition functions
tryCatch({
  message('Step 1 starting')
  warning('something looks odd')
  stop('cannot continue')
}, message = function(m) cat('MSG:', conditionMessage(m)),
   warning = function(w) cat('WARN:', conditionMessage(w), '\n'),
   error   = function(e) cat('ERR:', conditionMessage(e), '\n'))

Często zadawane pytania

Czy lekcja „Błędy, ostrzeżenia i komunikaty w R” jest bezpłatna?

Tak — pełny tekst „Błędy, ostrzeżenia i komunikaty w R” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu R Academy, przejdź na CoddyKit PRO. Kurs R Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Błędy, ostrzeżenia i komunikaty w R”?

Poznaj trzy typy sygnałów i dowiedz się, kiedy każdy z nich jest zgłaszany. Ćwiczysz R Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć R Academy?

Nie wymagamy żadnego doświadczenia. R Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Błędy, ostrzeżenia i komunikaty w R”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji R Academy?

Tak. Każda lekcja R Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Błędy, ostrzeżenia i komunikaty w R
  2. tryCatch() do obsługi błędów
  3. withCallingHandlers() i restarty
  4. Pisanie odpornych funkcji za pomocą stop() i warning()
← Powrót do R Academy