Podstawy R – Instrukcje warunkowe i pętle
W poprzedniej części kursu podstaw R zapoznaliśmy się z możliwościami przechowywania danych. Teraz przejdźmy do działania w R, czyli pisania w tym języku instrukcji warunkowych oraz pętli.
Instrukcja warunkowa
Ogólna konstrukcja instrukcji warunkowej w R wygląda następująco:
1 2 3 4 5 6 |
if (warunek) { działanie jeżeli warunek spełniony } else { działanie jeżeli nie spełniony } |
Najlepiej działanie instrukcji warunkowej przedstawić na przykładzie. Stwórzmy najpierw zmienną x, która będzie zawierała jakąś wartość:
1 |
x = 10 |
Teraz napiszemy prostą instrukcję warunkową wyświetlającą informacje czy zmienna x jest liczbą dodatnią:
1 |
if (x › 0 ) print(‘Zmienna x jest dodatnia’) |
Wykonując wprowadzoną linię kodu otrzymujemy:
1 |
[1] "Zmienna x jest dodatnia" |
Dodajmy do instrukcji if else, które w przypadku gdy zmienna x będzie ujemna wyświetli nam inną informacje:
1 2 3 4 5 6 |
if (x › 0) { print('Zmienna x jest dodatnia') } else { print('Zmienna x jest ujemna') } |
Wykonajmy wprowadzoną instrukcję:
1 2 |
if (x › 0) ... [1] "Zmienna x jest dodatnia" |
Zmieńmy wartość zmiennej x na ujemną:
1 |
x = -10 |
Wykonajmy jeszcze raz instrukcję:
1 2 |
if (x › 0) ... [1] "Zmienna x jest ujemna" |
W przypadku gdy zmienna x przyjmuje wartość 0 powinna zostać wyświetlona inna informacja niż w przedstawionych wyżej dwóch przykładach. Możemy do naszej instrukcji dodać dodatkowy if else.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
if (x ›= 0) { if(x == 0) { print(’Zmienna x jest równa zero') } else { print(’Zmienna x jest dodatnia') } } else { print(’Zmienna x jest ujemna') } |
Zmieńmy x na zero:
1 |
x = 0 |
I wykonajmy instrukcję:
1 2 |
if (x ›= 0) ... [1] "Zmienna x jest równa zero" |
Pętla FOR
Ogólna konstrukcja pętli for w R wygląda następująco:
1 2 3 4 5 6 7 |
for(i in zmienna_dla_której_wykonywana_jest_pętla) { działanie dla poszczególnych elementów zmiennej } |
Jak to wygląda w praktyce. Stwórzmy sobie wektor x zawierający pięć kolejnych liczb:
1 |
x = c(1:5) |
Wyświetlamy wektor x:
1 2 |
x [1] 1 2 3 4 5 |
Napiszmy pętlę liczącą potęgę każdej wartości w wektorze x i wyświetlająca wyniki tego działania:
1 2 3 4 5 6 7 8 9 |
for (i in x) { y = i*i print(y) } |
Wykonajmy pętlę:
1 2 3 4 5 6 7 |
for (i in x) … [1] 1 [1] 4 [1] 9 [1] 16 [1] 25 |
Pętla for jest wykonywana dla każdego z elementów wektora x.
Pętla WHILE
Ogólna konstrukcja pętli while w R wygląda tak:
1 2 3 4 5 6 7 |
while (sprawdzenie) { działanie } |
Pętla wykonywana jest do momentu gdy sprawdzenie będzie prawdziwe. Pokażemy to na przykładzie zmiennej y równej 0. Napiszmy pętlę while wyświetlającą wynik działania na zmiennej y. Działanie będzie polegało na dodawaniu do niej dwóch w pętli aż jej wartość będzie mniejsza od 16. Kod będzie wyglądał tak:
1 2 3 4 5 6 7 8 9 10 11 |
y = 0 while (y ‹ 16) { y = y+2 print(y) } |
Wykonajmy pętlę:
1 2 3 4 5 6 7 8 9 10 |
while (y ‹ 16) … [1] 2 [1] 4 [1] 6 [1] 8 [1] 10 [1] 12 [1] 14 [1] 16 |
Break i next
Pętle for i while możemy również przerwać używając break i next. Break służy do zatrzymania pętli, natomiast next do przejścia do kolejnego elementu. Użyjmy w poprzedniej pętli while zatrzymania break, gdy y będzie równe 8:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
y = 0 while (y ‹ 16) { y <- y+2 if(y==8) break print(y) } |
Wykonajmy zmodyfikowaną pętlę:
1 2 3 4 5 |
while (y ‹ 16) … [1] 2 [1] 4 [1] 6 |
Pętla zatrzymała się, gdy y było równe 8. Teraz pomińmy ten wynik w pętli while:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
y = 0 while (y ‹ 16) { y = y+2 if(y==8) next print(y) } |
Wykonajmy zmodyfikowaną pętlę:
1 2 3 4 5 6 7 8 9 |
while (y ‹ 16) … [1] 2 [1] 4 [1] 6 [1] 10 [1] 12 [1] 14 [1] 16 |
Pętle i instrukcje warunkowe mogą się wzajemnie przeplatać tworząc złożone struktury kodu.
Pętla for znajduje zastosowanie w automatycznym przetwarzaniu dużych zbiorów np. rastrów. W pierwszej kolejności kodujemy działanie na jednym pliku tj. wczytanie pliku, przetworzenie go i zapis wyniku. To działanie następnie zamykamy w pętli wykonującej je na naszym zbiorze plików.
W kolejnym kursie Podstaw R zaprezentujemy, jak kodować własne funkcje.