Pierwszy skrypt

W poprzednim rozdziale wydawaliśmy R-owi polecenia bezpośrednio. Dopóki nie wymagamy od R-a niczego bardziej wyrafinowanego niż przywitanie się ze światem jest to całkiem w porządku; właściwie przez cały ten tutorial nie będziemy wymagać wielu wyrafinowanych rzeczy i wszystkie przykłady poleceń będą zademonstrowane tak, jak byśmy wydawali je R-owi bezpośrednio. Można sobie jednak wyobrazić, że napiszemy kiedyś coś dłuższego i bardziej wartościowego; coś, do czego może będziemy chcieli wrócić, uruchomić jeszcze wielokrotnie, poczytać wieczorem do poduszki, wysłać znajomym etc. Albo po prostu coś na tyle skomplikowanego, że w pewnym momencie zauważymy, że chyba gdzieś wcześniej popełniliśmy błąd; można oczywiście przeglądać komendy wstecz, ale jeśli błąd popełniony 50 poleceń wstecz rzutował na wszystkie dalsze polecenia, poprawienie go będzie oznaczało nie tylko uruchomienie jeszcze raz owej poprawionej już linijki, ale i 49 następujących po niej. Żmudne. Warto wiedzieć więc, jak napisać program w R-ze i jak go potem uruchomić.

Nasz pierwszy program będzie - nie zgadniecie - drukował "Hello world". Napisanie go jest proste - najpierw uruchamiamy dowolny edytor tekstowy. Jak na początek może to być zwykły notatnik, ale nie polecam pisania programów w notatniku - lepsze są programy specjalnie pisane z myślą o programowaniu; te bardziej wyrafinowane będą umiały nam podpowiadać funkcje, które prawdopodobnie chcemy użyć, pilnować zamykania nawiasów czy wpisywania poprawnych poleceń, te mniej wyrafinowane - chociaż ładnie pokolorują nam składnię, zaznaczając innym kolorem napisy, innym polecenia, innym komentarze etc., pozwalając na pierwszy rzut oka wygodniej zinterpretować, co napisaliśmy. Jak widać, w przykładach w tym tutorialu składnia jest kolorowana (Ponadto może zauważyłeś, że na niektóre słowa-klucze, np. nazwę funkcji print można kliknąć i przejść na stronę z dokładnym opisem danej funkcji czy obiektu). Przykładowe edytory, które bym poleciła, to gedit i geany. Warto też rozważyć zainstalowanie RStudio - jeśli już to zrobiłeś/aś, być może zauważyłeś/aś już że w prawym górnym oknie jest miejsce do wpisywania skryptów, które możemy następnie zapisać sobie na dysku i/lub bezpośrednio uruchomić w R-ze. Jeśli zdecydowałeś się już na jakiś edytor tekstu, otwórz go i napisz w nim znane już Ci polecenie "print("Hello world")". (Bez cudzysłowów dookoła polecenia, naturalnie.) Zapisz program, na przykład pod nazwą moj_pierwszy_skrypt.R; programy pisane w R-ze powinny mieć rozszerzenie .R. Następnie uruchom R-a i wpisz:

> source("sciezka_do_twojego_skryptu/moj_pierwszy_skrypt.R")

wpisując ścieżkę do Twojego skryptu zamiast frazy sciezka_do_twojego_skryptu. Może to być ścieżka bezwzględna, np. "C:/Dokumenty/skrypty/moj_pierwszy_skrypt.R", albo względna, tj. względem katalogu, w którym uruchomiłeś/aś R-a; jeśli nie jesteś pewien/pewna, co to za katalog, wpisz polecenie getwd(), czyli "get working directory", które wypisze Ci, w jakim konkretnie katalogu pracuje R. Na przykład mi napisał:

> getwd()
[1] "/home/maciosz/vinci/r-tutorial"

Ponieważ mój skrypt drukujący "Hello world" zapisałam dokładnie w tym katalogu, nie muszę podawać całej ścieżki, wystarczy, że podam nazwę skryptu:

 

> source("moj_pierwszy_skrypt.R")
[1] "Hello world"

Udało się! Mój pierwszy skrypt zadziałał i przywitał się ze światem.

Jeżeli zdecydowałeś się na używanie RStudio, swój skrypt piszesz w prawym górnym rogu, zapisujesz go poleceniem "save", a uruchamiasz jednym z poleceń z prawej strony paska: możesz np. zaznaczyć tylko te linijki skryptu, które Cię interesują, i kliknąć "Run": będzie to jednoznaczne z wpisywaniem linijka po linijce tego, co zaznaczyłeś (jest to wygodne kiedy chcesz przetestować tylko fragment skryptu); albo możesz uruchomić cały skrypt naraz za pomocą polecenia source.

Ważna uwaga. Jeżeli bezpośrednio w interpreterze R-a wpiszemy

> "Hello world"

R wydrukuje nam poniżej ten napis:

> "Hello world"
[1] "Hello world"

To dlatego, że interpreter wykonuje polecenia, które mu wpisaliśmy, i jeśli dostanie jakiś wynik tych poleceń to go od razu nam drukuje. Polecenie "Hello world" właściwie trudno nazwać poleceniem, ale w praktyce jest nim: jest to banalne polecenie, które daje interpreterowi napis, i właściwie nie każe nic z nim zrobić. Wynikiem tego polecenia jest oczywiście tenże napis, dlatego interpreter drukuje poniżej "Hello world". Ale! Jeśli taką linijkę napiszemy w skrypcie, nic się nie stanie. (Polecam wypróbowanie.) To dlatego, że kiedy już uruchamiamy skrypt, R robi tylko i wyłącznie te rzeczy, o których zrobienie wprost go poprosimy. Kazaliśmy mu wydrukować? Nie, no to nie wydrukuje. Bezpośrednio w interpreterze nie będzie różnicy, czy zastosujemy funkcję print, czy nie:

> "Hello world"
[1] "Hello world"
> print("Hello world")
[1] "Hello world"

I to tyle jeśli chodzi o pisanie skryptów i uruchamianie ich. Jeżeli będziesz rozwiązywał co bardziej skomplikowane zadania z naszego serwisu, prawdopodobnie napisanie rozwiązania w skrypcie będzie praktyczniejsze niż wpisywanie wszystkiego bezpośrednio do R-a.