108
pazuRrry
Debugger i profiler
109
2.5 Debugger i profiler
Bez względu na doświadczenie, nic da się pisać dużych programów zupełnie po-' zbawionych błędów. Nawet program, który wydawał się być wolny od błędów, po zainstalowaniu nowej wersji jakiegoś pakietu może przestać działać lub zgłaszać bardzo dziwne wyniki. Należy więc umieć wyszukiwać i usuwać błędy.
2.5.1 Debugger
1*:’ Narzędzia do wyszukiwania i poprawiania błędów nazywa się debuggerami. W R blę-dy można śledzić na wiele sposobów, np. używając funkcji z pakietu debug. Pońiżej przedstawimy także kilka innych sposobów.
£;*, • Sytuacje awaryjne w R raportowane są jako błędy lub jako ostrzeżenia. Wystąpienie błędu powoduje wywołanie funkcji stop(base), co zazwyczaj kończy wykonywanie podprogramu. Przerywane jest wykonanie pętli, funkcji, bloku kodu i innych instrukcji. Ostrzeżenia też są raportowane, ale nie powodują przerwania .' . wykonywania podprogramu. Po napotkaniu błędu i wywołaniu funkcji stopO wy-: kónana zostanie akcja określona przez opcję error globalną dla całego środowiska. Zmieniając wartość tej opcji możemy zażądać, aby R przed przerwaniem wykonywanych instrukcji zapisał stan wszystkich aktualnych zmiennych. Umożliwi to analizę : póst-mortem tego, co się stało i ułatwi znalezienie przyczyny wystąpienia błędu, ś: Prześledźmy poniższy przykład.
ż wartość opcji 'error' określa, co ma się dziać po napotkaniu błędu tę wartość można zmieniać korzystając z argumentu ‘error-’ funkcji optionsO. Po poniższym poleceniu, R po napotkaniu błędu zapisze stan środowiska do pliku errorDump.RData ..options (orror=quote (dump. f rames ("errorDump" , TRUE) ) )
* no potrzeby poniższych przykładów zdefiniujmy funkcję wyznaczającą • logarytm
■ funkcja <- function(x) {
P' log(x)
Jeżeli nasz wynikowy plik ma być bardzo duży, to możemy nie chcieć, by wyg wstawek umieszczane były w tym samym pliku. Ustawiając we wstawce argun^S split=TRUE powodujemy, że wynik wykonanego w niej kodu R zostanie zapi* w osobnym pliku o nazwie w postaci plik-etykieta.tex, gdzie etykieta powinna być określona w liście argumentów. Oto przykład
<<split—FALSE, label*komentarz.S>>
Ten tekst trafi do innego pliku, który zostanie włączony do głównego pl£ wynikowego.
8
Wynik z wykonania skryptów R umieszczany jest w pliku wynikowym w jedń z dwóch środowisk Sinput (dla instrukcji R) i Soutput (dla wyników tych instr Aby kompilator *IgX’a potrafił rozpoznać te środowiska musi znać ich definicje. |j one określone w pliku Sweave. sty, który znajduje się w katalogu pakietu Swea Jeżeli w pliku wejściowym . Snw nie ma polecenia dołączenia tego pliku, to Sweave Q automatycznie do preambuły dodaje linie
\usepackagetj!ueave}
Jeżeli nie chcemy, by ta linia była dołączana, to możemy „oszukać” Sweayelą dodając do pliku . Snw zakomentowaną linię. Ta sztuczka przydaje się, jeżeli chce użyć innych definicji wspomnianych środowisk.
'/. \usepackage{Sweave>
Korzystając z pakietu Sweave możemy wygenerować zarówno dokument z objaśnieniem fragmentu kodu R (jak w przykładzie), automatycznie wygenero raport z wyników naszej firmy (szef się ucieszy my zaoszczędzimy czas), i wygenerować prezentacje np. korzystając z Beamer’a.
Oczywiście format pdf to nie jedyny możliwy format prezentacji wyników, nieje też możliwość 'automatycznego generowania wyników w formacie HTML. Wi< informacji znaleźć można w pomocy dla funkcji HTMLCR2HTML).
y J / Programowanie objaśniające nadaje się świetnie do przedstawiania
kretnych rozwiązań/poleceń/funkcji w R. Opis rozwiązania połąezofy "A / jest z kodem, który to rozwiązanie generuje a również z wynikiem # konania tego kodu. Czytelnik może więc szczegółowo porównać z argumentami wywoływanych poleceń, mając pewność, że autor nie pominął j; goś ważnego parametru.
Takie przykładowe rozwiązania są dostępne w R w postaci ilustracji nazywanych mgncttc. Do pakietów R, poza funkcjami, zbiorami danych i opisami, dołączane są. również ilustracje rozwiązań określonych problemów. Ilustracja składa się z kodu R prezentującego rozwiązanie oraz pliku przedstawiającego wynik tego rozwiąząj|ś nia. Dostęp do ilustracji rozwiązań odbywa się z użyciem funkcji vignette(utils). < Poniżej przedstawiamy przykładowe wywołania tej funkcji.
iniświetlmy listę ilustracji dostępnych w zainstalowanych pakietach etteCall “ TRUE)
hydob.ądźmy jedną konkretną ilustrację, dotyczącą wielowymiarowej oceny gęstości
%‘tracjaKDE = vignette("kda")
ższe polecenie otworzy plik PDF z teoretycznymi aspektami ,y * zaimplementowanymi w funkcji kde oraz opisem przykładów wykorzystania tej funkcji rłńt(ilustracj aKDE)
enohiższe polecenie otworzy okno edytora z kodami w języku R, których '< wyniki zostały przedstawione w powyższym pliku z opisem tej funkcji it(ilustracjaKDE)
Jeżeli ktoś twierdzi, że pisze programy bez błędów, to znaczy, że nic pisał dużych programów.
As a generał rulc (subject to numerous
exceptions, caveats,
etc.):
1) it is programming and dobugging tłme that most impacts Worali* program exocut.ion timc;
2) thls is most strongly imp&cted by codę readability and size (the smaller tlić bet ter);
3) both of which are enhanced by inodular
construction and reuseability, which argues for avoidiug inłine coda and using separate functions.
Theso days, I would argtie that most of tłte time it is program clarity and correctnaos (t.hey arc related) that is the iniportant issue, not exocution speed.
Ber ton Gunter (in a discussion about parsing spoed) fortune(125)