Ausdrücke und Auto-Printing
R ist eine Ausdruckssprache: Fast jede geschriebene Zeile erzeugt einen Wert. An der Konsole wird ein allein stehender Ausdruck ausgewertet und sein Wert automatisch ausgegeben - kein print() nötig:
Jedem Ergebnis ist [1] vorangestellt - so verrät R die Position des ersten angezeigten Werts, ein erster Hinweis darauf, dass R in Vektoren denkt (mehr unten). Auto-Printing hat einen Haken, den man ab Tag eins kennen sollte: Es gilt für nackte Ausdrücke auf oberster Ebene. Derselbe Ausdruck innerhalb eines Funktionskörpers oder einer for-Schleife gibt nichts aus - weshalb Skripte für Ausgaben, die man sehen muss, explizit cat() oder print() verwenden.
Zuweisung: der Pfeil
Rs Zuweisungsoperator ist <-, ein Pfeil, der auf den Namen zeigt, der den Wert erhält:
radius <- 5 liest sich als "radius bekommt 5". Ja, = funktioniert für Zuweisungen auf oberster Ebene ebenfalls, und ja, Neulinge fragen, warum jemand zwei Zeichen statt einem tippt. Die Antwort ist eine Konvention mit Biss: Jeder große Style Guide, die Basis-R-Dokumentation und praktisch aller R-Code, den man je lesen wird, nutzen <- für Zuweisungen und reservieren = für genau eine Aufgabe - das Benennen von Argumenten in Funktionsaufrufen (nächster Abschnitt). Wer der Konvention folgt, hält die beiden Operationen visuell auseinander. In RStudio tippt Alt+- (Option+- unter macOS) den Pfeil automatisch.
Zu beachten: Eine Zuweisung löst kein Auto-Printing aus - area <- 78.5 speichert den Wert still. Deshalb braucht der Schnipsel oben das print().
Groß- und Kleinschreibung
R unterscheidet strikt zwischen Groß- und Kleinschreibung, bei selbst angelegten wie bei mitgelieferten Namen:
Zwei verschiedene Variablen. Ebenso ist mean() eine Funktion, während Mean() nicht existiert. Wenn R mit object 'x' not found oder could not find function grüßt, zuerst die Großschreibung prüfen - das ist der mit Abstand häufigste Anfängerfehler.
Funktionsaufrufe und benannte Argumente
Funktionen werden mit Klammern aufgerufen, Argumente durch Kommas getrennt. Argumente lassen sich über die Position zuordnen, über den Namen oder gemischt:
Der seq()-Aufruf zeigt Rs Syntax für benannte Argumente - und hier verdient sich = seinen Platz: Innerhalb eines Aufrufs beschriftet name = wert ein Argument. Benannte Argumente befreien vom Merken der Parameterreihenfolge und machen Aufrufe selbstdokumentierend; seq(0, 100, 25) funktioniert identisch, verrät dem Leser aber weniger. Die gängige Konvention: das erste Argument (meist die Daten) über die Position übergeben, den Rest benennen.
Hilfe zu jeder Funktion ist einen Tastendruck entfernt: ?seq an der Konsole öffnet ihre Dokumentation.
Alles ist ein Vektor
Die Idee, die R anders anfühlen lässt als andere Sprachen: Es gibt keine nackten Einzelzahlen. Selbst 5 ist ein Vektor der Länge eins, und Operationen wirken elementweise auf ganze Vektoren:
Nirgendwo eine Schleife, und doch wurde jedes Element umgerechnet. In den meisten Sprachen wären das drei Durchläufe einer for-Schleife; in R ist es Arithmetik. Das ist Vektorisierung, und sie prägt alles - Vergleichsoperatoren, String-Funktionen und Mathe-Funktionen arbeiten alle so. Deshalb hat idiomatisches R weit weniger Schleifen als erwartet; die ganze Geschichte steht bei den Vektoren.
Geschweifte Klammern und Blöcke
Mehrzeilige Rümpfe - für if, Schleifen und Funktionen - werden mit geschweiften Klammern {} gruppiert:
Zwei Dinge fallen auf. Die Bedingung steht in runden Klammern, und es heißt schlicht if, nicht if: oder if ... then. Und anders als in Python trägt Einrückung in R keine Bedeutung - die geschweiften Klammern definieren den Block, die Einrückung ist für Menschen. Geschweifte Klammern bei Einzeilern wegzulassen ist legal, aber eine klassische Quelle von Bearbeitungsfehlern; einfach immer setzen.
Leerraum und Semikolons
R ignoriert zusätzlichen Leerraum, und ein Zeilenumbruch beendet eine Anweisung - kein Semikolon nötig:
Der Umbruch über zwei Zeilen funktioniert, weil Zeile 3 mit + endet, R also weiß, dass der Ausdruck noch nicht fertig ist. Das ist die eine Regel beim Umbrechen langer Zeilen: nach einem Operator oder Komma umbrechen, nie davor, sonst behandelt R die erste Zeile als abgeschlossen. Semikolons existieren nur, um zwei Anweisungen in eine Zeile zu pressen (a <- 1; b <- 2) - legal, unerwünscht, leicht vermeidbar.
Stil: wie R-Code geschrieben wird
Jenseits der Grammatik hat R starke Community-Konventionen (festgehalten im tidyverse Style Guide, dem der Großteil des Ökosystems folgt):
<-für Zuweisungen,=nur für Argumente in Aufrufen.snake_case-Namen:monthly_revenue, nichtmonthlyRevenueodermonthly.revenue. Punkte sind in R-Namen legal, aber besser zu vermeiden - sie kollidieren mit einem Benennungsmuster, das Rs Interna verwenden.- Leerzeichen um Operatoren (
x <- a * 2, nichtx<-a*2) und nach Kommas. - Vier Leerzeichen Einrückung innerhalb geschweifter Klammern (manche Teams nutzen zwei; eines wählen, konsequent bleiben).
- Eine Anweisung pro Zeile.
Nichts davon erzwingt der Interpreter. Alles davon erzwingt, wer den Code liest. Die Namensseite dieser Geschichte geht bei den Variablen weiter.
Was bleibt hängen
- R wertet Ausdrücke aus und druckt nackte Ausdrücke an der Konsole automatisch - aber nicht innerhalb von Funktionen oder Schleifen.
- Zuweisen mit
<-("bekommt");=nur zum Benennen von Argumenten in Funktionsaufrufen. - R unterscheidet vollständig zwischen Groß- und Kleinschreibung - Tippfehler bei der Großschreibung verursachen die meisten frühen "not found"-Fehler.
- Alles ist ein Vektor, und Operationen wirken elementweise:
c(1, 2, 3) * 2ist2 4 6, ohne Schleife. - Geschweifte Klammern definieren Blöcke, Zeilenumbrüche beenden Anweisungen, und
snake_caseplus Abstandskonventionen lassen den eigenen Code wie den aller anderen lesen.
Als Nächstes: Kommentare - wie man R-Code annotiert und was man mit Rs fehlender Blockkommentar-Syntax macht.
Häufig gestellte Fragen
Was bedeutet <- in R?
<- ist Rs Zuweisungsoperator: x <- 5 speichert den Wert 5 unter dem Namen x. Zu lesen als 'bekommt'. Auch = weist auf oberster Ebene zu, aber die Community-Konvention - von jedem großen Style Guide durchgesetzt - lautet: <- für Zuweisungen und = nur zum Benennen von Argumenten in Funktionsaufrufen.
Unterscheidet R Groß- und Kleinschreibung?
Ja, vollständig. total, Total und TOTAL sind drei verschiedene Namen, und Mean(x) statt mean(x) aufzurufen ist ein Fehler, keine Warnung. Ein Fehler wie 'could not find function' oder 'object not found' ist sehr oft nur ein Tippfehler in der Großschreibung.
Braucht man in R Semikolons?
Nein. Ein Zeilenumbruch beendet eine Anweisung. Semikolons braucht man nur, um zwei Anweisungen in eine Zeile zu quetschen (a <- 1; b <- 2), wovon Style Guides ohnehin abraten. Eine Anweisung pro Zeile schreiben und Semikolons nie wieder einen Gedanken widmen.
Was bedeutet es, dass R vektorisiert ist?
Rs Grundoperationen wirken auf ganze Vektoren auf einmal. c(1, 2, 3) * 2 ergibt 2 4 6 - die Multiplikation trifft jedes Element, ganz ohne Schleife. Der meiste Code, der in einer anderen Sprache eine for-Schleife wäre, ist in R ein einziger Ausdruck.