Zgłaszanie błędów za pomocą stop()
Część sekcji Logika i przepływ sterowania ścieżki R w Coddy. Lekcja 52 z 64.
stop("message") zgłasza błąd: funkcja natychmiast się zatrzymuje, nic, co znajduje się po niej, nie zostaje uruchomione, a R wyświetla komunikat. Użyj jej, gdy funkcja otrzyma dane wejściowe, z którymi nie może pracować:
check_qty <- function(q) {
if (q <= 0) stop("quantity must be positive")
q
}
print(check_qty(3))
print(check_qty(-1))
print("never printed")Wynik:
[1] 3
Error in check_qty(-1) : quantity must be positive
Calls: print -> check_qty
Execution haltedTekst błędu podaje nazwę wywołania, które się nie powiodło, a Execution halted oznacza, że cały skrypt został zatrzymany: ostatnie print() nigdy się nie wykonało. Błąd jest zapisywany do strumienia błędów, a nie do standardowego wyjścia, dlatego w Coddy test kończy się niepowodzeniem, gdy zostanie wypisany jakikolwiek błąd lub ostrzeżenie.
stopifnot() sprawdza kilka warunków jednocześnie i zgłasza błąd dla pierwszego warunku, który ma wartość FALSE. Nazwany warunek używa swojej nazwy jako komunikatu:
area <- function(w, h) {
stopifnot("width must be positive" = w > 0, "height must be positive" = h > 0)
w * h
}
print(area(2, 3))
print(area(2, -1))Wynik:
[1] 6
Error in area(2, -1) : height must be positive
Calls: print -> area -> stopifnot
Execution haltedZbuduj komunikat z wartości za pomocą paste0() lub sprintf(), aby czytelnik zobaczył, co poszło nie tak:
get_item <- function(items, i) {
if (i > length(items)) stop(sprintf("index %d is past the end (%d items)", i, length(items)))
items[i]
}
print(get_item(c("a", "b"), 5))Wynik:
Error in get_item(c("a", "b"), 5) : index 5 is past the end (2 items)
Calls: print -> get_item
Execution haltedZgłaszaj błędy na początku funkcji, zanim zostanie wykonana jakakolwiek praca. Kontrole, które wcześnie przerywają działanie, upraszczają resztę funkcji, ponieważ można założyć, że dane wejściowe są prawidłowe:
withdraw <- function(balance, amount) {
if (amount <= 0) stop("amount must be positive")
if (amount > balance) stop("insufficient funds")
balance - amount
}Wyzwanie
ŁatwyUzupełnij make_order(item, qty, stock). Zgłoś błąd za pomocą stop():
quantity must be at least 1, gdyqtyjest mniejsze niż 1only <stock> left, gdyqtyjest większe niżstock, na przykładonly 3 left
W przeciwnym razie zwróć ordered <qty> x <item>.
Dostarczony kod odczytuje produkt, ilość i stan magazynowy, wywołuje Twoją funkcję i wyświetla jej wynik albo Error: , po którym następuje komunikat o błędzie, więc żaden test nigdy nie wyświetla własnego komunikatu o błędzie R.
Spróbuj swoich sił
make_order <- function(item, qty, stock) {
# Napisz tutaj swój kod
""
}
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input <- suppressWarnings(readLines(file("stdin")))
result <- tryCatch(make_order(input[1], as.numeric(input[2]), as.numeric(input[3])),
error = function(e) paste("Error:", conditionMessage(e)))
cat(result, sep = "\n")
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ sterowania
1Łańcuchy znaków w szczegółach
Podciągi za pomocą substr()Formatowanie za pomocą sprintf()Dzielenie i łączenieWyszukiwanie w łańcuchach znakówZastępowanie tekstuPowtórka – kreator nazwy użytkownika4Macierze
Tworzenie macierzyIndeksowanie macierzyPodsumowania wierszy i kolumnDziałania na macierzachPowtórka – plan miejsc10Zaawansowane sterowanie przepływem
Funkcja switch()Wektorowe ifelse()repeat i breakFunkcje rekurencyjnePodsumowanie — klasyfikator ocen2Wyszukiwanie wartości po kluczach
Wyszukiwanie nazwanych elementów wektoraSprawdzanie kluczyDodawanie i usuwanie kluczyIterowanie po nazwachPowtórzenie — giełda5Projekt — dziennik ocen
Dodawanie uczniówZapisywanie ocen8Sortowanie i grupowanie
Sortowanie wektorówSortowanie według kluczaGrupowanie za pomocą split()Podsumowania grupPowtórka – tabela wyników11Obsługa błędów
Zgłaszanie błędów za pomocą stop()Przechwytywanie błędów za pomocą tryCatch()Ostrzeżenia i finallyWalidacja danych wejściowychPodsumowanie – bezpieczny kalkulator3Zbiory i zliczanie
Unikalne wartościOperacje na zbiorachTesty przynależnościZliczanie za pomocą table()Podsumowanie — goście wydarzenia6Funkcje jako wartości
Funkcje anonimowePrzekazywanie funkcjiZwracanie funkcjiDomknięcia ze stanemPowtórka — reguły rabatowe9Ramki danych
Tworzenie ramek danychKolumny i wierszeFiltrowanie wierszyDodawanie i sortowaniePodsumowanie – raport sprzedaży12Projekt – śledzenie wydatków
Rejestrowanie wydatkówŁączne wydatkiPoćwicz samodzielnie: Kompilator R online