Das ist ein wichtiges Konzept in R. Um die Möglichkeiten besser zu verstehen, kann es hilfreich sein, die Dimensionalität der Eingabe und Ausgabe der verschiedenen Funktionen zu betrachten.
Wir haben bereits Funktionen gesehen, die einen Vektor entgegennehmen und einen einzelnen, skalarähnlichen Wert zurückgeben:
> v <- 1:5
> length(v)
#> [1] 5
> sum(v)
#> [1] 15
Viele statistische Funktionen gehören ebenfalls in diese Kategorie, wie zum Beispiel mean().
Für logische Vektoren gibt es all() und any().
Viele Funktionen in R arbeiten mit ganzen Vektoren und liefern oft eine Vektorausgabe. Dazu gehören die meisten mathematischen Funktionen:
> sq <- c(4, 9, 16, 25)
> sqrt(sq) # square root
#> [1] 2 3 4 5
Das ist nicht nur prägnant und praktisch, sondern vermeidet auch die Notwendigkeit von Schleifen, List Comprehensions oder Rekursion, die in anderen Sprachen üblich sind. In R laufen Vektorfunktionen oft viel schneller als diese Techniken.
Zum Sortieren eines Vektors gibt es sort(), um die Werte zurückzugeben, und order(), um die Indizes zurückzugeben:
> v <- c("I", "am", "not", "in", "order")
> sort(v)
#> [1] "am" "I" "in" "not" "order"
> order(v)
#> [1] 2 1 4 3 5
Standardmäßig wird aufsteigend sortiert.
Gib bei Bedarf decreasing = TRUE an, oder verwende rev(), um einen vorhandenen Vektor umzukehren.
v <- c("I", "am", "not", "in", "order")
sort(v, decreasing = TRUE)
#> [1] "order" "not" "in" "I" "am"
rev(1:4)
#> [1] 4 3 2 1
Es gibt auch Funktionen, die kumulative Vektorausgaben erzeugen und den Eingabevektor von links nach rechts verarbeiten:
> cumsum(1:5)
#> [1] 1 3 6 10 15 # sums
> cumprod(1:5)
#> [1] 1 2 6 24 120 # equivalent to factorials
Eine Erweiterung dieses Konzepts kann auch verwendet werden, um Vektoren zu vergleichen.
Betrachte zum Beispiel die Funktion pmax() für paarweise Maxima:
> v
#> [1] 2 7 9
> w
#> [1] 3 1 5
> pmax(v, w)
#> [1] 3 7 9 # max of each pairwise comparison
Du beobachtest leidenschaftlich gern Vögel und hältst fest, wie viele Vögel in den letzten sieben Tagen deinen Garten besucht haben.
Du hast sechs Aufgaben, die sich alle mit der Anzahl der Vögel befassen, die deinen Garten besucht haben.
Implementiere die Funktion today(), die zurückgibt, wie viele Vögel deinen Garten heute besucht haben. Die Vogelzahlen sind nach Tagen geordnet: Das erste Element ist die Zahl des ältesten Tages, das letzte Element die Zahl von heute.
birds_per_day <- c(2, 5, 0, 7, 4, 1)
today(birds_per_day)
# => 1
Implementiere die Funktion increment_todays_count(), um die Anzahl für heute zu erhöhen:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
increment_todays_count(birds_per_day)
# => c(2, 5, 0, 7, 4, 2)
Implementiere die Funktion has_day_without_birds(), die TRUE zurückgibt, wenn es einen Tag gab, an dem kein Vogel den Garten besucht hat; andernfalls gibst du FALSE zurück:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
has_day_without_birds(birds_per_day)
# => true
Implementiere die Funktion count_for_first_days(), die die Anzahl der Vögel zurückgibt, die seit Beginn der Woche deinen Garten besucht haben. Beschränke die Zählung dabei auf die angegebene Anzahl von Tagen ab Beginn der Woche.
birds_per_day <- c(2, 5, 0, 7, 4, 1)
count_for_first_days(birds_per_day, 4)
# => 14
Manche Tage sind geschäftiger als andere. Ein geschäftiger Tag ist einer, an dem fünf oder mehr Vögel deinen Garten besucht haben.
Implementiere die Funktion busy_days(), die die Anzahl der geschäftigen Tage zurückgibt:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
busy_days(birds_per_day)
# => 2
Du bist neugierig, wie viele Vögel diese Woche insgesamt schon zu Besuch waren. Berechne die kumulierten Summen für jeden Tag.
running_total(c(7, 6, 5, 4, 3, 2, 1))
#> [1] 7 13 18 22 25 27 28
Du vermutest, dass die Vogelbesuche vom Verkehrsaufkommen der umliegenden Straßen beeinflusst werden und deshalb am Wochenende anders ausfallen als an Wochentagen.
Sortiere die Tagesabkürzungen in absteigender Reihenfolge nach der Anzahl der Vögel, die zu Besuch waren.
day_names <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
birds_per_day <- c(5, 2, 4, 6, 0, 9, 8)
busy_days_of_week(birds_per_day, day_names)
#> [1] "Sat" "Sun" "Thu" "Mon" "Wed" "Tue" "Fri"
Melde dich bei Exercism an, um R mit 21 Konzepte111 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.