Menu

Składnia R: podstawy w 5 minut

Rdzeń składni R: przypisanie przez <-, wyrażenia i automatyczne wypisywanie, wywołania funkcji z nazwanymi argumentami oraz zasada, że wszystko jest wektorem.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Wyrażenia i automatyczne wypisywanie

R to język wyrażeń: prawie każda linia, którą piszesz, daje jakąś wartość. W konsoli wyrażenie wpisane samodzielnie zostaje obliczone, a jego wartość wypisana automatycznie, bez print():

Każdy wynik ma przedrostek [1]. W ten sposób R podaje pozycję pierwszej pokazanej wartości i to pierwsza wskazówka, że R myśli wektorami (więcej niżej). Automatyczne wypisywanie ma haczyk, który warto znać od pierwszego dnia: dotyczy tylko gołych wyrażeń na najwyższym poziomie. To samo wyrażenie w ciele funkcji albo w pętli for nic nie wypisze, dlatego skrypty używają jawnie cat() lub print() do wyników, które musisz zobaczyć.

Przypisanie: strzałka

Operator przypisania w R to <-, strzałka wskazująca nazwę, która dostaje wartość:

Czytaj radius <- 5 jako „radius dostaje 5”. Tak, = też działa przy przypisaniu na najwyższym poziomie, i tak, początkujący pytają, po co ktoś pisze dwa znaki zamiast jednego. Odpowiedź to konwencja, której naprawdę się przestrzega: każdy ważny przewodnik stylu, dokumentacja bazowego R i praktycznie cały kod R, jaki kiedykolwiek przeczytasz, używają <- do przypisania, a = zostawiają do jednego konkretnego zadania, czyli nazywania argumentów w wywołaniach funkcji (następna sekcja). Dzięki tej konwencji obie operacje wyglądają inaczej. W RStudio skrót Alt+- (Option+- na macOS) wpisuje strzałkę za ciebie.

Zwróć uwagę, że przypisanie nie wypisuje się automatycznie: area <- 78.5 zapisuje wartość po cichu. Dlatego fragment powyżej potrzebuje print().

Rozróżnianie wielkości liter

R ściśle rozróżnia wielkość liter, zarówno w nazwach, które tworzysz, jak i w tych, które daje język:

To dwie różne zmienne. Podobnie mean() jest funkcją, a Mean() nie istnieje. Gdy R wita cię komunikatem object 'x' not found albo could not find function, najpierw sprawdź wielkość liter. To najczęstszy błąd początkujących.

Wywołania funkcji i nazwane argumenty

Funkcje wywołuje się z nawiasami, a argumenty oddziela przecinkami. Argumenty można dopasować według pozycji, według nazwy albo mieszając oba sposoby:

Wywołanie seq() pokazuje składnię nazwanych argumentów w R i właśnie tutaj = ma swoje zadanie: wewnątrz wywołania name = value oznacza argument. Nazwane argumenty zwalniają cię z pamiętania kolejności parametrów i same dokumentują wywołanie; seq(0, 100, 25) działa identycznie, ale mniej mówi czytelnikowi. Praktyczna konwencja: pierwszy argument (zwykle dane) podawaj według pozycji, resztę nazywaj.

Pomoc do dowolnej funkcji masz na jedno polecenie: ?seq w konsoli otwiera jej dokumentację.

Wszystko jest wektorem

To idea, przez którą R wydaje się inny niż pozostałe języki: nie ma pojedynczych, gołych liczb. Nawet 5 to wektor o długości jeden, a operacje działają element po elemencie na całych wektorach:

Nigdzie nie ma pętli, a każdy element został przeliczony. W większości języków to trzy iteracje pętli for; w R to zwykła arytmetyka. Nazywa się to wektoryzacją i wpływa na wszystko: operatory porównania, funkcje tekstowe i funkcje matematyczne działają tak samo. Dlatego idiomatyczny kod R ma dużo mniej pętli, niż można się spodziewać; całą historię znajdziesz w artykule o wektorach.

Klamry i bloki

Ciała wielolinijkowe, dla if, pętli i funkcji, grupuje się w klamrach {}:

Warto zauważyć dwie rzeczy. Warunek stoi w nawiasach i jest to zwykłe if, a nie if: ani if ... then. Poza tym, inaczej niż w Pythonie, wcięcia w R nic nie znaczą: blok wyznaczają klamry, a wcięcia są dla ludzi. Pomijanie klamer w jednolinijkowcach jest dozwolone, ale to klasyczne źródło błędów przy edycji, więc po prostu zawsze ich używaj.

Białe znaki i średniki

R ignoruje dodatkowe białe znaki, a nowa linia kończy instrukcję, bez potrzeby średnika:

Podział na dwie linie działa, bo linia 3 kończy się znakiem +, więc R wie, że wyrażenie nie jest skończone. To jedyna zasada, o której trzeba pamiętać przy łamaniu długich linii: łam po operatorze albo przecinku, nigdy przed nim, bo inaczej R uzna pierwszą linię za kompletną. Średniki istnieją tylko po to, żeby wcisnąć dwie instrukcje w jedną linię (a <- 1; b <- 2): to dozwolone, odradzane i łatwe do uniknięcia.

Styl: jak pisze się kod R

Poza gramatyką R ma silne konwencje społeczności (spisane w przewodniku stylu tidyverse, którego trzyma się większość ekosystemu):

  • <- do przypisania, = tylko do argumentów w wywołaniach.
  • Nazwy w snake_case: monthly_revenue, a nie monthlyRevenue czy monthly.revenue. Kropki są dozwolone w nazwach R, ale lepiej ich unikać, bo kolidują ze schematem nazw używanym wewnętrznie przez R.
  • Spacje wokół operatorów (x <- a * 2, a nie x<-a*2) i po przecinkach.
  • Wcięcia na cztery spacje wewnątrz klamer (niektóre zespoły używają dwóch; wybierz jedno i trzymaj się tego konsekwentnie).
  • Jedna instrukcja na linię.

Interpreter niczego z tego nie wymusza. Wymusza to każdy, kto czyta twój kod. Dalszy ciąg tematu nazewnictwa znajdziesz w artykule o zmiennych.

Najważniejsze informacje

  • R oblicza wyrażenia i w konsoli automatycznie wypisuje gołe wyrażenia, ale nie wewnątrz funkcji ani pętli.
  • Przypisuj przez <- („dostaje”); = używaj tylko do nazywania argumentów w wywołaniach funkcji.
  • R w pełni rozróżnia wielkość liter: literówki w wielkości liter powodują większość wczesnych błędów „not found”.
  • Wszystko jest wektorem, a operacje działają element po elemencie: c(1, 2, 3) * 2 to 2 4 6, bez pętli.
  • Klamry wyznaczają bloki, nowe linie kończą instrukcje, a snake_case i zasady dotyczące spacji sprawiają, że twój kod czyta się tak jak kod wszystkich innych.

Dalej: komentarze, czyli jak opisywać kod R i co zrobić z brakiem komentarza blokowego w R.

Najczęściej zadawane pytania

Co oznacza <- w R?

<- to operator przypisania w R: x <- 5 zapisuje wartość 5 pod nazwą x. Czytaj go jako „dostaje”. = też przypisuje na najwyższym poziomie, ale konwencja społeczności, egzekwowana przez każdy ważny przewodnik stylu, to <- do przypisania i = wyłącznie do nazywania argumentów w wywołaniach funkcji.

Czy R rozróżnia wielkość liter?

Tak, całkowicie. total, Total i TOTAL to trzy różne nazwy, a wywołanie Mean(x) zamiast mean(x) to błąd, nie ostrzeżenie. Błąd 'could not find function' albo 'object not found' bardzo często oznacza po prostu literówkę w wielkości liter.

Czy w R potrzebuję średników?

Nie. Nowa linia kończy instrukcję. Średniki są potrzebne tylko wtedy, gdy chcesz zmieścić dwie instrukcje w jednej linii (a <- 1; b <- 2), a przewodniki stylu i tak to odradzają. Pisz jedną instrukcję na linię i zapomnij o średnikach.

Co znaczy, że R jest wektorowy?

Podstawowe operacje w R działają na całych wektorach naraz. c(1, 2, 3) * 2 daje 2 4 6: mnożenie dotyczy każdego elementu bez żadnej pętli. Większość kodu, który w innym języku byłby pętlą for, w R jest pojedynczym wyrażeniem.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ