if und else – Bedingungen in R

Heute geht es darum, wie man Bedingungen in R benutzt, um den Programmfluss vielfältiger zu steuern. Das Schema ist hierbei im Prinzip immer „Wenn-Dann-Ansonsten“, zum Beispiel: „Wenn a gleich 4 ist, dann setze b gleich 1, ansonsten setze b gleich 2.“

if und else

Solche Logiken lassen sich mit if und else realisieren. Nach dem if folgt die Bedingung in runden Klammern: if (a == 4). Sollte die Bedingung erfüllt sein, so wird der Code danach ausgeführt:

a <- 4
b <- 0
if (a == 4)
  b <- 1
print(b)

In dem Beispiel wurde b zuerst auf 0 gesetzt, und a auf 4. Anschließend folgt die if-Abfrage mit der Bedingung, dass a gleich 4 ist. Da diese wahr ist, wird b jetzt auf 1 gesetzt. Mit print(b) überprüfen wir das nochmal - passt!

Das Ausführen mehrerer Befehle nach der Bedingung

In dem gezeigten Beispiel muss man allerdings darauf achten, dass nur der Befehl ausgeführt wird, der unmittelbar nach der Bedingung steht. Möchte man mehrere Befehle ausführen, so muss man geschweifte Klammern benutzen, um einen Codeblock zu erstellen (wir kennen die geschweiften Klammern schon von den Funktionen).

myVal <- TRUE
a <- 0
b <- 0
if (myVal == TRUE) {
  a <- 7
  b <- 2
}
print(a)
print(b)

Das Prinzip für die Bedingung ist hier genau gleich zu dem aus dem ersten Beispiel. Diesmal haben wir allerdings zwei Dinge, die wir tun möchten, wenn die Bedingung zutrifft: Wir setzen a auf 7 und b auf 2. Durch die geschweiften Klammern funktioniert das ohne Probleme. Vergessen wir die geschweiften Klammern, läuft das Script nicht wie gewollt:

myVal <- FALSE
a <- 0
b <- 0
if (myVal == TRUE)
  a <- 3
  b <- 5
print(a)
print(b)

In dem Beispiel sehen wir, dass die Bedingung nicht zutrifft, a somit nicht auf 3 gesetzt wird. Allerdings wird b auf 5 gesetzt, auch wenn das hier gar nicht beabsichtigt war (wie an der Einrückung zu erkennen ist). Also merke: Bei mehreren Anweisungen nach der Bedingung nie die geschweiften Klammern vergessen!

Das 'else'

Neben dem if gibt es noch das else, das "sonst" in der Logik. Der Code nach dem else wird immer als Alternative ausgeführt - eben wenn die Bedingung nicht zutrifft. Beispiel:

newVal <- 10
b <- 0
if (newVal == 20) {
  b <- 1
} else {
  b <- 2
}
print(b)

Hier wird b auf 2 gesetzt, da newVal nur 10 und nicht 20 ist, die Bedingung also nicht erfüllt ist.

Vektorisierung

Wenn wir uns die Beispiele alle anschauen, sehen wir, dass immer nur Vektoren mit einem Element benutzt wurden. Das ist kein Zufall: Bei mehreren Elementen könnten Bedingungen nicht eindeutig geprüft werden. In diesen Fällen gibt R eine Warnung aus - nämlich, dass nur das erste Element für die Bedingung benutzt wird:

v <- c(1, 2)
if (v == 2)
  print("!")

In dem Beispiel ist v ein Vektor mit zwei Elementen. In der Bedingung wird gecheckt, ob v gleich 2 ist. Da nur das erste Element für die Prüfung benutzt wird, wird das Ausrufezeichen nie auf den Bildschirm gebracht.

Es gibt in R allerdings eine Funktion, die man wunderbar auf einen Vektor anwenden kann (sie ist "vektorisiert"): ifelse. Dieser Funktion gibt man die Bedingung, den Rückgabewert, wenn die Bedingung erfüllt wird, und den Rückgabewert, wenn sie nicht erfüllt wird:

initvec <- c(1,4,6,7,9)
resvec <- ifelse(initvec < 5, "low", "high")
print(resvec)

Zuerst wird der Vektor initvec erstellt, welcher 5 numerische Werte in aufsteigender Reihenfolge beinhaltet. Dieser Vektor wird anschließend in der ifelse-Funktion verwendet. Für jedes Element in initvec wird nun getestet, ob es kleiner als 5 ist. Ist das der Fall, wird der string low zurückgegeben; wenn nicht, dann wird high zurückgegeben. Wir printen den resultierenden Vektor resvec und sehen, dass alles wie erwartet geklappt hat.

Verschachtelte if-Anweisungen

Zuletzt möchte ich noch darauf hinweisen, dass die if-else-Logiken beliebig verschachtelt werden können (bzw. ein neues if nach einem else stehen kann). Beispiel für verschachtelte if's:

curExample <- 2
blog <- "r-coding.de"
if (curExample == 2) {
  if (blog == "r-coding.de") {
    print("Moinsen!")
  }
}

Und nun noch ein Beispiel für mehrere else-if's:

curChoice <- 3
if (curChoice == 1) {
  print("You chose the bagel.")
} else if (curChoice == 2) {
  print("You chose the donut.")
} else if (curChoice == 3) {
  print("You chose the Oreos.")
} else {
  print("You chose nothin'.")
}

Zusammenfassung

Wir sehen, dass mit if und else (sowie verschachtelte if's und mehrere else-if's) die Programmlogik gesteuert wird und etwas mehr Dynamik ins Skript kommt - der Programmfluss ist somit nicht immer unbedingt gleich, sondern abhängig von ausgewählten Faktoren. Bedingungen gibt es auch in anderen Bereichen, unter anderem beim logischen Bilden von Untermengen ("logical subsetting"), z.B. bei Data Frames. Aber darauf gehe ich in einem zukünftigen Post ein. Hast du noch weitere Fragen zu Bedingungen in R? Oder zu einem anderen Thema? Schreib mir einfach eine Mail: mail@r-coding.de.
Bleib außerdem auf dem Laufenden mit dem r-coding Newsletter. Du erhältst Infos zu neuen Blogeinträgen, sowie kleine Tipps und Tricks zu R. Melde dich jetzt an: http://r-coding.de/newsletter.

Ähnliche Beiträge

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.