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 niemonthlyRevenueczymonthly.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 niex<-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) * 2to2 4 6, bez pętli. - Klamry wyznaczają bloki, nowe linie kończą instrukcje, a
snake_casei 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.