Funktionale Programmierung in R

Anwenden von Funktionen und vektorisierten Operationen

Lernen Sie, wie Sie das funktionale Programmierparadigma von R nutzen können, um effizienten und prägnanten Code zu schreiben. Dieses Tutorial behandelt wichtige Anwendungsfunktionen, vektorisierte Operationen und bewährte Praktiken für die funktionale Programmierung in R.

Programmierung
Autor:in
Zugehörigkeit
Veröffentlichungsdatum

10. Februar 2024

Geändert

29. April 2025

Schlüsselwörter

Funktionale Programmierung in R, Vektorisierung in R, Funktionen in R anwenden, R apply Familie, Vektorisierte R-Operationen

Einführung

Funktionale Programmierung in R ist ein leistungsfähiges Paradigma, das sich auf die effiziente Verarbeitung von Daten durch Funktionen konzentriert. Durch die Nutzung der in R eingebauten Anwendungsfunktionen und vektorisierten Operationen können Sie prägnanteren, besser lesbaren und schnelleren Code schreiben, der oft keine expliziten Schleifen mehr benötigt. Dieses Tutorial führt Sie in die wichtigsten Funktionen (lapply() und sapply()) der apply-Familie ein, demonstriert vektorisierte Operationen und bietet zusätzliche Beispiele mit apply(), tapply(), mapply() und vapply(). Diese Techniken werden Ihnen helfen, eleganten, effizienten R-Code zu schreiben.



Die Apply-Familie

R bietet eine Vielzahl von Funktionen, mit denen Sie Operationen auf Datensammlungen anwenden können, ohne auf Schleifen zurückgreifen zu müssen. Diese Funktionen umfassen:

  • apply(): Wendet eine Funktion auf die Ränder einer Matrix an.
  • lapply(): Gibt eine Liste zurück, indem eine Funktion auf eine Liste oder einen Vektor angewendet wird.
  • sapply(): Eine benutzerfreundliche Version von lapply(), die die Ausgabe vereinfacht.
  • vapply(): Ähnlich wie sapply(), erfordert jedoch die Angabe des Ausgabetyps.
  • tapply(): Wendet eine Funktion auf Teilmengen eines Vektors an, kategorisiert nach einem Faktor.
  • mapply(): Multivariate Version von lapply(), die eine Funktion parallel auf einen Satz von Argumenten anwendet.

Beispiel: Verwendung von lapply() und sapply()

# Erstellen einer Liste von numerischen Vektoren
num_list <- list(a = 1:5, b = 6:10, c = 11:15)

# Verwendung von `lapply`, um den Mittelwert jedes Vektors zu berechnen (gibt eine Liste zurück)
means_list <- lapply(num_list, mean)
print(means_list)
$a
[1] 3

$b
[1] 8

$c
[1] 13
# Verwendung von `sapply` zur Berechnung des Mittelwerts (vereinfacht zu einem Vektor)
means_vector <- sapply(num_list, mean)
print(means_vector)
 a  b  c 
 3  8 13 

Vektorisierte Operationen

Vektorisierte Operationen in R ermöglichen es Ihnen, elementweise Operationen auf ganze Vektoren oder Matrizen ohne explizite Schleifen durchzuführen. Dieser Ansatz ist im Allgemeinen schneller und prägnanter.

Beispiel: Vektorisierte Arithmetik

# Erstellen eines numerischen Vektors
x <- 1:10

# Multiplizieren jedes Elements mit 2 unter Verwendung der vektorisierten Multiplikation
y <- x * 2
print(y)
 [1]  2  4  6  8 10 12 14 16 18 20
# Berechnen Sie die Quadratwurzel jedes Elements
sqrt_values <- sqrt(x)
print(sqrt_values)
 [1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751 2.828427
 [9] 3.000000 3.162278

Weitere Beispiele aus der Anwendungsfamilie

Um die Leistungsfähigkeit der apply-Familie von R voll auszuschöpfen, sollten Sie diese zusätzlichen Funktionen in Betracht ziehen:

Beispiel für die Verwendung von apply()

Die Funktion apply() wird normalerweise mit Matrizen oder Arrays verwendet, um eine Funktion auf Zeilen oder Spalten anzuwenden.

# Erzeugen einer 3x3-Matrix
matrix_data <- matrix(1:9, nrow = 3, ncol = 3)
print(matrix_data)
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
# Jede Zeile summieren (`margin = 1`)
row_sums <- apply(matrix_data, 1, sum)
print(row_sums)
[1] 12 15 18
# Jede Spalte summieren (`margin = 2`)
col_sums <- apply(matrix_data, 2, sum)
print(col_sums)
[1]  6 15 24

Beispiel mit tapply()

Die Funktion tapply() wendet eine Funktion auf Teilmengen eines Vektors an, die durch einen Faktor definiert sind, was für gruppierte Operationen nützlich ist.

#|label: tapply-example
# Beispielvektor mit Altersangaben und einem Gruppierungsfaktor
ages <- c(23, 35, 27, 45, 31, 29)
groups <- factor(c("A", "B", "A", "B", "A", "B"))

# Berechnen des mittleren Alters für jede Gruppe
mean_ages <- tapply(ages, groups, mean)
print(mean_ages)

Ergebnisse:

       A        B 
27.00000 36.33333 

Beispiel für mapply()

Die Funktion mapply() ist eine multivariate Version von sapply(), die eine Funktion parallel auf eine Reihe von Argumenten anwendet.

#|label: mapply-example
# Definieren zweier numerischer Vektoren
v1 <- 1:5
v2 <- 6:10

# Verwenden Sie mapply, um die entsprechenden Elemente der beiden Vektoren zu summieren
sums <- mapply(sum, v1, v2)
print(sums)

Ergebnisse:

[1]  7  9 11 13 15

Beispiel für die Verwendung von vapply()

Die Funktion vapply() ähnelt der Funktion sapply(), erfordert jedoch die Angabe des Ausgabetyps, um besser vorhersehbare Ergebnisse zu erzielen.

#|label: vapply-example
# Definieren Sie eine Funktion zur Berechnung der Quadratwurzel aus einer Zahl
sqrt_func <- function(x) sqrt(x)

# Wenden Sie die Funktion mit vapply auf einen Vektor an und geben Sie an, dass die Ausgabe numerisch(1) sein soll
sqrt_values <- vapply(1:5, sqrt_func, FUN.VALUE = numeric(1))
print(sqrt_values)

Vorteile der funktionalen Programmierung in R

  • Prägnanz:
    Funktionale Konstrukte ermöglichen es Ihnen, weniger Codezeilen für gängige Operationen zu schreiben.

  • Lesbarkeit:
    Code, der Anwendungsfunktionen und vektorisierte Operationen nutzt, ist oft besser lesbar als verschachtelte Schleifen.

  • Leistung:
    Vektorisierte Operationen werden in optimiertem C-Code implementiert, der deutlich schneller sein kann als entsprechende R-Schleifen.

  • Wartbarkeit:
    Ein funktionaler Ansatz kann zu Code führen, der einfacher zu testen und zu warten ist, da Funktionen bestimmte Verhaltensweisen kapseln.

Best Practices

  • Funktionen rein halten:
    Entwerfen Sie, wann immer möglich, Funktionen, die keine Nebeneffekte haben. Dies erleichtert das Testen und das Nachdenken über Ihren Code.

  • Beschreibende Namen verwenden:
    Benennen Sie Ihre Funktionen und Variablen klar und deutlich, um ihren Zweck anzugeben.

  • Eingebaute Funktionen nutzen:
    Nutzen Sie die umfangreichen Anwendungsfunktionen und vektorisierten Operationen von R, bevor Sie auf explizite Schleifen zurückgreifen.

  • Profil Ihres Codes:
    Verwendung von Profiling-Tools (z. B. Rprof()) zur Ermittlung von Engpässen und Optimierung leistungsrelevanter Abschnitte.

Schlussfolgerung

Funktionale Programmierung in R ermöglicht es Ihnen, prägnanteren, effizienteren und besser wartbaren Code zu schreiben. Mit der apply-Familie und vektorisierten Operationen können Sie komplexe Datenmanipulationen problemlos durchführen. Experimentieren Sie mit den bereitgestellten Beispielen und integrieren Sie diese Techniken in Ihren Arbeitsablauf, um Ihre Datenverarbeitungsmöglichkeiten zu verbessern.

Weiterführende Literatur

Viel Spaß beim Schreiben von effizienten R-Programmen mit funktionalen Programmiertechniken!

Weitere Artikel erkunden

Hinweis

Hier finden Sie weitere Artikel aus derselben Kategorie, die Ihnen helfen, tiefer in das Thema einzutauchen.

placeholder

placeholder
Keine Treffer
Zurück nach oben

Wiederverwendung

Zitat

Mit BibTeX zitieren:
@online{kassambara2024,
  author = {Kassambara, Alboukadel},
  title = {Funktionale Programmierung in R},
  date = {2024-02-10},
  url = {https://www.datanovia.com/de/learn/programming/r/advanced/functional-programming.html},
  langid = {de}
}
Bitte zitieren Sie diese Arbeit als:
Kassambara, Alboukadel. 2024. “Funktionale Programmierung in R.” February 10, 2024. https://www.datanovia.com/de/learn/programming/r/advanced/functional-programming.html.