2 Start R

Wykonywanie kodu w języku interpretowalnym, jakim jest R, może odbywać się poprzez wpisanie polecenia w oknie konsoli (zwanej też terminalem) i jego uruchomienie17. Komendy są najpierw sprawdzanie pod kontekstem ich poprawności. Polega to na określeniu, np. czy podana funkcja lub inny obiekt istnieje, czy nie zostały użyte niedozwolone znaki, lub czy wszystkie nawiasy czy cudzysłowy zostały zamknięte. Języki programowania są w tym aspekcie bardziej bezwzględne niż języki naturalne - nie potrafią one zrozumieć wyrażeń zawierających nawet niewielkie błędy takie jak, np. użycie dużej litery zamiast małej.

2.1 Wyrażenia

Podstawowe działania arytmetyczne, dodawanie, odejmowane, mnożenie i dzielenie, są również często używane w wielu językach programowania. Dla każdej z tych operacji istnieje odpowiedni operator w R. Operatorem dodawania jest +.

2 + 2
#> [1] 4

Operatorem odejmowania jest -.

1 - 3
#> [1] -2

Operatorem mnożenia jest *.

5 * 5
#> [1] 25

Operatorem dzielenia jest /.

42 / 5
#> [1] 8.4

Wszystkie powyższe operacje można wykonać poprzez ich wpisanie w oknie konsoli R i naciśnięcie klawisza Enter.

2.2 Obiekty

“Dwa slogany są pomocne w zrozumieniu obliczeń w R: 1. Wszystko co istnieje jest obiektem. 2. Wszystko co się dzieje jest wywołaniem funkcji.” John Chambers

Powyższy cytat sugeruje dwa najważniejsze elementy języka R: obiekty i funkcje. Zrozumienie w jaki sposób się je tworzy i zmienia będzie w związku z tym, konieczną wiedzą osób piszących w tym języku.

2.2.1 Operator przypisania

Nadanie wartości do obiektu wykonuje się używając operatora przypisania18. R posiada trzy operatory przypisania, które mają niemal identyczne działanie19: =, <-, ->. Warto wybrać jeden z tych operatorów i konsekwentnie używać go pisząc kod. W tej książce jako główny operator przypisania będzie używany znak =.

W poniższej linii stworzony jest nowy obiekt, o nazwie x, który zawiera wartość 7.

x = 7

Można to sprawdzić wpisując nazwę tego obiektu.

x
#> [1] 7

Operatory przypisania może również posłużyć do nadania wartości z jednego obiektu do drugiego. Poniżej nowy obiekt y przyjmuje wartość od obiektu x.

y = x
y
#> [1] 7

Język R przechowuje i przetwarza wszystkie obiekty w pamięci komputera (RAM). Wpływa to na zwiększoną wydajność i elastyczność obliczeń, ale jednocześnie powoduje to ograniczenie wielkości obiektów na jakich można pracować. Istnieje równocześnie szereg strategii jak postępować z większymi zbiorami danych, które nie mieszczą się w RAMie (Peng, Kross, and Anderson 2017).

2.2.2 Działania na obiektach

Każdy stworzony obiekt w R może być następnie używany do kolejnych operacji, a w efekcie też tworzenia nowych obiektów. W poniższych czterech przypadkach obiekt x został przetworzony używając operatorów dodawania, odejmowania, mnożenia oraz dzielenia, a jako wyniki tych obliczeń powstały nowe obiekty.

z1 = x + 3
z1
#> [1] 10
z2 = x - 5
z2
#> [1] 2
z3 = x * 2
z3
#> [1] 14
z4 = x / 4
z4
#> [1] 1.75
Część języków programowania, np. C, wymaga zadeklarowania zmiennej przed jej użyciem poprzez podanie jej typu i nazwy. Wybór typu zmiennej w tych językach może mieć widoczne konsekwencje. Przykładowo, jeżeli obiekt x zostanie zadeklarowany jako liczba całkowita (integer), wynikiem dzielenia x / 4 będzie 1 zamiast 1.75.

Działania na obiektach mogą też się odbywać używając innych operatorów oraz różnorodnych funkcji. Przykładowo, operator zapisywany jako %% to modulo, którego celem jest określanie reszty z dzielenia.

z5 = x %% 3
z5
#> [1] 1

Operator %/% przedstawia dzielenie całkowite.

z6 = x %/% 3
z6
#> [1] 2

Operator ^ natomiast wykonuje podniesienie wartości obiektu do wybranej potęgi.

z7 = x^2
z7
#> [1] 49

Odwrotnością potęgowania jest pierwiastkowanie. W R nie istnieje do tego celu specjalny operator, ale zawiera on funkcję sqrt().

z8 = sqrt(x)
z8
#> [1] 2.65

Często używaną funkcją w R jest też c(). Ta funkcja łączy krótsze wektory w dłuższe wektory.

z9 = c(z2, z4, z8)
z9
#> [1] 2.00 1.75 2.65

Operatory użyte w tym rozdziale, np. +, *, ^, %% to też są funkcje, ale zapisane w skrótowej formie ułatwiającej z nimi pracę. Te operatory można też użyć jako normalne funkcje poprzez dodanie znaku zwanego grawisem - “`”, np. 2 + 2 można też zapisać jako `+`(2, 2).

2.3 IDE

Zintegrowane środowisko programistyczne (ang. Integrated Development Environment, IDE) to program ułatwiający pisanie kodu. Zawiera on wiele użytecznych funkcjonalności, takich jak wbudowany edytor i konsola, podświetlanie składni, automatyczne uzupełnianie kodu, itd. Bez IDE kod musi być pisany w jednym programie, a następnie kopiowany i uruchamiany w innym.

Do popularnych IDE dla R należą:

  • RStudio
  • Emacs + ESS
  • vim + Nvim-R
  • Visual Studio + RTVS

W tej książce będzimy korzystać z pierwszego z nich. RStudio to zintegrowane środowisko programistyczne pierwotnie stworzone dla R.

RStudio to nie jest to samo co R. R jest językiem programowania, podczas gdy RStudio to aplikacja ułatwiająca pisanie kodu. Możliwe jest używanie R bez RStudio, ale RStudio bez R nie pełni już swojej roli. Częstą analogią jest porównanie samochodowe, w którym R jest opisywany jako silnik a RStudio jako deska rozdzielcza.
Okno RStudio z opisaną funkcjonalnością każdej z jego części.

Rycina 2.1: Okno RStudio z opisaną funkcjonalnością każdej z jego części.

Typowa praca w RStudio często polega na wpisywaniu poleceń do pliku tekstowego widocznego w części skryptowej (rycina 2.1), a następnie wykonywaniu kolejnych linii kodu w oknie konsoli używając skrótu klawiaturowego CTRL+ENTER (więcej przydatnych skrótów klawiaturowych można znaleźć w tabeli 2.1). Efektem wykonywania funkcji może być powstanie nowych obiektów, które można zobaczyć w oknie “środowiska” lub też wyświetlenie grafik, które można zobaczyć w oknie “wykresu” (rycina 2.1).

Dobrą praktyką pracy z R w RStudio jest też używanie projektów RStudio (ang. RStudio projects). Projekt jest to folder zawierający wszystkie skrypty i pozostałe pliki powiązane z jakimś zadaniem (np. analizą danych, czy stworzeniem nowego pakietu R). Ułatwia on przenoszenie kodu pomiędzy różnymi komputerami, a także daje dostęp do szeregu dodatkowych możliwości w RStudio.

Aby stworzyć pierwszy projekt RStudio, należy:

  1. Kliknąć File -> New Project.
  2. Wybrać New Directory.
  3. Wybrać New Project.
  4. Podać nazwę nowego projektu, np. “programowanie1” oraz wybrać miejsce na dysku, gdzie ma się nowy projekt znajdować.
  5. Jeżeli możliwe, to wybrać też opcję Create a git repository.
  6. Kliknąć Create Project.

W ten sposób zostanie utworzony nowy folder wraz z plikiem o nazwie projektu z rozszerzeniem .Rproj, np. programowanie1.Rproj. Ten folder staje się też od razu folderem roboczym (więcej na ten temat znajdziesz w rozdziale 9). Otwarcie wcześniej stworzonego projektu ma miejsce poprzez uruchomienie pliku z rozszerzeniem .Rproj lub też wybór projektu w prawym górnym rogu RStudio.

Tabela 2.1: Podstawowe skróty klawiaturowe w RStudio
Skrót Wyjaśnienie
Ctrl+Enter Wykonuje wybraną linię kodu w skrypcie R
Tab Uzupełnia kod (podaje pasujące możliwości)
F1 Wyświetla plik pomocy dla wybranej funkcji
Ctrl+Shift+C Ustawia wybrane linie jako komentarz/odkomentuj fragment kodu
strzałka Góra/Dół (w oknie konsoli) Wybiera wcześniej wpisany kod
Esc Przerywa niedokończoną operację
Shift+Alt+K Wyświetla listę skrótów klawiaturowych

2.4 Styl

Języki programowania pozwalają na napisanie dokładnie tego samego kodu na wiele sposobów. Przykładowo z1 = x + 3 ma identyczne działanie jak z1=x+3. Styl pisania kodu obejmuje, między innymi, sposoby nazywania obiektów, stosowania odstępów czy wcięć, czy też pisania komentarzy. Przyjęcie wybranego stylu pozwala na ułatwienie czytania i zrozumienia kodu oraz zmniejszenie szans na powstawanie w nim błędów.

Poniżej znajdują się podstawowe porady dotyczące stylu pisania kodu. Więcej wskazówek można znaleźć na w poradniku stylu RStudio oraz poradniku stylu Google. Oba te poradniki nie są identyczne i czasami zawierają sprzeczne porady. Najważniejsze jest, aby wybrać jeden odpowiadający piszącemu kod styl i się go konsekwentnie trzymać.

2.4.1 Nazwy obiektów

Istnieje wiele konwencji nazywania obiektów20. Najczęściej używaną konwencją w R jest tzw. “snake case”. Polega ona na tworzeniu nazw obiektów składających się ze słów połączonych znakiem podkreślenia (_). Ważne, żeby nazwy obiektów ułatwiały zrozumienie ich zawartości.

# obiekt
bok_a
bok_b

# funkcja
pole_prostokata()

Nazwa obiektu nie może zaczynać się od liczby, ani nie może używać specjalnych symboli, tj. ^, !, $, @, +, -, /, czy *. Dodatkowo należy uważać, żeby nowa nazwa obiektu nie nadpisała istniejącego obiektu lub funkcji. Nie powinno nazywać się obiektów tak jak istniejące funkcje, np. c, t, table, itd.

2.4.2 Odstępy

Odstępy pełnią bardzo ważną funkcję przy pisaniu kodu, podobnie jak odstępy przy pisaniu tekstu. Wyobraź sobie czytanie powieści, w której nie ma żadnych odstępów między słowami czy rozdziałami. Często mówi się, że “kod musi oddychać” - odstępy zwiększają czytelność kodu i pozwalają na jego szybsze zrozumienie oraz ułatwiają naprawienie występujących błędów.

Odstępy można uzyskać poprzez użycie spacji. Spacje powinny być użyte po przecinkach, ale nigdy przed nimi. Dodatkowo, większość operatorów (np. =, +, -, ==) powinna być otoczona przez spacje.

# Zalecane
srednia = mean(wartosc, na.rm = TRUE)
pole = bok_a * bok_b

# Niewskazane
srednia=mean ( wartosc,na.rm=TRUE ) 
pole=bok_a*bok_b

Spacje należy również używać do tworzenia wcięć - każde z nich powinno się składać z dwóch spacji.

# Zalecane
moja_funkcja = function(x, y, z){
  pod = y / z
  wynik = x * pod
  wynik
}

# Niewskazane
moja_funkcja = function(x, y, z){
pod = y / z
wynik = x * pod
wynik
}

Warto także ograniczać długość każdej linii kodu, żeby nie przekraczała ona ok. 80 znaków. Dzięki temu możliwe jest szybkie przeczytanie kodu czy też jego wydrukowanie.

# Zalecane
bardzo_wazny_wynik = moja_bardzo_wazna_funkcja("pierwszy argument",
                                               b = "drugi argument", 
                                               c = "trzeci argument")

# Niewskazane
bardzo_wazny_wynik = moja_bardzo_wazna_funkcja("pierwszy argument", "drugi argument", "trzeci argument")

2.4.3 Komentarze

Komentarze służą do wyjaśniania istotnych elementów kodu. Do komentowania w języku R służy operator #.

# Mój komentarz

2.4.4 Nazwy plików

Nazwy plików powinny spełniać trzy wymagania - być łatwe (i) do odczytania przez komputer, (ii) do odczytania przez człowieka, (iii) do posortowania.

Nazwy plików nie powinny zawierać spacji, znaków specjalnych (np. !, %, *), znaków diakrytycznych (np. ć, Ł, ź). Warto też aby nazwy plików składały się tylko z małych liter.

# Zalecane
obliczanie-sredniej.R
pomiary-temperatury.csv

# Niewskazane
Obliczanie Średniej.R
pomiaryTemperatury!.csv

Podobnie jak nazwy obiektów, również nazwy plików powinny opisywać ich zawartość.

# Zalecane
obliczanie-sredniej.R
pomiary-temperatury.csv

# Niewskazane
kod.R
dane.csv

Dodatkowo wskazane jest dodanie wartości numerycznych przed nazwą pliku, jeżeli pliki mają jakąś kolejność.

# Zalecane
01_przygotowanie-danych.R
02_obliczanie-sredniej.R

# Niewskazane
przygotowanie-danych.R
obliczanie-sredniej.R
Kodowanie znaków (ang. character encodings) jest to sposób prezentacji znaków. Istnieje szereg różnych standardów kodowania znaków. Standard ASCII przyporządkowuje liczbom z zakresu 0-127 litery alfabetu angielskiego, cyfry, znaki przestankowe i inne symbole oraz polecenia. Firma Microsoft stworzyła dodatkowo cały szereg standardów dla różnych języków. Przykładowo do obsługi języków środkowoeuropejskich istnieje wersja oznaczona jako Windows-1250 (lub CP1250). Alternatywnie do systemu Microsoftu powstał też zbiór standardów ISO, przykładowo ISO-8859-2 dla języków środkowoeuropejskich. W efekcie oznacza to, że otworzenie tekstu z innego komputera, na komputerze z “polskim” kodowaniem znaków może spowodować pojawienie się tzw. “krzaczków”. Aby uniknąć takiej sytuacji powstał system kodowania UTF-8, który zawiera w sobie ponad milion różnych znaków. Jest on obecnie zalecanym standardem na całym świecie.

2.4.5 Daty

Istnieje wiele sposobów zapisu dat21, co może powodować różnorodne problemy przy programowaniu oraz analizie danych. Z ratunkiem w tej kwestii przychodzi norma ISO 8601, która definiuje daty kalendarzowe jako YYYY-MM-DD, czyli ROK-MIESIĄC-DZIEŃ.

# Zalecane
2019-06-02

# Niewskazane
wszelkie inne

2.5 Dodatkowe materiały

Polskie książki:

Angielskie książki:

Blogi:

Kursy:

Pisanie kodu oraz jego dokumentowanie opiera się w znacznym stopniu na wprowadzaniu znaków na klawiaturze do komputera. Warto jest więc aby robić to w sposób efektywny, czyli taki w którym używamy wszystkich palców u rąk a nasz wzrok nie jest skupiony na klawiaturze. Takie pisanie nazwa się pisaniem bezwzrokowym (ang. touch typing). Pisanie bezwzrokowe ma szereg reguł, które wymagają przestawienia się ze starych nawyków oraz pewnego treningu. Na szczęście istnieje wiele internetowych zasobów, które ułatwiają naukę takiego pisania, między innymi strona TypingClub.

Serwisy internetowe:

Meetups (spotkania początkujących i zaawansowanych użytkowników R):

2.6 Zadania

Rozwiązując poniższe zadania oraz pozostałe zadania z tej książki staraj się stosować do stylu podanego w sekcji 2.4.

  1. Przejrzyj poniższą listę poleceń. Spróbuj określić uzyskane wyniki bez wykonywania kodu w R.
x = 7
y = -2
x + 3
y - 5
x * 2
y / 4
x %% 3
x %/% 3
y ^ 2
y ^ x
  1. Jedziesz na krótkie wakacje i planujesz na nie zabrać 500 EUR. Aktualny kurs kupna EUR wynosi 4,31. Ile PLN musisz wydać? Wylicz to w R.
  2. Masz trapez o długości podstaw a = 5 i b = 6 oraz wysokości h = 3. Stwórz nowy obiekt pole_trapezu, który zawiera obliczone pole tego trapezu.
  3. Wraz z grupą znajomych planujesz zamówić pizzę z dostawą i macie na to przeznaczonych 60 PLN. Pizza o średnicy 30 cm kosztuje 28,5 PLN, a pizza o średnicy 50 cm kosztuje 60 PLN. Wylicz w R, czy bardziej opłaca się kupno dwóch małych pizz czy jednej dużej.
  4. Przejrzyj linki zawarte w tym rozdziale, w szczególności R-bloggers i R Weekly. Znajdź jeden lub dwa przykłady zastosowania R, które uważasz za ciekawe lub interesujące.

Bibliografia

Biecek, Przemyslaw. 2014. Przewodnik Po Pakiecie R. Oficyna Wydawnicza GIS.

Bryan, Jennifer, and Jim Hester. 2019. What They Forgot to Teach You About R.

Czernecki, Bartosz. 2018. Metody Przetwarzania Danych Meteorologicznych W Języku Programowania R.

Gagolewski, Marek. 2016. Programowanie W Jezyku R. Wydawnictwo Naukowe PWN.

Gillespie, Colin, and Robin Lovelace. 2016. Efficient R Programming: A Practical Guide to Smarter Programming. " O’Reilly Media, Inc.".

Grolemund, Garrett. 2014. Hands-on Programming with R: Write Your Own Functions and Simulations. " O’Reilly Media, Inc.".

Lovelace, R, J Nowosad, and J Muenchow. 2019. Geocomputation with R. Chapman and Hall/CRC Press.

Nowosad, Jakub. 2019. Geostatystyka W R. Poznan: Space A.

Peng, Roger D., Sean Kross, and Brooke Anderson. 2017. Mastering Software Development in R.

Wickham, Hadley. 2014. Advanced R. Chapman and Hall/CRC.

Wickham, Hadley, and Garrett Grolemund. 2016. R for Data Science: Import, Tidy, Transform, Visualize, and Model Data. " O’Reilly Media, Inc.".


  1. To jest tzw. tryb interaktywny. Istnieje również tryb skryptowy, o którym więcej informacji można znaleźć w kolejnym rozdziale.↩︎

  2. Jest to pewne uproszczenie - https://adv-r.hadley.nz/names-values.html#binding-basics.↩︎

  3. Więcej informacji na temat różnic w działaniu tych operatorów można znaleźć na stronie https://stackoverflow.com/questions/1741820/what-are-the-differences-between-and-in-r.↩︎

  4. https://en.wikipedia.org/wiki/Naming_convention_(programming)↩︎

  5. https://xkcd.com/1179/↩︎