Niels Schwab
RLab - Skriptbasierte modulare Umweltstatistik (Universitätskolleg 2.0)
Universität Hamburg
RLab-Impressum
Gefördert im Rahmen des „Lehrlabors“ im Universitätskolleg 2.0 aus Mitteln des BMBF (01PL17033)
Dieses Digitale Skript von Niels Schwab, Universitätskolleg 2.0 / Lehrlabor, Universität Hamburg, ist lizenziert unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 4.0 International Lizenz.
Universität Hamburg
Das elearn.js Template von Universität Hamburg ist lizenziert unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 4.0 International Lizenz
Niels Schwab
RLab - Skriptbasierte modulare Umweltstatistik (Universitätskolleg 2.0)
Universität Hamburg
CC BY-SA 4.0| 2017 - 2019
In diesem Digitalen Skript erfährst Du, wie eine R-Funktion aufgebaut ist und was bei der Verwendung generell zu beachten ist. Das wird anhand sehr einfacher Beispiel-Funktionen beschrieben, die Inhalte lassen sich aber ohne weiteres auf komplexere übertragen.
Diese einfachen Funktionen sind sogenannte ,,built-in"-Funktionen, das heißt sie sind in ein R-Package fertig verwendbar integriert. Mit R lassen sich auch sehr einfach neue Funktionen, passend zur individuellen Fragestellung, selbst erstellen. Diese R-Nutzung für Fortgeschrittene wird in einem RLab-Kurs thematisiert.
Voraussetzung: Gut ist, wenn Du R und RStudio installiert hast, damit Du die hier dargestellten Beispiele selbst in R ausprobieren und so am besten nachvollziehen kannst.
Mit einer R-Funktion und ihren Argumenten wird angegeben, was R wie machen soll.
Eine R-Funktion setzt sich meistens aus dem Namen der Funktion und Argumenten zusammen. Die Argumente sind die Berechnungsgrundlage für die Funktion. Argumente können sein:
Das kann in der Praxis so aussehen:
Mit der Funktion paste()
lassen sich Zeichenketten, also z.B. einzelne Wörter
zusammenfügen (,,verketten”).
Der Name der Funktion ist also ,,paste” und die Argumente werden in der Klammer, die immer nach dem Namen der Funktion kommt, eingefügt.
Die generelle Struktur einer Funktion ist also
Funktion(Argumente)
und speziell im Fall der Funktion ,,paste”
paste(Argumente)
Hast Du Fragen?
Stelle sie als Kommentar - das RLab-Team (oder andere Lernende) antworten!
Welche Argumente können in der Klammer angegeben werden?
Da mit paste()
Zeichen zusammengefügt werden können, sind diese Zeichen ein Argument
der Funktion und werden in die Klammer geschrieben.
Um die Wörter ,,Ich”, ,,liebe” und ,,R” zusammenzufügen, werden diese als Argument angegeben.
Aber wie geht das? Verschiedene Möglichkeiten liegen auf der Hand - zum Beispiel:
paste("Ich", "liebe" und "R")
oder
paste(Ich,liebe,R)
oder
paste(Ich liebe R)
oder ....?
Hast Du Fragen?
Stelle sie als Kommentar - das RLab-Team (oder andere Lernende) antworten!
Welche Argumente eine R-Funktion beinhaltet und welche Standardwerte für die Argumente definiert
sind, kannst Du Dir mit der Funktion args()
anzeigen lassen:
args(paste)
... führt zu folgender Ausgabe, deren Inhalt etwas weiter unten erklärt wird:
function (..., sep = " ", collapse = NULL)
NULL
Ausführlichere Informationen, welche Argumente es für eine Funktion gibt und wie sie in die R
Console geschrieben werden, damit sie richtig funktionieren, finden sich im Hilfe-Text, den es zu
jeder R-Funktion gibt. Diese kannst Du durch Eingabe von ,,paste” in das entsprechende
Feld des Hilfe-Tabs in RStudio aufrufen oder indem Du ?paste
in die Console eingibst.
Die Hilfe zu paste()
sieht so aus:
Als Überschrift des Hilfetexts wird angegeben, was die Funktion macht, in diesem Fall ,,Concatenate Strings” - übersetzt ,,Zusammenfügen von Zeichenketten”.
Die wichtigsten Infos zur Verwendung der Argumente einer Funktion findest Du in den Abschnitten ,,Usage” und ,,Arguments”. Der weitere Aufbau einer Hilfe-Funktion und deren Verwendung wird detailliert im Digitalen Skript R-Hilfe in- und außerhalb von R behandelt.
Unter ,,Usage” wird im Hilfetext der paste()
-Funktion
neben der Funktion paste()
auch gleich die Funktion paste0()
aufgelistet,
die der paste()
-Funktion sehr ähnlich ist. Hinter paste
werden in der
Klammer alle möglichen Argumente aufgeführt, die für die Funktion angegeben werden können. Das sind
in diesem Fall:
Die Argumente werden durch Kommata von einander getrennt. Hinter den Argumenten sind Werte
angegeben, die als Standard für das Argument voreingestellt sind. Das ist hier bei sep
zum Beispiel '' '' (ein Leerzeichen) und bei collapse ,,NULL”
Was die einzelnen Argumente bewirken und welche Werte Du ihnen geben kannst, wird im Abschnitt ,,Arguments” der Hilfe aufgelistet:
Hier stehen zunächst die drei Punkte ...
. Die folgende englische Erklärung bedeutet,
dass es sich um einen Platzhalter handelt, an dessen Stelle die Objekte, die zusammengefasst werden
sollen, eingefügt werden. Wie genau diese angegeben werden können, wird in diesem Fall weiter unten
im Hilfetext und den Beispielen erklärt. Im einfachsten Fall werden die Zeichen in Anführungszeichen
gesetzt und mit Kommata voneinander getrennt:
”Ich”,”liebe”,”R”
paste("Ich","liebe","R")
Als nächstes wird das Argument sep
erklärt: Der Text dazu sagt, dass
sep
verwendet wird, um das oder die Zeichen anzugeben, die verwendet werden sollen, um
die einzelnen, zusammenzufassenden Textteile zu trennen. Ohne Trennung käme zum Beispiel
,,IchliebeR” heraus - besser wäre in diesem Fall, die Wörter durch Leerzeichen zu
trennen. Das Trennzeichen wird hinter sep=
innerhalb der Anführungszeichen angegeben.
In diesem Fall ist die Standardeinstellung das Leerzeichen: Innerhalb der Anführungszeichen
befindet sich ein Leerzeichen und nicht, wie es auf den ersten Blick wirken mag
,,Nichts”. ,,Nichts” würde so aussehen ''''
- also zwei
Anführungszeichen direkt hintereinander.
Da das Leerzeichen die Standardeinstellung ist, wird für
paste("Ich","liebe","R")
das gleiche wie für
paste("Ich","liebe","R",sep=" ")
ausgegeben:
[1] "Ich liebe R"
Eine andere Ausgabe erhältst Du mit:
paste("Ich","liebe","R",sep=" / ")
Die Ausgabe sieht so aus, da für sep
ein Schrägstrich /
eingesetzt
wurde:
"[1] Ich / liebe / R"
Zur Erinnerung: R ist ,,case sensitiv" – das heißt R unterscheidet Groß- und Kleinschreibung und interpretiert ,,Paste" als etwas anderes als ,,paste", auch ,,PASTE" wäre für R etwas ganz anderes. Nur ,,paste()" – komplett kleingeschrieben – wird von R als die von uns gewünschte ,,Verkettungs-Funktion" interpretiert. Funktionsnamen werden meistens komplett kleingeschrieben, aber wie immer gibt es auch hier Ausnahmen.
Hast Du Fragen?
Stelle sie als Kommentar - das RLab-Team (oder andere Lernende) antworten!
Das dritte Argument der paste()
-Funktion lautet collapse
und als
Standard-Wert ist ,,NULL” angegeben.
Das
collapse
-Argument kann verwendet werden, um auf einer ,,zweiten Ebene” Trennzeichen anzugeben. Wenn zum Beispiel in einem komplizierteren Fall als ,,Ich liebe R” Zeichen aus zwei verschiedenen Gruppen zusammengefasst werden sollen, könnte damit definiert werden, wie die ursprünglich aus den unterschiedlichen Gruppen stammenden Zeichen getrennt werden und wie mit Zeichen, die aus der gleichen Gruppe stammen, verfahren wird. Der Standard-Wert ,,NULL” bedeutet, dass R das Argument nicht benutzt - genau richtig in diesem einfachen Fall.
Es gibt also Argumente, die Standardwerte haben. Diese brauchen nicht zwingend angegeben werden - ohne Angabe werden die Standardwerte verwendet, ohne dass es zu einer Fehlermeldung kommt. Andere Argumente müssen zwingend angegeben werden - ansonsten kommt es zu Fehlermeldungen. Das würde z.B. bei
paste( ,sep=",",collapse=NULL)
passieren. Hier fehlt das ...
-Argument, R weiß nicht, was zusammengefügt werden soll
und meldet das als Fehler.
Hast Du Fragen?
Stelle sie als Kommentar - das RLab-Team (oder andere Lernende) antworten!
Die meisten Funktionen haben sehr viele Argumente. Bei diesen Funktionen ist es aber ähnlich wie
bei paste()
so, dass die meistens Argumente Standardeinstellungen besitzen, so dass nur
wenige Argumente angegeben werden müssen, um ein Ergebnis und keine Fehlermeldung zu erhalten.
Allerdings sei vor der ,,blinden” Verwendung der Standardeinstellungen gewarnt. Du
solltest immer schauen, ob die für Deine Rechnung tatsächlich Sinn machen und zusätzlich das
Ergebnis kritisch prüfen.
Ein Beispiel für eine einfache Funktion, die dennoch viele Argumente hat, ist read.table()
. Hier können mittels einer Vielzahl von Argumenten genau angegeben werden, wie eine
einzulesende Datei aufgebaut ist. Ob das Einlesen ohne Veränderung der Standardwerte wie gewünscht
geklappt hat, kannst Du in diesem Fall leicht überprüfen, indem Du Dir die Tabelle nach dem Einlesen
in R anzeigen lässt, Spalten- und Zeilenbeschriftungen prüfst usw.
Hast Du Fragen?
Stelle sie als Kommentar - das RLab-Team (oder andere Lernende) antworten!
Ein weiteres Beispiel für eine einfache Funktion mit wenigen Argumenten ist die Funktion
rnorm()
. Der Hilfetext zu rnorm()
ist ähnlich wie bei paste()
mit anderen verwandten Funktionen zusammengefasst. Mit rnorm()
kann eine zufällige,
normalverteilte Zahlenreihe erzeugt werden. Dabei können mit den Argumenten die Anzahl der Zahlen,
der arithmetischer Mittelwert und die Standardabweichung der normal verteilten Zahlenreihe festgelegt
werden.
Diese Argumente sind
n
für die Anzahl der Zahlen, die erzeugt werdenmean
für die Angabe des Mittelwerts der Zahlenreihe undsd
für die Angabe der Standardabweichung.In der Hilfe kannst Du sehen, dass es für mean
und sd
Standardwerte
gibt (,,0” für mean, ,,1” für sd):
Zum Erzeugen von zehn normal verteilten Zahlen mit dem Mittelwert 5 und der Standardabweichung 2 kannst Du in die R-Console also
rnorm(10, mean = 5, sd = 2)
eingeben.
Das Ergebnis kann so aussehen – 10 zufällige Zahlen mit dem Mittelwert 5 und der Standardabweichung 2:
Den gleichen ,,Rechenauftrag” kannst Du R durch folgende Eingabe erteilen:
rnorm(10,5,2)
Die Ergebnisse hier und im folgenden sind sich nur ähnlich, aber nicht exakt gleich, da
rnorm()
zufällige Zahlen erzeugt, die bei jeder Ausführung zufällig neu erzeugt werden.
Es ist also nicht unbedingt erforderlich, die Namen der Argumente mit einzugeben, wenn die Reihenfolge der Argumente so, wie sie in der Dokumentation der Funktion angegeben sind, eingehalten wird.
Von einer so starken Verkürzung ist allerdings abzuraten, da schon bei wenig anspruchsvolleren Funktionen damit zu rechnen ist, dass etwas durcheinander kommt und selbst bei solchen einfachen Funktionen wie ,,rnorm()” die Lesbarkeit und das Verständnis des Codes für andere und mit etwas zeitlichem Abstand für einen selbst verschlechtert wird.
Üblich ist es allerdings durchaus, das erste Argument ohne den Namen anzugeben. Also, so wie hier schon praktiziert, nicht
rnorm(n = 10, mean = 5, sd = 2)
sondern
rnorm(10, mean = 5, sd = 2)
Solange die Namen der Argumente mit angegeben werden, ist die Reihenfolge nicht relevant:
rnorm(10, mean = 5, sd = 2)
ist der gleiche Rechenauftrag wie
rnorm(10, sd = 2, mean = 5)
Funktionieren wird auch
rnorm(sd = 2, mean = 5, n = 10)
Hast Du Fragen?
Stelle sie als Kommentar - das RLab-Team (oder andere Lernende) antworten!
Bis jetzt hatte die Beispielfunktion rnorm()
,,eine” Klammer, genauer
gesagt eine ,,Klammer auf” und eine ,,Klammer zu”. Es können aber auch mehr
Klammern vorkommen: Wenn innerhalb einer Funktion eine weitere Funktion verschachtelt eingebaut wird
oder wenn der Wert eines Arguments z.B. mit einem Vektor angeben wird.
Das könnte so aussehen, wenn Du in einem Schritt die zufällig normal verteilten zahlen erzeugen
und mit der Funktion mean()
den Mittelwert berechnen möchtest:
mean(rnorm(10000, mean=5, sd = 0.5))
Ein anderes Beispiel ist ein Fall, beim dem eine Zahlenreihe angegeben wird, die mit der Funktion
round()
auf eine bestimmte Anzahl Stellen hinter dem Komma gerundet werden soll. In
diesem Fall werden die Zahlen 1.1, 2.1, 3.1, 4.1 und 5.1 zunächst mit c()
,,kombiniert” und dann gerundet:
round(c(1.1,2.1,3.1,4.1,5.1),0)
Kommen in einer Funktion mehrere Klammern vor, ist immer darauf zu achten, dass alle Klammern, die aufgemacht werden auch wieder geschlossen werden. RStudio hilft dabei, da es offene Klammern mit einer roten Unterstreichung markiert.
Dennoch kann es nicht ganz einfach sein, die richtige Stelle zu finden, an der eine Klammer geschlossen werden sollte. Mit der Zeit wird hier aber Erfahrung helfen. Am Anfang kannst Du es Dir einfach machen und auf ,,Verschachtlungen” verzichten. Statt dessen kannst Du Zwischenergebnisse einzeln in Objekten speichern und dann die Variablen in die Funktion einfügen. Zum Beispiel so:
Hast Du Fragen?
Stelle sie als Kommentar - das RLab-Team (oder andere Lernende) antworten!
Argumente werden durch Kommata voneinander getrennt. Ähnlich wie bei den Klammern können auch zu viele oder zu wenige Kommata oder an falscher Stelle stehende Kommata Fehler verursachen. Auch hier hilft RStudio durch entsprechende Markierungen im Skript, Fehler zu vermeiden. Es gibt nur sehr seltene Fälle, wo vor oder hinter einem Komma kein Argument oder Wert kommt. Folgende Zeichenfolgen kommen so gut wie nie vor:
,)
(,
, ,
Hast Du Fragen?
Stelle sie als Kommentar - das RLab-Team (oder andere Lernende) antworten!
Viel Spaß mit RLab!
Bisher ging es um sogenannte ,,built-in"-Funktionen, also mit der R-Grundinstallation oder weiteren R-Packages mitglieferte, fertige Funktionen. Eine der größten Stärken von R ist, dass sich Funktionen passend zu einer individuellen Aufgabenstellung
lassen. Mit diesen Maßnahmen können eigene Ideen, sich häufig wiederholende Anwendungen,
spezielle Rechenschritte oder einfach eine idividuelle Kombination von Standard-Rechenschritten
effizient und mit kurzen Code-Blöcken realisieren. Eine einfache Kombination von zwei Funktionen
hast Du bereits kennen gelernt: Die Integration der Funktion c()
(combine) in die
Funktion round()
:
round(c(1.1,2.1,3.1,4.1,5.1),0)
Weitere Infos zu diesem Thema
- Quick-R: User-written Functions (englischsprachig)
- Wikibooks: R Programming/Working with functions (englischsprachig)
- Wie sich der Code von R-Funktionen anzeigen lässt, zum Beispiel als Ausganspunkt für eigene Modifikationen, ist im Hilfe-Portal Stack Overflow ausführlich beschrieben (englischsprachig).
RLab-Kurs ,,Funktionen – Erstellen und Erweitern"
Im RLab-Kurs Funktionen – Erstellen und Erweitern (Kurs als Jupyter-Notebook) kannst Du direkt im Browser R-Funktionen selbst erstelllen bzw. erweitern.
Nun kannst Du prüfen, ob Du die wichtigsten Inhalte dieser Einheit verstanden hast:
(Es können pro Frage mehrere Antworten korrekt sein.)
Hast Du Fragen?
Stelle sie als Kommentar - das RLab-Team (oder andere Lernende) antworten!
Viel Spaß mit RLab!