Eine Variable in R anlegen
Eine Variable in R ist ein Name, der an einen Wert gebunden ist. Man erzeugt sie mit dem Zuweisungspfeil <-: Der Name steht vor dem Pfeil, der Wert dahinter.
Drei Variablen, drei verschiedene Arten von Werten, und nirgendwo Typdeklarationen - R leitet den Typ aus dem Wert selbst ab (mehr dazu bei den Datentypen). Sobald eine Variable existiert, lässt sie sich überall dort verwenden, wo man den Wert verwenden würde:
Neuzuweisung funktioniert genauso. Eine Variable wechselt bereitwillig zu einem neuen Wert - sogar zu einem neuen Typ -, sobald erneut zugewiesen wird:
R hat sich nicht beschwert, dass ein String zur Zahl wurde. Diese Flexibilität ist bequem, aber wenn sich die Bedeutung einer Variable mitten im Skript verschiebt, ist das meist das Signal, stattdessen einen neuen Namen zu wählen.
Warum R <- statt = verwendet
Hier die Frage, die alle stellen: age = 30 funktioniert doch auch - warum nutzen dann jedes R-Buch, jeder Style Guide und jedes Paket den Pfeil?
Weil = in R zwei verschiedene Dinge ist, je nachdem, wo es erscheint. Auf oberster Ebene weist es zu. Innerhalb eines Funktionsaufrufs ordnet es ein Argument über den Namen zu - und legt keine Variable an:
Wer mean(values, na.rm <- TRUE) versuchte, würde versehentlich eine globale Variable namens na.rm anlegen und TRUE positional übergeben - legal, falsch und schwer zu erkennen. Die Konvention, die das lesbar hält, ist einfach:
<-bedeutet immer Zuweisung.=bedeutet immer "dieses Argument bekommt diesen Wert" innerhalb eines Aufrufs einer Funktion.
Wer sich an diese Trennung hält, sieht bei jeder gelesenen R-Zeile auf einen Blick, ob etwas erzeugt oder übergeben wird. Es ist die universellste Stilregel der R-Welt - RStudio spendiert <- sogar einen eigenen Shortcut (Alt+-).
Die selten genutzten Verwandten: ->, = und assign()
R hat zwei weitere Zuweisungswege, die man erkennen sollte, auch wenn man sie selten schreibt.
Der umgekehrte Pfeil -> weist in die andere Richtung zu - erst der Wert, dann der Name:
Gelegentlich sieht man ihn am Ende einer langen Pipeline ("das alles berechnen, dann speichern"), aber die meisten Style Guides raten ab: Leser suchen am Zeilenanfang nach dem definierten Namen.
assign() legt eine Variable aus einem String an, der Name kann also zur Laufzeit gebaut werden:
Das sieht clever aus und ist fast immer das falsche Werkzeug - eine Menge nummerierter Variablen ist in Wirklichkeit ein Vektor oder eine Liste in Verkleidung. Zu assign() nur greifen, wenn ein Name wirklich berechnet werden muss; sein Partner get("score") liest eine Variable über den Stringnamen.
Benennungsregeln
R akzeptiert Namen, die:
- Buchstaben, Ziffern, Punkte (
.) und Unterstriche (_) enthalten. - mit einem Buchstaben beginnen oder mit einem Punkt, auf den keine Ziffer folgt.
- keine reservierten Wörter sind (
if,for,TRUE,NULL,functionund eine Handvoll mehr).
Diese sind also alle gültig:
Und diese nicht:
2nd_user- darf nicht mit einer Ziffer beginnen._temp- darf auch nicht mit einem Unterstrich beginnen (anders als Python).user-name- ein Bindestrich ist Subtraktion, kein Namenszeichen.TRUE- reserviertes Wort.
Namen unterscheiden Groß- und Kleinschreibung: total, Total und TOTAL sind drei voneinander unabhängige Variablen, und R warnt nicht, wenn man eine per Tippfehler ins Leben ruft.
Auflisten und Entfernen: ls() und rm()
Jede angelegte Variable landet im Workspace (der globalen Umgebung). ls() listet, was dort liegt, und rm() entfernt Dinge:
Zwei Details lohnen sich zu wissen. Erstens: rm(list = ls()) leert den gesamten Workspace - praktisch am Anfang einer explorativen Sitzung, zerstörerisch überall sonst. Zweitens: Namen, die mit einem Punkt beginnen (wie .cache), sind für ls() unsichtbar, sofern man nicht ls(all.names = TRUE) aufruft - dieselbe Konvention wie versteckte Dateien unter Unix.
Namenskonventionen: snake_case verwenden
Jenseits der harten Regeln hat sich die moderne R-Community (und der tidyverse Style Guide) auf Konventionen geeinigt:
lower_snake_casefür Variablen und Funktionen:retry_count,fit_model.- Punkte in Namen sind legal, aber veraltet: Basis-R ist voller Namen aus der
data.frame-Ära wiemy.data, doch Punkte tragen in Rs S3-Methodensystem ebenfalls Bedeutung (print.data.frameist "die print-Methode für Data Frames"), weshalb neuer Code sie meidet. - Keine ungarischen Präfixe, kein camelCase - in älteren Paketen begegnet einem
camelCase, aber snake_case ist der Punkt, an dem das Ökosystem gelandet ist. - R hat keine echten Konstanten; die Konvention ist, Möchtegern-Konstanten in Großbuchstaben zu benennen (
MAX_RETRIES <- 5) und ihnen schlicht nichts Neues zuzuweisen.
Beschreibende Namen wählen und konsequent bleiben. avg_score kostet vier Tastenanschläge mehr als as und erspart jedem künftigen Leser den Weg zurück nach oben im Skript.
Was bleibt hängen
name <- wertlegt eine Variable an; die Community reserviert=für Funktionsargumente.->undassign()existieren; man liest sie öfter, als man sie schreiben sollte.- Namen nutzen Buchstaben, Ziffern, Punkte und Unterstriche; sie dürfen nicht mit Ziffer oder Unterstrich beginnen und unterscheiden Groß-/Kleinschreibung.
ls()zeigt den Workspace,rm()räumt ihn auf.- Wer
snake_caseschreibt, dessen Code sieht aus wie das R, das heute alle anderen schreiben.
Als Nächstes: welche Arten von Werten diese Variablen tatsächlich enthalten - numeric, integer, character und logical.
Häufig gestellte Fragen
Wie legt man eine Variable in R an?
Den Namen schreiben, den Zuweisungspfeil <- und den Wert: age <- 30. R leitet den Typ aus dem Wert ab - es gibt keinen Deklarationsschritt. age = 30 funktioniert auf oberster Ebene ebenfalls, aber die Community-Konvention ist <-.
Was ist der Unterschied zwischen <- und = in R?
Auf oberster Ebene eines Skripts tun sie dasselbe. Innerhalb eines Funktionsaufrufs nicht: mean(x, na.rm = TRUE) nutzt =, um ein Argument über den Namen zuzuordnen, nicht um eine Variable anzulegen. Weil = je nach Kontext beide Rollen spielt, reservieren R-Style-Guides <- für Zuweisungen und = für Argumente.
Wie löscht man eine Variable in R?
rm(x) entfernt die Variable x aus dem Workspace. rm(list = ls()) entfernt alles - nützlich für einen sauberen Neustart, gefährlich mitten in einer Analyse. ls() listet, was aktuell existiert.
Dürfen R-Variablennamen Punkte enthalten?
Ja - my.data ist ein völlig legaler Name, und älterer R-Code nutzt überall Punkte. Moderner Stil bevorzugt Unterstriche (my_data), weil Punkte in Rs S3-Methodensystem ebenfalls eine Bedeutung haben, was gepunktete Namen mehrdeutig lesbar macht.