GNU R: Programmieren mit R

Aus Wikibooks

Ein weiterer Vorteil von R besteht darin, dass man neue Funktionsweisen nach seinen Bedürfnissen programmieren kann. Im Anhang Programmierbeispiele werden die hier verwendeten Programmierbeispiele gesammelt.

Programmieren mit R[Bearbeiten]

In R ist es möglich eigene Programme zu schreiben und eigene Zusatzpakete zu entwickeln. Elementar für die Programmierung ist die Möglichkeit eigene Funktionen zu definieren und die Möglichkeit Kontrollstrukturen zu benutzen. R erlaubt auch die rekursive Ausführung von Funktionen.

Für Programmierer die mit anderen Programmiersprachen arbeiten und sich mit der R-Programmierung vertraut machen wollen, sind folgende Unterschiede augenfällig:

  • Die Handhabung von Parametern bei Funktionsaufrufen ist in R sehr variabel. Die erscheinenden Spielarten des Funktionsaufrufe werden in einem späteren Abschnitt erläutert.
  • Alle Aufrufe wie z.B. "getwd()" sind Methoden, auch wenn sie im interaktiven Modus wie Shell-Kommandos benutzt werden. Es sind immer Klammern zu verwenden. Der Vorteil ist, dass es keine Kollision zwischen Variablennamen und Methodenaufrufen geben kann.
  • Die Namen von Methoden lehnen sich an bekannten Kommandonamen an, sind aber wie alle Namen in R schwer vorherzusehen. So liefert "ls()" nicht die Auflistung eines Verzeichnisses sondern eine Auflistung aller Variablen. Auch die in R verwandte Punktsyntax unterscheidet sich z.B. von jener in Java. So würde man in Java das Erzeugen einer Datentabelle eher in der Form table.read("data.csv") umsetzen. In R wird das Verb vor das Objekt gestellt read.table("daten.csv").

Variablen und Kommentare[Bearbeiten]

Kommentare werden durch das Zeichen # eingeleitet. Kommentare gelten von diesem Zeichen bis zum Zeilenende.

x = 0 # setzt den Wert der Variable auf 0, der Wert ist numerisch

Der Geltungsbereich von Variablen entspricht den Erwartungen. Eine in einer Funktion definierten Variable kann nicht außerhalb der Funktion benutzt werden. Variablen sind nicht getypt wie in Java. Eine Variable kann beliebige Inhalte haben und auch wechseln. Viele Fehler in der Entwicklung eigener R-Scripte sind Typfehler, d.h. der Entwickler erwartet einen anderen Datentyp. Diese Fehler sind in der Regel nicht offensichtliche, weil viele Operationen mit den verschiedenen Datentypen und auch zwischen verschiedenen Datentypen möglich. So kann ein numerischer Wert mit einem String ohne Fehler verglichen werden.

Iterationen[Bearbeiten]

Iteration, Schleifen, lassen sich in R auf drei Arten definieren, durch

  • die for-Schleife
  • die while-Schleife
  • die repeat-Schleife.

Schleifen bestehen aus zwei Teilen der Schleifenkontrolle und dem Inhalt der Schleife. Der Schleifeninhalt ist ein eigener Programmblock, der mit geschweiften Klammern umschlossen wird. Wenn man mehr als einen Befehl in der Schleife ausführen möchte, das ist die Regel, dann müssen die einzelnen Befehle durch Semikolons getrennt werden. Jetzt konkret. Der Syntax der for-Schleife lautet for(Variable in Wert){R Befehle in der Schleife}. Zur Illustration dieser sehr abstrakten Beschreibung hier ein Beispiel:

> x = 0
> for(i in 1:10){x=x+1; print(x);}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

In diesem Beispiel wird innerhalb der Schleife, die von 1 bis 10 läuft, die Variable x um eins erhöht und mit print ausgegeben. Aufeinander folgende Befehle müssen durch das Semikolon getrennt werden. Dieselbe Schleife kann mittels while-Anweisung wie folgt formuliert werden:

> x = 0
> while(x<10){x=x+1; print(x);}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

Jetzt fehlt nur noch die repeat-Schleife. Eigentlich handelt es sich bei der repeat-Schleife um ein umgedrehte while-Schleife. In R ist es ein wenig komplizierter.

> x = 0
> repeat{x=x+1; print(x); if(x>=10) break}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

Die repeat-Schleife muss explizit per break-Befehl beendet werden. Aus diesem Grund kommt hier die if-Anweisung zum Einsatz. Die if-Anweisung dient der bedingten Ausführung von Befehlen. Diese werden im nächsten Abschnitt beschrieben.

Bedingte Ausführung[Bearbeiten]

Innerhalb der Funktion können Variablenbedingungen mit dem if()-Befehl abgefragt werden. Der Aufruf erfolgt etwa so:

if(VARIABLENBEDINGUNG) {FUNKTIONSWEISE}

Innerhalb der Klammern des if()-Befehls werden die Variablenbedingungen gesetzt. Falls diese Bedingungen erfüllt sind, wird der Code innerhalb der geschweiften Klammern ausgeführt. Folgende Bedingungen können abgefragt werden:

Bedingungen
  ==    gleich 
  !=    ungleich 
  <    kleiner 
  <=    kleiner-gleich 
  >    größer 
  >=    größer-gleich 
Verknüpfungen
  &&    und 
  ||    oder 

Mit diesem Wissen könnten wir nun unsere Funktion etwas erweitern:

myfunc <- function(x=3,y=7){ 
          z <- x+y                      # Die Summe von x und y wird in z gespeichert
          if(z>20) {                    # Abfrage, ob die Summe größer als 20 ist
             z <- "wow, bist du gross"  # wenn ja, dann schreibe einen Text in das Objekt z
             }
          return(z)                     # z wird zurückgemeldet
          }


Mehrere Bedingungen können verknüpft werden, z.B. so:

myfunc <- function(x=3,y=7){ 
          if(x<0 && y<0) {         # Abfrage, ob x und y negativ sind
             x <- x*(-1)          # wenn ja, dann mache beide positiv
             y <- y*(-1)
             }
          z <- x+y                # Die Summe von x und y wird in z gespeichert
          if(z==0 | z>50)  {      # Abfrage, ob z gleich 0 oder größer 50 ist
            z <- "Summe ist 0 oder größer 50" # wenn ja, schreibe einen Text...
            }
          return(z)               # z wird zurückgemeldet
          }


In R gibt es neben dem dem if-else Konstrukt eine Variante else-if, bei der mehrere if Anweisungen verkettet werden können.

if(args[1]== "AnalyseError"){
	print("DEBUG: AnalyseError");
} else if(args[1]== "AnalyseAvgRuntime") {
	print("DEBUG: AnalyseAvgRuntime");
} else {
	print("FATAL: missing Arguments");
}


In der R-Sprache:

Siehe auch[Bearbeiten]


Inhaltsverzeichnis[Bearbeiten]