3.6 Funktionen

Jede Programmiersprache ist nur so umfangreich, wie viele Funktionen sie hat. Funktionen werden von Menschen geschrieben, deren Ziel es ist, verschiedenste Berechnungen zu automatisieren. Gebe zum Beispiel einmal in deine Konsole nur die Funktion mean ein. Was du erhältst ist der Beginn einer Funktion, die Menschen für die Programmiersprache R geschrieben haben. Funktionen haben immer den gleichen Aufbau:

function_name(argument1 = value1, argument2 = value2)
  • function_name: Dies ist der Name der Funktion. Auch dieser ist wie bei Variablen willkürlich gewählt.
  • argument1: Funktionen haben immer Argumente. Ein Argument besagt, welche Objekte in eine Funktion gespeist werden. Stell dir Funktionen wie eine Fabrik vor, die etwas herstellt. Jede Fabrik benötigt Rohmaterial mit dem Produkte erzeugt werden. Argumente sind äquivalent zu Rohmaterialien. Sie werden in die Funktion gespeist und in der Funktion verarbeitet.
  • value1: Jedes dieser Rohmaterialien hat bestimmte Werte. Beispielsweise kann value1 eine Zahl (3) oder ein Text sein ("Hallo"). Wir werden später andere Datentypen kennen lernen, die ebenso in Funktionen gespeist werden können (z.B. Vektoren oder Dataframes - mehr dazu gleich).

Beispielsweise umfasst R die Funktion sqrt mit der wir die Wurzel einer Zahl berechnen können:

## [1] 3

Mit Hilfe des ? Zeichens können wir die Funktion näher betrachten und uns ansehen, welche Argumente eine Funktion annimmt:

Die Funktion sqrt hat demnach nur ein Argument mit dem Namen x. x kann sowohl eine einzelne Zahl als auch mehrere Zahlen sein. Wir müsse das Argument nicht immer angeben. Wir hätten die Funktion daher auch so formulieren können:

## [1] 3

Achte darauf, dass jede Funktion mit einer Klammer schließt. Tust du dies nicht, denkt R, dass dein Befehl noch nicht zu Ende ist und zeigt Dir dies mit einem + an:

Eine andere Funktion heißt sum. Mit sum kannst du mehrere Zahlen miteinander addieren:

## [1] 12

Wenn du dir die Funktion unter der Hilfe mit ?sum anschaust, erkennst du, dass die Funktion unendlich viele Argumente hat. Dies wird mit einem ... gekennzeichnet:

Wir könnten daher ebenso die Summe von fünf Zahlen zusammen rechnen:

## [1] 15

Lade als nächstes das Paket tidyverse (library(tidyverse)). Das Paket tidyverse umfasst die Funktion select. Mit Hilfe von select werden wir später Variablen aus einem Datensatz selektieren. Wenn du dir die Dokumentation der Funktion mit Hilfe von ?select anschaust, erkennst du, dass die Funktion mehrere Argumente hat:

Das erste Argument heißt .data. Hierfür fügen wir später den Datensatz ein. Das zweite Argument hat keinen expliziten Namen, sondern umfasst eine mit Komma getrennte Liste an Variablennamen. Schauen wir uns ein Beispiel an. Hierfür laden wir zunächst das Paket tidyverse und den Datensatz hr_cleaned (Achte darauf, dass du zuvor das Arbeitsverzeichnis mit STRG + UMSCHALT + H verändert hast):

Anschließend können wir die Funktion select ausführen, um verschiede Variablen aus dem Datensatz zu nehmen (Um zu sehen, welche Variablen im Datensatz stecken, gebe colnames(human_resources) in die Konsole ein):

## # A tibble: 1,470 x 2
##       id   age
##    <dbl> <dbl>
##  1     1    41
##  2     2    49
##  3     3    37
##  4     4    33
##  5     5    27
##  6     6    32
##  7     7    59
##  8     8    30
##  9     9    38
## 10    10    36
## # … with 1,460 more rows

Du erkennst das erste Argument .data, in welches wir den Datensatz einfügen. Zusätzlich geben wir mehrere Variablennamen ein, indem wir die Variablennamen durch ein Komma trennen. Wir hätten ebenso die Argumente umdrehen können:

## # A tibble: 1,470 x 2
##       id   age
##    <dbl> <dbl>
##  1     1    41
##  2     2    49
##  3     3    37
##  4     4    33
##  5     5    27
##  6     6    32
##  7     7    59
##  8     8    30
##  9     9    38
## 10    10    36
## # … with 1,460 more rows

Generell ist es allerdings ratsam, die Reihenfolge der Argumente beizubehalten. Wenn wir dies tun, können wir die Namen der Argumente ignorieren:

## # A tibble: 1,470 x 2
##       id   age
##    <dbl> <dbl>
##  1     1    41
##  2     2    49
##  3     3    37
##  4     4    33
##  5     5    27
##  6     6    32
##  7     7    59
##  8     8    30
##  9     9    38
## 10    10    36
## # … with 1,460 more rows

Versuchen wir nochmal von diesem Beispiel zu abstrahieren. Funktionen haben einen Namen und eine umgebende Klammer:

function_name()

Fasst alle Funktionen haben Argumente. Die Anzahl der Argumente ist abhängig von der Funktion. Hier siehst du das Schema einer Funktion mit zwei Argumenten:

function_name(argument1 = value1, argument2 = value2)

Die Reihenfolge der Argumente ist egal, solange wir die Argumente explizit benennen:

function_name(argument2 = value2, argument1 = value1)

Bennenen wir die Argumente nicht, müssen wir die Reihenfolge beachten, die in der Funktion (siehe ?function_name) vorgegeben ist:

function_name(value1, value2)