2 – Die R-Umgebung

Statistische Datenanalyse mit R

Autor

Clemens Brunner

Veröffentlicht

13. Oktober 2022

RStudio

Bereits in der vorigen Einheit haben wir die grafische Benutzeroberfläche RStudio installiert und verwendet. RStudio setzt eine funktionierende Installation von R voraus. Das Programmfenster von RStudio ist in der Standardeinstellung in vier Bereiche unterteilt (wobei oft nur drei Bereiche sichtbar sind):

  1. Links unten befindet sich die Console (die anderen Tabs sind für uns nicht relevant). In der Console wartet R auf unsere Eingaben.
  2. Links oben befindet sich der Editor falls zumindest eine Datei geöffnet ist. Ansonsten nimmt die Console diesen Platz ein.
  3. Rechts oben gibt es eine Übersicht aller geladenen Objekte (Environment) und eine Liste aller jemals eingegebenen Befehle (History) (die anderen Tabs sind für uns hier nicht von Bedeutung). Auf die History kann man übrigens auch in der Console mit den Tasten bzw. zugreifen und vor der erneuten Bestätigung mit der Eingabetaste auch editieren.
  4. Rechts unten werden wahlweise der Inhalt des aktuellen Verzeichnisses (Files), grafische Ausgaben (Plots), eine Paketverwaltung (Packages) oder ein Hilfefenster (Help) angezeigt (die anderen Tabs sind für uns nicht relevant).

Tipp

Die Aufteilung der Bereiche kann in den Einstellungen umfangreich angepasst werden. Wenn Sie z.B. die Console gerne rechts unten haben möchten, können Sie das dort festlegen.

Pakete

Pakete erweitern den Funktionsumfang von R. Werksmäßig wird R nur mit einer Handvoll an Paketen ausgeliefert – sobald man damit nicht mehr auskommt, kann man sehr einfach zusätzliche Pakete hinzufügen. Die meisten Zusatzpakete sind im Comprehensive R Archive Network (CRAN) verfügbar. Wenn ein Paket einmal installiert ist, kann es danach jederzeit aktiviert und verwendet werden. Das bedeutet also, dass folgende zwei voneinander abhängige Schritte auszuführen sind:

  1. Installieren eines neuen Pakets (nur ein Mal)
  2. Aktivieren eines installierten Pakets (vor jeder Verwendung, d.h. ein Mal pro R-Sitzung)

Im CRAN gibt es tausende Pakete, und deswegen kann es mitunter schwierig sein, ein passendes bzw. das gesuchte Paket zu finden. Eine sehr praktische Übersicht gibt es auf CRAN Task Views. Hier werden Pakete nach Anwendungsgebieten thematisch gruppiert dargestellt. Alternativ ist eine Google-Suche nach dem gewünschten Thema in Verbindung mit R sehr häufig zielführend.

Zur Paketverwaltung gibt es zwei Möglichkeiten: entweder man verwendet den Bereich Packages in RStudio, oder man benutzt R-Befehle dafür.

Paketverwaltung in RStudio

RStudio bietet im Bereich Packages (im Panel rechts unten) eine Liste aller installierten Pakete. Hier ist auch ersichtlich, welche Pakete gerade aktiviert sind (durch Setzen/Entfernen des Häkchens vor einem Paket kann dieses aktiviert/deaktiviert werden).

In dieser Ansicht kann man durch Klicken auf Update installierte Pakete aktualisieren. Dies sollte man von Zeit zu Zeit auch tun, und zwar unabhängig von eventuellen Updates der verwendeten R-Version.

Neue Pakete installiert man durch Klicken auf Install. Wenn man in das Feld Packages die Anfangsbuchstaben des gesuchten Pakets eingibt, wird automatisch eine Liste aller passenden Pakete vorgeschlagen. Ein bereits installiertes Paket kann man durch Klicken auf das hellgraue X in der rechten Spalte der Paketliste wieder deinstallieren.

Paketverwaltung mit R-Befehlen

Prinzipiell interagiert man mit R über Textbefehle in der Console. Daher ist es nicht überraschend, dass auch die Paketverwaltung mit speziellen R-Befehlen funktioniert.

Eine Liste aller installierten Pakete bekommt man mit:

library()

Diese Liste entspricht der Darstellung im Bereich Packages in RStudio. Eine Liste aller aktivierten (geladenen) Pakete erhält man mit:

search()
 [1] ".GlobalEnv"        "tools:quarto"      "package:stats"    
 [4] "package:graphics"  "package:grDevices" "package:utils"    
 [7] "package:datasets"  "package:methods"   "Autoloads"        
[10] "package:base"     

Ein neues Paket aus dem CRAN (z.B. psych) installiert man mit:

install.packages("psych")

Zu beachten ist, dass man hier den Namen des zu installierenden Paketes in Anführungszeichen angeben muss. Ein bereits installiertes Paket aktiviert man mit:

library(psych)

Hier kann man die Anführungszeichen um den Paketnamen weglassen.

Die Programmiersprache R

Scripts

Befehle in der R-Console einzugeben ist praktisch, wenn man neue Dinge interaktiv ausprobieren möchte bzw. nur schnell Kleinigkeiten berechnen will. Möchte man eine aufwändigere Datenanalyse durchführen, dann sollte man die dafür notwendigen Befehle in einem sogenannten R-Script abspeichern. Damit kann man die Analyse später jederzeit reproduzieren. Ein R-Script ist übrigens eine einfache Textdatei mit der Endung .R.

In jeder Zeile eines R-Scripts befindet sich (meist) genau ein R-Befehl. Wenn man das Script ausführt, werden alle Zeilen vom Anfang bis zum Ende der Reihe nach ausgeführt. In RStudio kann man ein gesamtes Script durch Klicken auf die Schaltfläche “Source” (bzw. “Source with Echo”) ausführen. Möchte man nur die aktuelle Zeile bzw. die markierten Zeilen ausführen, kann man dies durch Klicken auf die Schaltfläche “Run” tun (dafür gibt es auch das Tastenkürzel StrgEnter unter Windows bzw. Enter unter macOS).

Die folgende Abbildung zeigt ein kurzes R-Script, welches im Editor-Bereich von RStudio geöffnet ist:

Wenn man in einem Script Befehle aus zusätzlichen Paketen benötigt, muss man diese Pakete im Script auch mittels library(package) aktivieren. Am besten geschieht dies ganz am Anfang des Scripts.

Wichtig

Installieren Sie Pakete niemals in einem Script mittels install.packages("package")! Das Paket würde bei jedem Ausführen des Scripts neu installiert werden (inklusive Download aus dem Internet), was definitiv vermieden werden sollte. Die Installation von Paketen wird also immer wie oben beschrieben manuell mit RStudio oder in der Console durchgeführt.

Unter Windows sollte man in RStudio außerdem einstellen, dass Scripts als UTF-8 geladen bzw. gespeichert werden sollen (unter macOS bzw. Linux ist das bereits standardmäßig der Fall). Dies kann man in den Optionen (erreichbar über ToolsGlobal Options) unter CodeSavingDefault text encoding durchführen:

Arbeitsverzeichnis

Das Arbeitsverzeichnis, also jenes Verzeichnis in dem die aktuelle R-Sitzung ausgeführt wird, erhält man mit dem Funktionsaufruf:

getwd()

Dieses Arbeitsverzeichnis (Working Directory) ist wichtig, da R diverse Dateien (wie z.B. Scripts oder Daten) immer in diesem Verzeichnis erwartet. Alle Dateien im aktuellen Arbeitsverzeichnis kann man mit dir() ausgeben lassen (RStudio zeigt diese rechts unten im Bereich Files an).

Tipp

Der Titel der R-Console in RStudio zeigt ebenfalls das aktuelle Arbeitsverzeichnis an.

Der Befehl setwd("/path/to/working/directory") setzt das aktuelle Arbeitsverzeichnis auf den angegebenen Wert (im Beispiel das fiktive Verzeichnis /path/to/working/directory). Hierbei ist zu beachten, dass Verzeichnisse auch in Windows durch einen normalen Schrägstrich / und nicht durch einen umgekehrten Schrägstrich (Backslash) \ voneinander zu trennen sind.

In RStudio hat man aber mindestens drei Alternativen, das Arbeitsverzeichnis auch mit der grafischen Oberfläche zu setzen:

  • Menü SessionSet Working DirectoryChoose Directory…
  • Navigieren zum gewünschten Verzeichnis im Bereich Files (Bereich rechts unten) und dann Klick auf MoreSet As Working Directory
  • Falls eine Script-Datei im Editorbereich geöffnet ist, kann man auf den Dateinamen im Tab rechtsklicken und Set Working Directory auswählen (dies setzt das Arbeitsverzeichnis auf jenes Verzeichnis, in dem das Script abgespeichert ist)

Bevor Sie ein Script ausführen, sollten Sie das Arbeitsverzeichnis korrekt setzen (üblicherweise auf das Verzeichnis, in dem das Script abgespeichert ist). Führen Sie dies allerdings nicht automatisiert im Script selbst durch, denn das Script soll auch auf anderen Umgebungen laufen, wo es Ihr spezifisches Verzeichnis vielleicht nicht gibt.

Tipp

Wenn Sie ein R-Script per Doppelklick (im Windows Explorer oder macOS Finder) öffnen, wird RStudio geöffnet und das Arbeitsverzeichnis automatisch auf das Verzeichnis gesetzt, in dem sich das Script befindet.

Workspace

Alle selbst erstellten bzw. geladenen Objekte (Variablen und Daten) fasst man unter dem Begriff Workspace zusammen. Man kann ihn mit folgendem Befehl anzeigen:

ls()

In einer frisch gestarteten R-Sitzung ist der Workspace leer. In RStudio wird der Workspace auch im Bereich Environment angezeigt (standardmäßig rechts oben).

Syntax

Um die Syntax von R zu beschreiben betrachten wir das folgende kurze Beispiel-Script:

# compute sum of integers from 1 to 100
n = 100
x = 1:n
sum(x)
n * (n + 1) / 2  # closed-form solution

Man erkennt bereits in diesen wenigen Zeilen die grundlegenden Regeln. Prinzipiell wird jeder Befehl in eine eigene Zeile geschrieben.

Kommentare

Kommentare, d.h. alle Zeichen ab # bis zum Zeilenende, werden von R nicht ausgeführt. Dennoch sind Kommentare extrem wichtig, da Sie zum Verstehen des Codes beitragen können – fügen Sie daher bei komplizierteren Berechnungen immer erklärende Kommentare hinzu!

Variablen und Objekte

Der Zuweisungsoperator in R ist = oder <-. Damit kann man Werte (oft auch als Objekte bezeichnet) Variablen zuweisen. Im Beispiel wird also mit n = 100 der Wert 100 der Variablen n zugewiesen. Im gesamten Beispiel-Script werden daher zwei Variablen namens n und x erstellt.

Hinweis

Es ist egal, ob man = oder <- für Zuweisungen verwendet. Man sollte aber konsistent sein und immer nur einen der beiden Zuweisungsoperatoren verwenden. In diesen Unterlagen wird = benutzt, weil man weniger tippen muss und die meisten anderen Programmiersprachen ebenfalls = verwenden.

R unterscheidet streng zwischen Groß- und Kleinschreibung, d.h. die Variable N ist nicht gleich der Variablen n. Neben Buchstaben können auch Ziffern, Unterstriche und sogar Punkte (nicht empfohlen) für Variablennamen verwendet werden.

Funktionen

Eine Funktion ist ein Mini-Script, welches man durch Aufrufen ausführen kann. Im obigen Beispiel ist sum eine Funktion. Zum Aufrufen einer Funktion ist ein Klammernpaar () nach dem Funktionsnamen notwendig. Eventuelle Argumente (die man benötigt, wenn die Funktion zusätzliche Informationen braucht) werden innerhalb dieser Klammern angegeben. Mehrere Argumente werden mit einem , getrennt.

Mit dem Befehl sum(x) wird also die Funktion sum mit dem Argument x aufgerufen. Es gibt auch Funktionen, die keine Argumente benötigen – das runde Klammernpaar ist aber trotzdem notwendig (z.B. library() ruft die Funktion library ohne Argumente auf). Weitere Beispiele für Funktionsaufrufe ohne Argumente, die wir bereits kennengelernt haben, sind search(), getwd(), dir() und ls().

Hinweis

In diesen Unterlagen werden Funktionsnamen mit nachfolgenden Klammern () geschrieben, um deutlich zu machen, dass es sich dabei um eine Funktion handelt.

Mit Objekten und Funktionen hätten wir bereits die wichtigsten beiden Konzepte in R besprochen. Zusammenfassend kann man also sagen (aus John M. Chambers, Extending R, Chapman & Hall/CRC, 2016):

  • Alles was in R existiert ist ein Objekt.
  • Alles was in R passiert, geschieht durch Aufrufen einer Funktion.

Hilfe

R beinhaltet eine sehr gute integrierte Hilfe zu allen möglichen Themen und Befehlen. In RStudio sind im Bereich Help alle Hilfethemen gruppiert – es bietet sich an, einmal in diesem Hilfefenster zu stöbern.

Am häufigsten benötigt man aber Hilfe zu einem konkreten Befehl. Wenn man z.B. Informationen zur Funktion mean() braucht, gibt man in der Console folgendes ein:

help(mean)

Alternativ und kürzer geht das mit:

?mean

Der Hilfetext für eine Funktion enthält alle notwendigen Informationen – wenn Sie eine neue Funktion erstmalig verwenden möchten, ist ein Blick in die Hilfe sehr zu empfehlen.

Die Hilfetexte sind alle sehr ähnlich aufgebaut. Nach einer kurzen Beschreibung (Description) sieht man unter Usage wie man die Funktion verwendet (aufruft). Hier ist in unserem Beispiel zu lesen:

mean(x, ...)

Gleich danach folgen diese beiden Zeilen mit mehr Details:

## Default S3 method:
mean(x, trim = 0, na.rm = FALSE, ...)

Hier erkennt man, dass die Funktion ein Argument x erwartet. Dieses Argument ist verpflichtend, d.h. wenn man es nicht angibt bekommt man eine Fehlermeldung (probieren Sie es in der Console aus, indem Sie mean() eintippen). Dies sieht man am Hilfetext, weil kein Standardwert für x ersichtlich ist. Im Gegensatz dazu sind die nächsten beiden Argumente trim und na.rm optional, d.h. man muss sie nicht angeben, denn in diesem Fall werden deren Standardwerte verwendet (trim hat den Wert 0 und na.rm hat den Wert FALSE falls nicht anders angegeben).

Die Bedeutung der Argumente wird im Abschnitt Arguments genau beschrieben. Der Wert, der von der Funktion berechnet und zurückgegeben wird, wird im Abschnitt Value beschrieben. Danach folgen Literaturhinweise, verwandte Funktionen und schließlich Beispiele. Diese Beispiele kann man auch kopieren und in der Console auführen.

Möglichkeiten zum Aufrufen einer Funktion

Nachdem wir nun Funktionen sowie die integrierte Hilfe besprochen haben, sehen wir uns abschließend noch an, mit welchen unterschiedlichen Varianten wir eine Funktion aufrufen können.

Einer Funktion kann man Argumente auf zwei verschiedene Arten übergeben:

  1. Man übergibt nur die Werte in der richtigen Reihenfolge (wie von der Funktion laut Hilfe erwartet), z.B. mean(1).
  2. Man verwendet die Namen der Argumente gemeinsam mit deren Werten, z.B. mean(x=1).

Sehen wir uns einige Beispiele für korrekte Aufrufe der Funktion mean() an. Vorausgesetzt ist hier, dass es eine Variable x gibt, von deren Werten wir den Mittelwert berechnen möchten (eine detaillierte Erklärung zur Funktion c() folgt in der nächsten Einheit).

Wir erstellen also zunächst die Variable (das Objekt) x:

x = c(-14, 2, 3, 4, 5, 6, 7, 28, 99)

Jetzt sehen wir uns an, mit welchen unterschiedlichen Varianten wir die Funktion mean() aufrufen können (die Kommentare zu den Aufrufen geben jeweils die Werte aller Argumente an, auch und vor allem wenn diese nicht explizit übergeben wurden und dadurch den Standardwerten entsprechen):

mean(x)  # x=x, trim=0, na.rm=FALSE
[1] 15.55556
mean(x, 0.1)  # x=x, trim=0.1, na.rm=FALSE
[1] 15.55556
mean(x, 0.2, TRUE)  # x=x, trim=0.2, na.rm=TRUE
[1] 7.857143
mean(x, na.rm=TRUE)  # x=x, trim=0, na.rm=TRUE
[1] 15.55556
mean(x, trim=0.2, na.rm=TRUE)  # x=x, trim=0.2, na.rm=TRUE
[1] 7.857143
mean(x=x, na.rm=TRUE, trim=0.3)  # x=x, trim=0.3, na.rm=TRUE
[1] 5
mean(x, 0.2, na.rm=TRUE)  # x=x, trim=0.2, na.rm=TRUE
[1] 7.857143

Anzumerken ist hier, dass der tatsächlich übergebene Wert nicht denselben Namen wie das Argument haben muss. Im obigen Beispiel ist dies zufälligerweise der Fall (sowohl der Funktionsparameter als auch der übergebene Wert heißen x), aber das ist nicht erforderlich. Im Grunde sind nur die übergebenen Werte relevant, ob diese Werte einen Namen haben oder nicht spielt keine Rolle. D.h. man könnte mean() auch wie folgt aufrufen:

mean(c(-14, 2, 3, 4, 5, 6, 7, 28, 99))
[1] 15.55556
mean(x=c(-14, 2, 3, 4, 5, 6, 7, 28, 99))
[1] 15.55556
y = c(-14, 2, 3, 4, 5, 6, 7, 28, 99)
mean(y)
[1] 15.55556
mean(x=y)
[1] 15.55556

Literatur

Bücher

Tutorials und Dokumentation

Online-Kurse

Artikel

Falls Sie sich für die historische Entwicklung von R interessieren, finden Sie hier einen spannenden Überblick von John M. Chambers, einem der Mitentwickler von R.

Übungen

Übung 1

Installieren Sie die Pakete tidyverse, Hmisc und psych – welche R-Befehle verwenden Sie dafür? Nennen Sie die Versionsnummern dieser Pakete. Mit welchen Befehlen können Sie die installierten Pakete anschließend aktivieren?

Übung 2

Zeigen Sie die Hilfe zur Funktion help() an. Welche zwei Möglichkeiten haben Sie dafür?

Übung 3

Wie sieht ein Funktionsaufruf in R aus?

Übung 4

Erstellen Sie in RStudio ein einfaches Script mit dem Namen my_first_script.R. Fügen Sie folgende Elemente in dieses Script ein:

  • Eine Kommentarzeile mit dem Inhalt “Übung 4”
  • Aktivieren des Pakets Hmisc
  • Berechnung des Mittelwerts der Zahlen 45, 66, 37, 54, 7 und 22 (nur mit Grundrechenarten)

Das fertige Script sollte also aus drei Zeilen bestehen (Sie könnten zur Erhöhung der Übersichtlichkeit aber zusätzliche leere Zeilen einfügen).

Übung 5

Lesen Sie die Hilfe zur Funktion sum() und beantworten Sie dann folgende Fragen:

  • Wie viele verpflichtende Argumente benötigt diese Funktion?
  • Wie viele optionale Argumente hat diese Funktion?
  • Was ergibt der Aufruf sum() und warum (beachten Sie dazu auch das Ergebnis von mean())?