Tracks
/
R
R
/
Lehrplan
/
Bedingte Anweisungen
Be

Bedingte Anweisungen in R

2 Übungen

Über Bedingte Anweisungen

Vergleichsoperatoren

R hat eine Reihe von Operatoren, die es genauso in vielen anderen Sprachen gibt:

1 == 2 # FALSE
1 != 2 # TRUE
1 < 2 # TRUE
1 > 2 # FALSE
1 <= 2 # TRUE
1 >= 2 # FALSE

Verzweigung

Die Grundform einer if-then-else-Anweisung ist:

if (x > 10) {
    y <- "big"
} else if (x > 2) {
    y <- "medium"
} else {
    y <- "tiny"
}

In diesem Fall sind sowohl die runden Klammern ( ) um den booleschen Ausdruck als auch die geschweiften Klammern { } um den Block erforderlich.

Eine einfache if-Anweisung lässt sich verkürzen:

if (x == 0) return("success")

Vektoren in Bedingungen

Ein Vorgriff auf das Konzept vector-filtering: Die Bedingung in den runden Klammern () muss zu einem einzelnen TRUE/FALSE ausgewertet werden.

Wenn du Vektoren in den Vergleich einbeziehst, erhältst du normalerweise einen Vektor von booleschen Werten. Diese müssen dann in eine aggregierende Funktion wie all() (sind alle Werte TRUE?) oder any() (ist mindestens ein Wert TRUE?) eingepackt werden.

numbers <- c(4,5,7,9,10,11)
numbers %% 3 == 0 # gives vector of booleans
#> [1] FALSE FALSE FALSE  TRUE FALSE FALSE

# use any() to get a single TRUE/FALSE
if (any(numbers %% 3 == 0)) print("1 or more numbers are divisible by 3")
#> [1] "1 or more numbers are divisible by 3"

Die Funktion ifelse

Eine alternative if-else-Form kann nützlich sein, sofern es nur ein wahr/falsch-Ergebnis gibt.

y <- ifelse(x > 8, "big", "small")

# Don't mix result types:
z <- ifelse(x > 100, 100, "small") # numeric or string result? Expect problems!

ifelse() nimmt genau drei Parameter:

  1. boolesche Bedingung
  2. Wert, wenn TRUE
  3. Wert, wenn FALSE.

Vektoren als Eingabewerte sind zulässig, und dann wird eine Vektor-Ausgabe erzeugt. Achte in diesem Fall darauf, dass beide Zweige denselben Datentyp ergeben: numerisch, Zeichenkette, logisch usw. Das wird im Konzept vector-functions behandelt.

Die beiden Ergebnisse ("big", "small" im obigen Beispiel) sollten einzelne Werte sein. Leider führt ein längerer Vektor hier wahrscheinlich dazu, dass R etwas Verwirrendes und Unerwartetes tut, ohne eine Warnung auszugeben.

Die Funktion if_else

Hintergrund

Die Maintainer der Sprache R verfolgen die Politik, inkompatible Änderungen so weit wie möglich zu vermeiden. Das hilft, die riesige Zahl von Drittanbieter-Paketen zu pflegen, die in CRAN verfügbar sind, schränkt aber die Möglichkeit ein, Base R mit modernen Programmierkonzepten zu aktualisieren.

In den letzten Jahren wurden mehrere Pakete veröffentlicht, die R-Funktionalität erweitern und manchmal ersetzen. Sie basieren auf jahrzehntelanger Erfahrung mit den Stärken und Schwächen des ursprünglichen R-Designs.

Diese Pakete bilden die Sammlung tidyverse. Sie wurden 2023 zum Exercism-Testrunner hinzugefügt und stehen dir in Übungen zur Verfügung.

Unser R-Track existierte schon mehrere Jahre, bevor das tidyverse hinzugefügt wurde. Daher kann es sein, dass viele Community-Lösungen bei der Basissprache bleiben.

Das Paket dplyr

dplyr ist hauptsächlich mit der Manipulation von Dataframes beschäftigt (wird später im Kurs behandelt).

Binde es entweder mit library(dplyr) am Anfang deines Codes ein oder mit library(tidyverse), um die ganze Sammlung einzubinden. Du siehst möglicherweise Warnmeldungen über maskierte Namen, aber das ist selten ein Problem.

Für das aktuelle Konzept ist die Funktion if_else erwähnenswert. Sie ähnelt weitgehend ifelse in Base R.

library(dplyr) # warnings not shown

x <- 10
if_else(x > 8, "big", "small")
#> [1] "big"

Der Hauptunterschied ist, dass if_else ein optionales viertes Argument für fehlende Werte annehmen kann, die in R durch NA dargestellt werden.

xs <- c(3, NA, 10, NA, 4)  # a 5-element vector
xs
#> [1]  3 NA 10 NA  4
if_else(xs > 8, "big", "small", "missing")
#> [1] "small"   "missing" "big"     "missing" "small" 

# contrast:
ifelse(xs > 8, "big", "small")
#> [1] "small" NA      "big"   NA      "small"

Du wirst außerdem feststellen, dass if_else viel bessere Fehlermeldungen hat als das ältere ifelse.

Nachdem du die Bibliothek dplyr geladen hast, hast du auch Zugriff auf die Funktion between().

R erlaubt keine Verkettung von Vergleichen, daher führt 1 <= x <= 5 zu einer Fehlermeldung. Mit geladenem dplyr ist between(x, 1, 5) äquivalent zu x >= 1 & x <= 5 und vielleicht besser lesbar. Die untere und die obere Grenze sind beide inklusive.

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne Bedingte Anweisungen