R-Funktionen - Argumente, Klammern, Kommata kontrolliert einsetzen

Niels Schwab
RLab - Skriptbasierte modulare Umweltstatistik (Universitätskolleg 2.0)
Universität Hamburg
CC BY-SA 4.0| 2017 - 2019

Inhaltsverzeichnis

Ziel

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.

Was ist eine R-Funktion und wozu ist sie erforderlich?

Mit einer R-Funktion und ihren Argumenten wird angegeben, was R wie machen soll.

Aufbau Funktionen in R

Struktur einer R-Funktion

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:

  • Werte, mit denen gerechnet wird
  • Einstellungen, mit denen angegeben wird, wie gerechnet wird

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!

Funktions- Argumente

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!

Funktions-Argumente in der R-Hilfe

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:

Hilfe paste()-Funktion

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:

  • sep
  • collapse

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”

Erklaerung R-Funktion

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"

R_paste-Ausgabe

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!

Argumente mit Standard-Werten

Das dritte Argument der paste()-Funktion lautet collapse und als Standard-Wert ist ,,NULL” angegeben.

Hilfe paste()-Funktion

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.

R_paste-Fehler

Hast Du Fragen?

Stelle sie als Kommentar - das RLab-Team (oder andere Lernende) antworten!

Ein Beispiel mit vielen Argumenten

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.

R_read.table()_Hilfe

Hast Du Fragen?

Stelle sie als Kommentar - das RLab-Team (oder andere Lernende) antworten!

Relevanz der Reihenfolge der Argumente

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 werden
  • mean für die Angabe des Mittelwerts der Zahlenreihe und
  • sd 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):

R_rnorm_Hilfe

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:

R_rnorm_Ergebnis

Den gleichen ,,Rechenauftrag” kannst Du R durch folgende Eingabe erteilen:

rnorm(10,5,2)

R_rnorm_Ergebnis_kurz

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)

R_Reihenfolge_Argumente

Hast Du Fragen?

Stelle sie als Kommentar - das RLab-Team (oder andere Lernende) antworten!

Klammern

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.

RStudio_Fehleranzeige

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:

R_Runden

Hast Du Fragen?

Stelle sie als Kommentar - das RLab-Team (oder andere Lernende) antworten!

Kommata

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!

Funktionen selbst erstellen oder modifizieren

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

  • kombinieren,
  • verändern oder
  • vollkommen neu erstellen

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)

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.

Zusammenfassung

Nun kannst Du prüfen, ob Du die wichtigsten Inhalte dieser Einheit verstanden hast:

(Es können pro Frage mehrere Antworten korrekt sein.)

Was ist erforderlich, damit eine R-Funktion funktioniert?

140d8e3c5f62ca009ec565cfd9fd2c46 57f905d3105c3cc1006303f525b71422 473db40e0d4d430281f24ed0c91889b2

Welche Reihenfolge ist richtig?

b5ceb729a1b347aa357790e1588c88b3

Wie finden sich bei der Arbeit mit R am direktesten grundlegende Informationen zu den möglichen Argumenten einer Funktion?

24a42f2d46788980e4ebb995c23bf362

Müssen zur fehlerfreien Ausführung einer R-Funktion immer alle Argumnte aufgeführt werden?

7ee01aa828fe045bd2e7344fb08ad5a5

Ist die Reihenfolge der Argumente innerhalb der Klammern einer R-Funktion von Bedeutung?

1b19dd55ade121f85768db16df78078b 8ba22a80bd16dc7e35c2a76089062dde

Wie lassen sich Fehler durch fehlende oder zu viele Klammern und Kommata am einfachsten vermeiden bzw. finden? (Hier ist nur eine Antwort korrekt.)

1e4107b0ef5f6e5d03e26cbe08fb4f71

Hast Du Fragen?

Stelle sie als Kommentar - das RLab-Team (oder andere Lernende) antworten!

Viel Spaß mit RLab!