112
pazuRrry
Błędy i ostrzeżenia mogą zgłaszać też nasze programy. Funkcje simpleError(basę) i simpleWarning(base) służą do przygotowania komunikacje o błędu lub ostrzeż^ ,'3 niu. Dla obu funkcji za pierwszy argument należy podać komunikat., który ma się pojawić w razie zaistnienia sytuacji awaryjnej. Błąd lub ostrzeżenie można wygcnei\|st rować funkcjami stop(base) lub warning(base). Poniżej przedstawiamy przykłady^ użycia tych funkcji.
> tt poniższa funkcja generuje błąd lub ostrzeżenie, w zależności od
wartości argumentu
> drażliwa <- function(x) {
+ if (class(x) !- "numeric")
+ stopCsimpleErrorCmiała być liczba!!!"))
+ if (x <0)
+ tfarning(simpleWarning("spodziewałam się czegoś nieujemnego"))
+ }
> # argument, który nie jest liczbą wygeneruje błąd
> drazliwaftest")
Error: miała być liczba!!!
> # argument ujemny wygeneruje ostrzeżenie
> drażliwa(-2)
Warning in’drazliwa("2): spodziewałam się czegoś nieujemnego
Jeżeli spodziewamy się ostrzeżeń w uruchamianym poleceniu i chcemy te ostrze- '-}■ żenią zignorować, to możemy użyć funkcji suppressWarnings(base). Argumentem tej funkcji jest polecenie do wykonania, wyznaczony zostanie jego wynik a dodatkowo og zignorowane zostaną wszystkie wygenerowane ostrzeżenia.
Podobnie jest z błędami. Jeżeli spodziewamy się, że dane polecenie może wywo^j! lać błąd i na ten błąd chcemy odpowiednio zareagować (inaczej niż przerwaniem || podprogramu), to możemy użyć funkcji try(base). Ta funkcja wykona polecenie,..^' podane za jej argument. Dodatkowo, jeżeli polecenie wykona się bez błędu, to wy- ; ; nikiem funkcji try() będzie wyznaczony wynik argumentu. Jeżeli podczas wyko- k nywania wystąpi błąd, to wynikiem funkcji tryO będzie obiekt klasy try-error -A i komunikat o błędzie. Jeżeli nie chcemy, by komunikat o błędach byl sygnalizowany; to należy za drugi argument funkcji tryO podać silent=TRUE. Poniżej przykład & bezpiecznego uruchomienia funkcji corO.
> tt przykład bezpiecznej korelacji, czyli takiej, która nie generuje
błędów, a tylko wypisuje komentarz
> bezpieczna.cor <- function(x) {
+ tmp <- try(cor(x), silent=TRUE)
+ # sprawdzamy czy wystąpił błąd, sprawdzając klasę wyniku funkcji try()?
* if (class(tmp)"try-error") {
+ catCKorelaćja nie została policzonaYn")
+ tmp =0
* >
+ tmp + >
> # wywołanie zwykłej funkcji corO zakończy się błędem
> cor(l)
Error in cor(l) : supply both ’x' and ’y’ or a'matrix-like 1 x’
Debugger i probier
> ( wywołanie bezpiecznej corO błędu nir ityijnalieuje
> bezpieczna.cor(l)
Korelacja nie została policzona
i-' Przy okazji omawiania sytuacji blędogennych warto wspomnieć o pewnych, niein-tuicyjnych, zagrożeniach wynikających z arytmetyki zmiennopozycyjnej. Przyjrzyjmy się poniższemu przykładowi.
i
-?>:■# błąd wynikający z niedokładnej reprezentacji liczb rzeczywistych
> v
. [1) 0.7 0.8 5> V 0.8 : [13 FALSE FALSE
:9::
| / Należy być ostrożnym porównując liczby lub wektory liczb rzeczywistych. Problemy, wynikające z zaokrągleń oraz dokładności reprezentacji liczb rzeczywistych w pamięci komputera, mogą pojawić się nawet w bardzo prostych i niewinnie wyglądających sytuacjach.
VV powyższym przykładzie spodziewalibyśmy się wyniku FALSE TRUE. Zaskakujący wynik FALSE FALSE jest efektem zaokrągleń w arytmetyce liczi) rzeczywistych. Aby go uniknąć najlepiej nie używać operatora == w kontekście liczb rzeczywistych. Jeżeli chcemy mieć pewność, że super-dokladnie wyznaczymy wynik, to należy korzystać z obliczeń symbolicznych lub obliczeń na liczbach całkowitych (np. w banku . licząc pieniądze nie możemy pozwolić sobie na żadne niedokładności).
Warto przy okazji wspomnieć o dwóch zmiennych: .Machinę i .Platform, które przechowują informacje o parametrach systemu operacyjnego, w którym pracujemy oraz o parametrach maszyny obliczeniowej, na której pracujemy. Każda z tych zmiennych jest listą wartości opisujących właściwości maszyny lub platformy (a więc jak reprezentowane są liczby w pamięci maszyny oraz z jaką dokładnością wykonywane są operacje). Dokładny opis poszczególnych pól tych list znaleźć można w plikach pomocy. Poniżej przedstawiono przykładowe wartości.
.tt u/artości zmiennych .Machinę i .Platform unlistf.Machinę)
double.eps |
double.neg.eps |
double-xmin | |
2.220446e-ł6 |
1.110223e-16 |
2.225074e-308 | |
double. xmax |
double.base |
double.digits | |
1.797693e+308 |
2.000000e+00 |
5.300000e+01 | |
double.rounding |
double. guard |
double.ulp.digits | |
. |
5.000000e+00 |
0.000000e+00 |
-5.200000e+01 |
double.neg.ulp.digit |
s dube.exponent |
double.min.exp | |
Si' |
-5.300000e+01 |
1.100000e+01 |
-1.022000e+03 |
p. |
double.max.exp |
integer.max |
sizeof.long |
1.024000e+03 |
2.147484e+09 |
4.000000e+00 | |
sizeof.longlong |
sizeof.longdouble |
sizeof.pointer | |
8.000000e+00 |
i. 200000e+-01 |
4.000000e+00 |