Jak utworzyć zmienną w R
Zmienna w R to nazwa przypisana do wartości. Tworzysz ją strzałką przypisania <-: nazwa stoi przed strzałką, a wartość za nią.
Trzy zmienne, trzy różne rodzaje wartości i nigdzie żadnej deklaracji typu: R wnioskuje typ z samej wartości (więcej o tym w artykule o typach danych). Gdy zmienna już istnieje, używasz jej wszędzie tam, gdzie można użyć samej wartości:
Ponowne przypisanie działa tak samo. Zmienna bez oporu przechodzi na nową wartość, nawet nowego typu, w chwili ponownego przypisania:
R nie narzekał, że napis zamienił się w liczbę. Ta elastyczność jest wygodna, ale jeśli znaczenie zmiennej zmienia się w połowie skryptu, to zwykle sygnał, żeby wybrać nową nazwę.
Dlaczego R używa <- zamiast =
Oto pytanie, które zadaje każdy: age = 30 też działa, więc dlaczego każda książka o R, każdy przewodnik stylu i każdy pakiet używa strzałki?
Bo = w R to dwie różne rzeczy, zależnie od miejsca, w którym się pojawia. Na najwyższym poziomie przypisuje. W wywołaniu funkcji dopasowuje argument po nazwie i nie tworzy zmiennej:
Wywołanie mean(values, na.rm <- TRUE) przypadkiem utworzyłoby globalną zmienną o nazwie na.rm i przekazało TRUE według pozycji: poprawne składniowo, błędne i trudne do zauważenia. Konwencja, dzięki której kod pozostaje czytelny, jest prosta:
<-zawsze oznacza przypisanie.=zawsze oznacza „ten argument dostaje tę wartość” w wywołaniu funkcji.
Trzymaj się tego podziału, a każda linia R, którą czytasz, od razu powie ci, czy coś jest tworzone, czy przekazywane. To najbardziej uniwersalna zasada stylu w świecie R: RStudio daje nawet <- własny skrót klawiszowy (Alt+-).
Rzadko używani kuzyni: ->, = i assign()
R ma jeszcze dwa sposoby przypisania. Warto je rozpoznawać, nawet jeśli rzadko ich używasz.
Odwrócona strzałka -> przypisuje w drugą stronę: najpierw wartość, na końcu nazwa:
Czasem zobaczysz ją na końcu długiego potoku („policz to wszystko, a potem zapisz”), ale większość przewodników stylu radzi jej unikać: czytelnicy szukają definiowanej nazwy na początku linii.
assign() tworzy zmienną na podstawie napisu, więc nazwę można zbudować w trakcie działania programu:
Wygląda to sprytnie i prawie zawsze jest złym narzędziem: zestaw ponumerowanych zmiennych to tak naprawdę przebrany wektor albo lista. Sięgaj po assign() tylko wtedy, gdy nazwa naprawdę musi zostać obliczona; jej partnerka get("score") odczytuje zmienną po nazwie podanej jako napis.
Zasady nazewnictwa
R akceptuje nazwy, które:
- Zawierają litery, cyfry, kropki (
.) i podkreślenia (_). - Zaczynają się od litery albo od kropki, po której nie stoi cyfra.
- Nie są słowami zastrzeżonymi (
if,for,TRUE,NULL,functioni kilka innych).
Wszystkie te nazwy są więc poprawne:
A te nie są:
2nd_user: nie może zaczynać się od cyfry._temp: nie może też zaczynać się od podkreślenia (inaczej niż w Pythonie).user-name: łącznik to odejmowanie, a nie znak nazwy.TRUE: słowo zastrzeżone.
Nazwy rozróżniają wielkość liter: total, Total i TOTAL to trzy niezwiązane ze sobą zmienne, a R nie ostrzeże cię, gdy przez literówkę powołasz jedną z nich do życia.
Wypisywanie i usuwanie: ls() i rm()
Każda zmienna, którą tworzysz, trafia do przestrzeni roboczej (środowiska globalnego). ls() wypisuje, co w niej jest, a rm() usuwa elementy:
Dwa szczegóły warte poznania. Po pierwsze, rm(list = ls()) czyści całą przestrzeń roboczą: to wygodne na początku sesji eksploracyjnej i destrukcyjne wszędzie indziej. Po drugie, nazwy zaczynające się od kropki (jak .cache) są ukryte przed ls(), chyba że wywołasz ls(all.names = TRUE). To ta sama konwencja co ukryte pliki w systemach Unix.
Konwencje nazewnictwa: używaj snake_case
Poza twardymi zasadami nowoczesna społeczność R (i przewodnik stylu tidyverse) przyjęła konwencje:
lower_snake_casedla zmiennych i funkcji:retry_count,fit_model.- Kropki w nazwach są dozwolone, ale przestarzałe: bazowy R jest pełen nazw z epoki
data.frame, takich jakmy.data, ale kropki mają też znaczenie w systemie metod S3 (print.data.frameto „metoda print dla ramek danych”), więc nowy kod ich unika. - Bez przedrostków węgierskich, bez camelCase:
camelCasezobaczysz w starszych pakietach, ale ekosystem ustalił się na snake_case. - R nie ma prawdziwych stałych; konwencja każe nazywać przyszłe stałe wielkimi literami (
MAX_RETRIES <- 5) i po prostu nie przypisywać ich ponownie.
Wybieraj opisowe nazwy i trzymaj się ich konsekwentnie. avg_score kosztuje cztery naciśnięcia klawiszy więcej niż as, a oszczędza każdemu przyszłemu czytelnikowi powrotu na górę skryptu.
Najważniejsze informacje
name <- valuetworzy zmienną; społeczność zostawia=dla argumentów funkcji.->iassign()istnieją; częściej będziesz je czytać, niż warto je pisać.- Nazwy składają się z liter, cyfr, kropek i podkreśleń; nie mogą zaczynać się od cyfry ani podkreślenia i rozróżniają wielkość liter.
ls()pokazuje przestrzeń roboczą,rm()ją porządkuje.- Pisz w
snake_case, a twój kod będzie wyglądał jak R, który wszyscy piszą dzisiaj.
Dalej: jakie wartości te zmienne naprawdę przechowują, czyli liczby, liczby całkowite, tekst i wartości logiczne.
Najczęściej zadawane pytania
Jak utworzyć zmienną w R?
Napisz nazwę, strzałkę przypisania <- i wartość: age <- 30. R sam ustala typ na podstawie wartości, nie ma kroku deklaracji. age = 30 też działa na najwyższym poziomie, ale konwencja społeczności to <-.
Czym różni się <- od = w R?
Na najwyższym poziomie skryptu robią to samo. W wywołaniu funkcji już nie: mean(x, na.rm = TRUE) używa = do dopasowania argumentu po nazwie, a nie do utworzenia zmiennej. Ponieważ = pełni obie role zależnie od kontekstu, przewodniki stylu R zostawiają <- do przypisania, a = do argumentów.
Jak usunąć zmienną w R?
rm(x) usuwa zmienną x z przestrzeni roboczej. rm(list = ls()) usuwa wszystko: przydaje się, gdy chcesz zacząć od czystej karty, i jest niebezpieczne w środku analizy. ls() wypisuje, co obecnie istnieje.
Czy nazwy zmiennych w R mogą zawierać kropki?
Tak, my.data to całkowicie poprawna nazwa, a starszy kod R używa kropek wszędzie. Nowoczesny styl woli podkreślenia (my_data), bo kropki mają też znaczenie w systemie metod S3 w R, co sprawia, że nazwy z kropkami są niejednoznaczne przy czytaniu.