Diese Lektion wird aus Erklärungen dazu bestehen, was Funktionen in R sind und wie sie erstellt werden. Diese sind wichtig, da sie einer der Hauptbestandteile unserer weiteren Arbeit mit Problemstellungen in R sein werden.
Was ist also eine Funktion?
Formell gesehen ist eine Funktion ein nützliches Hilfsmittel, dass eine Gruppe von Anweisungen zusammenfasst, damit sie mehr als einmal ausgeführt werden müssen.
Auf einem grundsätzlicheren Level erlauben uns Funktionen nicht ständig den selben Code schreiben zu müssen. Wenn ihr zurückdenkt an die Lektionen zu Strings und Listen, dann stellen wir fest, dass beispielsweise length()
so eine Funktion ist. Da es eine häufige Aufgabe ist, die Länge einer Sequenz zu überprüfen, wäre das ein Anwendugnsfall, für den man eine Funktion schreiben würde.
Funktionen sind eine der einfachsten Wege, um Code in R wiederzuverwenden. Darüber hinaus erlauben sie es uns Programmdesign besser zu verstehen.
Wir kennen bereits einige eingebaute Funktionen und können über die help
Funktion mehr über diese und ihre Parameter (auch Argumente genannt) erfahren:
help(sum)
Dabei fällt folgendes Format auf:
name_der_funktion(input1,input2,....)
Können wir das so auch selbst erstellen? Die Syntax dazu lautet wie folgt:
name_der_funktion <- function(param1,param2,...){
# Code der ausgeführt wird
}
Schauen wir uns einige Beispiele an:
# Einfache Funktion, keine Eingabe (en. input)
hallo <- function(){
print('Hallo!')
}
hallo()
[1] "Hallo!"
hallodu <- function(name){
print(paste('Hallo',name))
}
hallodu('Sammy')
[1] "Hallo Sammy"
add_num <- function(num1,num2){
print(num1+num2)
}
add_num(5,10)
[1] 15
Bisher mussten wir jeden einzelnen Parameter an die Funktion übergeben, wenn wir sie ausführen wollten. Es gibt allerdings auch die Möglichkeit Standardwerte zu definieren, die immer dann genutzt werden, wenn der Nutzer keine Parameter selbst definiert. Diese definierne wir durch Verwendung eines =:
hallo_jemand <- function(name='Peter'){
print(paste('Hallo',name))
}
# Standard nutzen
hallo_jemand()
[1] "Hallo Peter"
# Selbst definieren
hallo_jemand('Sammy')
[1] "Hallo Sammy"
Wir werden viele eingebaute Funktionen sehen, die Standardwerte für eine große Vielfalt von Aufgaben verwenden, bei denen der Nutzer typischerweise einen ganz bestimmten Wert braucht.
Bisher habenb wir Ergebnisse nur per print
ausgegeben. Es kann allerdings auch der Fall sein, dass wir einen Wert zurückgeben (en. return) möchten, sodass wir ihn einer Variable zuweisen können. Dazu verwenden wir das return
Keyword:
formal <- function(name='Sam',title='Herr'){
return(paste(title,name))
}
formal()
formal('Issac Newton')
Achtet darauf, dass wir hier keine print-Ausgabe erzeugen. Wir können unser Ergebnis einer Variablen zuweisen:
var <- formal('Marie Curie','Frau')
var
Das ist die Art von Syntax, die wir für unsere Funktionen verwenden werden: Die Übergabe von Parametern und die Rückgabe eines Ergebnisses.
Geltungsbereich (en. scope) ist der Begriff, den wir dafür verwenden, um zu beschreiben wie Objekte und Variablen definiert sind. Ist eine Variable bspw. nur innerhalb einer Funktion definiert, dann sagen wir, dass ihr Geltungsbereich auf die Funktion limitiert ist.
# Eingabe mit 5 multiplizieren
mal5 <- function(eingabe) {
ergebnis <- eingabe * 5
return(ergebnis)
}
mal5(4)
ergebnis # Außerhalb der Funktion nicht definiert
eingabe # Außerhalb der Funktion nicht definiert
Error in eval(expr, envir, enclos): object 'ergebnis' not found Traceback:
Dieser Error zeigt uns an, dass die Variablen nur innerhalb des "Geltungsbereichs" der Funktion definiert sind. Varaiblen hingegen, die außerhalb der Funktion definiert werden, sind globale Variablen. Die Funktion kann deshalb auf sie zugreifen. Ein Beispiel:
v <- "Ich bin ein globales v"
etwas <- "Auch ich bin etwas globales"
fun <- function(etwas){
print(v)
etwas <- 'Etwas neues zuweisen'
print(etwas)
}
print(v) # print v
print(etwas) #print etwas
fun(etwas) # etwas an die Funktion übergeben
# Die Neuzuweisung geschieht nur innerhalb der Funktion
print(etwas)
[1] "Ich bin ein globales v" [1] "Auch ich bin etwas globales" [1] "Ich bin ein globales v" [1] "Etwas neues zuweisen" [1] "Auch ich bin etwas globales"
Was passiert hier im Details? Das folgende:
print(v) überprüft die globale Variable v, äußerer Geltungsbereich
print(etwas) überprüft auch die globale Variable etwas
fun(etwas) wird einen Parameter akzeptieren, print auf v anwenden, dann etwas neu zuweisen (innerhalb des Geltungsbereichs der Funktion) und print auf etwas anwenden. Achtet dabei auf zwei Dinge:
Schaut euch die nachfolgende Funktion an und versichert euch, dass ihr sie versteht:
doppelt <- function(a) {
a <- 2*a
a
}
var <- 5
doppelt(var)
var
Großartig, wir haben in dieser Lektion sehr viel neues gelernt! Jetzt ist es Zeit unser Wissen einzusetzen!