Ersetzen von For-Schleifen durch Map Reduce.

27.06.2021, von Daniel Bajka

Wer programmiert, stösst unweigerlich auf die Kontrollstrukrur der For-Schleife. Eine der häufigsten Verwendungen ist die Numerische Schleife. Die wichtigsten Merkmale sind:

For (Zähler in Start : Ende){ 
    ' zu
    ' wiederholende
    ' Anweisungen
    ' bedingte Anweisungen
    ' Abbruchbediungungen
    }
  • Die Anzahl der Wiederholungen steht schon beim Eintritt in die Schleife fest.
  • Es gibt eine Schleifenvariable, die am Anfang auf den Startwert gesetzt wird und dann jeweils um die Schrittweite verändert wird, bis der Zielwert erreicht ist.
  • Die Schleifenvariable, der Startwert, die Schrittweite und der Endwert müssen numerisch sein.

Der Komplexität von ‘For-Schleifen’ sind keine Grenzen gesetzt und damit auch nicht der Unübersichtlichkeit und Fehleranfälligkeit. Unübesichtlich, weil es oftmals viel Zeit erfordert, die Funktionsweise des so erzeugten Codes nachzuvollziehen. Fehleranfällig, weil For-Schleifen auch in Funktionen verwendet werden und sowohl mit globalen wie auch lokalen Variablen arbeiten. Nicht selten werden Abbruchbedingenen programmiert, die ein unmittelbares Verlassen der Funktion bewirken. Dabei ist man sich selten der Konsequenzen auf lokale und globale Variablen bewusst. So können Laufzeitfehler enstehen, die zu falschen Resultaten führen aber auch ganze Systeme lahmlegen. Die Frage, die sich stellt ist: Kann man diese Gefahren vermeiden? Die Antwort lautet JA! Eine Möglichkeit ist die Verwendung von Funktionen höherer Ordnung

Laut https://www.r-bloggers.com/ ist eine Funktion höherer Ordnung eine Funktion, die entweder Funktionen als Argumente akzeptiert oder eine Funktion zurückgibt. In der Mathematik ist die Ableitung beispielsweise eine Funktion höherer Ordnung. Drei Funktionen höherer Ordnung kommen in praktisch jeder funktionalen Programmiersprache vor und können als De-facto-Kanon betrachtet werden. Diese sind Map, Fold (oder Reduce) und Filter. Diese Funktionen abstrahieren die Iteration über Listen, die in einer vektorisierten Sprache wie R allgegenwärtig ist.

Das folgende Beispiel zeigt auf, wie Map Reduceeingesetzt wird, um aus einer Liste von fünf Dokumenten …

DC.docvars_sdgs_noNAs$identifier[] %>%
    map(.,function(x){
        str_split(x, pattern = ";") %>%
            unlist(.) ->> o

        str_detect(o,"https://digitalcollection.zhaw.ch/handlse") ->> f_handle
        ifelse(any(f_handle > 0), o[f_handle], o[]) %>%
            return()
    })  %>%

    unlist() %>%
    as_data_frame() %>%

    mutate(DC.docvars_sdgs_noNAs, handle= .) -> DC.docvars_sdgs_noNAs

Eine Karte spiegelt den mathematischen Sinn des Wortes wider, als ein Verfahren, das jedes Element einer Menge durch dieselbe Funktion transformiert. Die Ausgabe von map erfolgt normalerweise eins zu eins mit der Eingabe. Fold hingegen ist ein Mechanismus, um eine Reihe von Daten zu einem einzigen Wert zusammenzufassen. Die Summen- und Produktoperatoren sind gute Beispiele dafür, bei denen ein Vektor auf einen einzigen Wert reduziert wird. Die letzte Funktion gibt eine Teilmenge einer Liste zurück, die auf einem Prädikat basiert. Einige Setzoperationen (z. B. Setdifferenz) sind Beispiele für eine Filteroperation.

funktionale programmierung prozedurale programmierung R praxis problemzerlegung

Share