Hej Leute,

hier geht es um die Vorteile funktionaler Programmierung, denn diese sind so groß, dass jeder R-Programmierer diese kennen sollte. Und keine Angst, das ist gar nicht so schwer.

 

Was ist denn funktionale Programmierung?

Fangen wir mit der iterativen Programmierung an, also dem schrittweise Vorgehen. Damit sind im Wesentlichen Schleifen (for, while) gemeint. Diese sind – vor allem in R – nicht sonderlich effizient, weil jeder Schritt eben nacheinander abgearbeitet werden muss, und das dauern dann bei großen Datensätzen ziemlich lang.

Hier ein ganz einfaches Beispiel, welches zu jedem Element eines Vektors eins addiert.

 

Ok, die kürzere und viel schnellere Variante kennt ihr natürlich alle:

Und das ist schon simples funktionales Vorgehen. Prinzipiell gibt es Funktionen, die eine Funktion auf alle Elemente eines Vektors bzw. Zeilen oder Spalten eines Data.frames  anwenden, was hochgradig parallelisierbar und dementsprechend schnell ist. Natürlich gibt es Situationen, da kommt man um Schleifen nicht herum, aber man kann erstaunlich viele vermeiden.

 

lapply, sapply, vapply

R selber bietet für die funktionale Programmierung die apply-Funktionen:

  • lapply(x, funktion) wendet die angegebene Funktion auf x an und gibt eine Liste zurück
  • sapply (x, funktion) macht das gleiche, gibt aber einen Vektor oder eine Matrix zurück
  • vapply (x, funktion, typ) macht ebenfalls das gleiche, gibt aber den Vektor oder Matrix von dem angegebenen Typ zurück.
  • tapply(x, y, funktion) gruppiert x nach den Ausprägungen von y und wendet auf jede Gruppe die angegebene Funktion an

 

Was können wir damit alles anstellen? Hier ein paar Beispiele

 

Und zum Schluss noch der Tipp, vapply zu verwenden, sofern möglich, da der Rückgabetyp klar definiert ist, wie folgendes Beispiel zeigt:

Noch etwas eleganter geht es mit dem Package purrr aus dem tidyverse. Dazu aber ein andernmal mehr.
 
Happy coding,

Euer Holger