■II l.iiHodne wprowadzenie do R
1.(1.1.3 Funkcja switch(base)
m
W przypadku omówionych powyżej instrukcji warunkowych, mieliśmy do czynienia z warunkiem logicznym, który mógł być prawdziwy lub fałszywy. Jednak w pewnych sytuacjach zbiór możliwych akcji, które chcemy wykonać jest większy, sytuacjach sprawdza się instrukcja warunkowa switchO o następującej składni:
switchCklucz, wartości « akcjal, wartosc2 = akcja2, ...)
Pierwszy argument powinien być typu znakowego lub typu wyliczeniowego factor.
W zależności od wartości tego argumentu jako wynik zostanie zwrócona wartość otrzymana w wyniku wykonania odpowiedniej akcji. W poniższym przykładzie spraw- :i dzamy jaka jest klasa danej zmiennej i w zależności od tego wykonujemy jeJ— z wielu możliwych akcji.
> dane = 1313
> # w poniższej instrukcji sprawdzana jest klasa zmiennej dane, ta klas
to 'numeric', ponieważ zmienna 'dane' przechowuje liczbę, dlatego też wykona śjĄ wyłącznie druga akcja
> svitcb(class(dane),
+ logical = ,
+ numeric = catCtyp liczbowy lub logiczny"),
+ factor = catCtyp czynnikowy"),
+ eat("trudno określić")
+■■)■■■
typ liczbowy lub logiczny
Jeżeli wartość klucza (pierwszego argumentu funkcji switchO) nie pasuje do etykiety żadnego z kolejnych argumentów, to wynikiem instrukcji switchO jest wartość argumentu nie nazwanego (czyli domyślną akcją w powyższym przykładzie jest wyświetlenie napisu "trudno określić"). Jeżeli wartość klucza zostanie dopasowana do etykiety jednego z kolejnych argumentów, ale nie jest podana żadna związana z nim akcja, to wykonana zostanie akcja dla kolejnego argumentu. Innymi słowy, jeżeli klucz mihłby wartość "logical", to ponieważ nie jest wskazana wartość dla argumentu logical” zostanie wykonana akcja wskazana przy kolejnej z etykiet, czyli "numeric".
I
/
Argumenty funkcji switchO korzystają z mechanizmu leniwego warto-,/S.^ ściowania (ang. lazy evaluation, więcej informacji nt. tego mechanizmu 'V /■'' przedstawimy w podrozdziale 2.1.9). Zwykłe przekazywanie argumentów SP funkcji polega na wyznaczeniu wartości kolejnych argumentów i na przekazaniu do funkcji wyłącznie wyznaczonych wartości. Gdyby tak było w powyższym przykładzie, to przed wywołaniem funkcji switchO wyznaczone byłyby wartości wszystkich argumentów, czyli wykonane byłyby wszystkie funkcje cat(). Tak się jednak (na szczęście) nie dzieje, ponieważ w tym przypadku argumenty przekazywane są w sposób leniwy i funkcja switchO sama decyduje, którą z instrukcji wykonać (wartość którego z argumentów wyznaczyć).
1.6.1.4 Pętla for
Najpopularniejszą pętlą w większości języków programowania jest pętla for. W języku R ta pętla również jest dostępna, ule korzysta się inaczej niż w większości języków programowania. Poniżej przedstawiamy składnię pętli for.
i.jfor (zmień in wekt)
?//': instr
Jeżeli chcemy w każdym wykonaniu pętli wykonać więcej poleceń, to instr można zastąpić blokiem instrukcji. Ta instrukcja lub blok instrukcji będzie wykonana tyle razy ile elementów ma wektor wekt. Zmienna zmień w każdym okrążeniu pętli przyjmować będzie kolejną wartość z tego wektora. Zacznijmy od przykładu.
> tt ta pętla wykona się dla każdego elementu wektora 1:Ą
> tor (i in 1:4) {
+ cat(pastę("aktualna wartość i to ", i, "\n"))
aktualna wartość i to 1 aktualna wartość i to 2 aktualna wartość i to 3 aktualna wartość i to 4
Co Więcej, wekt nie musi być wektorem, może być listą, której elementy są różnego typu!
Elementy wektora wekt mogą być dowolnego typu. Poniżej umieszczamy przy kład, w którym indeks funkcji przebiega po wartościach wektora napisów.
> indeksy * c("jabłka","gruszki","truskawki","pomarańcze")
> ż ta pętla wykona się dla każdego elementu wektora ’indeksy'
> for (i in Indeksy) {
+ cat(paste(i, ”\n"))
if > jabłka gruszki truskawki pomarańcze
Pętla for nie wymaga, by elementy wek były różne, ale warto o to zadbać. Ułatwia to śledzenie ewentualnych błędów, wystarczy bowiem wypisać, w którym kroku pętli wystąpił błąd. W większości przypadków wygodnie jest za wekt podać wektor kolejnych liczb całkowitych. Umożliwia to zapisywanie wyników z kolejnych okrążeń pętli w wektorze lub w macierzy.
W wielu sytuacjach do wyznaczania wektora indeksów pętli wygodnie jest się posłużyć funkcją seq_along(base). Argumentem tej funkcji jest, wektor dowolnych wartości a wynikiem jest wektor kolejnych liczb naturalnych od 1 do długości wektora będącego argumentem. Poniższy kod będzie miał identyczny wynik jak przykład z owocami powyżej ale pętla indeksowana jest, liczbami naturalnymi. Posługując się liczbowym indeksem i możemy wyniki zapisywać do macierzy lub innego obiektu, którego nie można indeksować nazwami owoców