Menu

Zmienne i przypisanie w R: <-, = i assign()

Jak tworzyć zmienne w R strzałką <-, kiedy zamiast niej wymagane jest =, jakie są zasady nazewnictwa i jak wypisywać oraz usuwać zmienne przez ls() i rm().

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

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, function i 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_case dla 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 jak my.data, ale kropki mają też znaczenie w systemie metod S3 (print.data.frame to „metoda print dla ramek danych”), więc nowy kod ich unika.
  • Bez przedrostków węgierskich, bez camelCase: camelCase zobaczysz 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 <- value tworzy zmienną; społeczność zostawia = dla argumentów funkcji.
  • -> i assign() 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.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ