Programmieren mit R

The R Project for Statistical Computing – meist kurz "R" genannt – nimmt nicht nur einzelne Befehle über die Konsole entgegen. Aus Funktionen, Objekten und Datenstrukturen entstehen Schritt für Schritt umfangreiche Programmierprojekte.

In Pocket speichern vorlesen Druckansicht 1 Kommentar lesen
Lesezeit: 4 Min.
Von
  • Peter König
  • Dr. Andreas Krause
Inhaltsverzeichnis

Der erste Teil unserer kleinen Einführung in den Umgang mit R hat gezeigt, wie Sie Daten in die freie Programmierumgebung einlesen, sie grafisch darstellen und statistisch modellieren können (c't 3/14, S. 182). Unsere Anleitung ging dabei Schritt für Schritt vor, oder besser: Zeile für Zeile, die Sie in die R-eigene Konsole eintippen. R lässt sich aber nicht nur interaktiv als Interpreter für einzeln abgesetzte Befehle benutzen. The R Project for Statistical Computing (so der volle Name) arbeitet intern objektorientiert und enthält eine komplette Programmiersprache, in der sich auch größere Projekte strukturiert umsetzen lassen. Wie Sie das mit selbst geschriebenen Funktionen, komplexen Datentypen, eingebundenen Bibliotheken und einer durchdachten Code-Struktur erreichen, zeigt der zweite Teil im aktuellen Heft (c't 6/14, S. 180).

Die folgende Anleitung setzt die Kenntnis der beiden Heft-Artikel voraus. Sie zeigt, wie Sie den Zustand Ihres R-Workspace auf den Stand zu Ende des ersten Artikels bringen und enthält Links zu allen Code-Beispielen aus dem Artikel. Am Ende des Textes wird außerdem Mathematik noch dekorativ – wir zeigen Ihnen, wie Sie mit wenigen Zeilen R-Code die bekannten Lissajous-Figuren erzeugen.

Die Analyse von Wetterdaten dient als roter Faden und durchgehendes Beispiel in beiden Artikeln der R-Einführung. Wir benutzen dazu einen Datensatz von MeteoSchweiz aus dem Internet, der die monatlichen Niederschläge und Durchschnittstemperaturen für Basel von 1864 bis heute enthält. Sie finden die Daten auf der Homepage www.meteoschweiz.ch unter "Klima/Klima heute/Homogene Monatsdaten", wo Sie in der Liste unter der Karte die Datei homog_mo_BAS.txt als ersten Eintrag finden. Laden Sie sich die Datei herunter, legen Sie sie in Ihr Arbeitsverzeichnis und benennen Sie sie in basel.txt um, sonst funktionieren die folgenden Beispiele nicht.

Dann laden Sie sich das Listing 01_Basel.R herunter und speichern es im selben Arbeitsverzeichnis. Sie laden den Code über die Eingabe:

> source("01_Basel.R")

Die allgemeine Version der Durchschnittsfunktion aus dem Artikel finden Sie im Listing 02_Var.avg.R , laden Sie den Code auf die oben gezeigte Weise hinzu. Ebenso können Sie sich durch den Import des Codes aus den Dateien 03_temp.means.R , 04_temp.means.df.R und 05_x.decade.df.R viel Tipparbeit sparen.

Das komplette Basel-Beispiel haben wir nochmals in einem Zip-Archiv zusammengefasst. Die einzelnen Dateien folgen dem Muster, das Seite 185 in c't 6/14 zeigt. Packen Sie das Archiv in ein frisches Arbeitsverzeichnis aus und legen Sie wiederum die Datei basel.txt hinzu. Die Datei 000-batch.R aus dem Archiv schreibt den Ablauf der Analyse des kompletten Basel-Beispiels fest. Konfigurationen, Deklaration von Funktionen und auch Routinen fürs Zeichnen der Grafiken sind in weitere Dateien ausgelagert, die die Hauptdatei nachlädt. Durch diese Hierarchie müssen Sie nur noch die Hauptdatei laden und ausführen:

> source("000-batch.R")

Diesen Aufruf setzen Sie entweder in der Konsole des R-GUI oder auf der Kommandozeile des Rechners ab. Dabei können Sie die Konsolenausgabe auf Wunsch in ein Logfile umleiten:

R CMD BATCH 000-batch.R logfile.txt

Bei den bekannten Lissajous-Figuren zeigt sich die Mathematik von ihrer dekorativen Seite. Die Figuren entstehen, wenn sin(a*w) und sin(b*w) auf zwei senkrecht zueinander stehende Achsen gezeichnet wird – oder in R ausgedrückt:

> lissajous <- function(a=3, b=8)
{
  w <- seq(0, 2*pi, length=1000)
  library(lattice)
  gr <- xyplot(sin(a*w)~sin(b*w), 
    type="l", main=paste(
      "Lissajous mit a =", a, "und b =", b)
    )
  return(gr)
}

Je nach Parameterkombination unterscheiden sich Lissajous-Figuren stark voneinander.

Aufrufe mit unterschiedlichen Werten für a und b erzeugen zum Teil sehr unterschiedliche Figuren, die vom Verhältnis zwischen den beiden Parametern abhängig sind -- probieren Sie es selbst aus!

Den vollständigen Artikel finden Sie in der c't-Ausgabe 6/14, S. 180. (pek)