Fehlermeldungen

Verstehen und Hilfe finden

Table of Contents


Einleitung

Beim Arbeiten mit R wird es früher oder später einmal dazu kommen, dass wir in der Konsole eine Fehlermeldung ausgegeben bekommen.

Generell kann man in R drei verschiedene Meldungen (Conditions) erhalten:

Wir konzentrieren uns in diesem Abschnitt auf ersteres, also Fehlermeldungen, die unsere Arbeit in R anhalten lassen und nach einer Lösung verlangen.

Fehlermeldungen können unterschiedliche Ursachen haben. Häufig sind es Tipp- oder Syntaxfehler, aber auch Probleme mit Datentypen (z.B. eine Funktion erfordert einen anderen als den genutzen Datentyp) und Paketen (z.B. Vergessen des Einladen eines Paketes vor der Benutzung der enthaltenen Funktionen) kommen häufiger vor.

Fehlermeldungen sind häufig nicht einfach zu verstehen. Das liegt u.a. daran, dass EntwicklerInnen von Paketes jeweils eigene Fehlermeldungen für die enthaltenen Funktionen formulieren. Deswegen folgen diese zumeist keinem einheitlichen Muster und sind teils schwer zu verstehen.

Im Folgenden schauen wir uns an einigen konkreten (Syntax-)Fehlermeldungen an, wie man diese verstehen kann. Danach schauen wir uns an, wie man die R-Dokumentation und Suchmaschinen sinnvoll nutzt, um Fehler zu beheben.

Beispieldatensatz für dieses Kapitel

Für das vorliegende Kapitel werden wir uns einen kleinen Datensatz generieren, mit dem wir arbeiten werden.


# Matrix erstellen
daten <- matrix(c(0, 1, 3, 2, 2, 
                 3, 2, 0, 3, 1, 
                 3, 0, 1, 3, 1,
                 1, 2, 1, 0, 3), nrow = 5, ncol = 4)

# in Dataframe umwandeln
daten <- data.frame(daten)

# Spalten benennen
colnames(daten) <- c("Var_1", "Var_2", "Var_3", "Var_4")

  Var_1 Var_2 Var_3 Var_4
1     0     3     3     1
2     1     2     0     2
3     3     0     1     1
4     2     3     3     0
5     2     1     1     3


1. (Häufige) Fehlermeldungen verstehen

Schauen wir uns einmal den typischen Aufbau von Fehlermeldungen an:

Fehler in cor.test.default(daten[1:2], daten[3:4]) :
'x' muss ein numerischer Vektor sein

Die Information vor dem Doppelpunkt gibt uns an, in welcher Funktion der Fehler steckt; die Information nach dem Doppelpunkt gibt Aufschluss über die Art des Fehlers. Zweiteres ist für die Fehlersuche (zumeist) von großer Bedeutung.

Im Folgenden schauen wir uns eine Art von Fehlern an, mit der vor allem AnfängerInnen häufig konfrontiert sind.

Syntaxfehler

Syntaxfehler sind Fehler, die durch eine Verletzung des formalen Aufbaus einer Funktion zustande kommen. Manchmal entstehen sie auch nur durch Vertippen.

Syntaxfehler können zumeist relativ einfach durch Korrigieren der fehlerhaften Syntax, i.d.R. dem Einfügen oder Entfernen von bestimmten Zeichen, zumeist Kommata oder Klammern, gelöst werden.

Bevor wir uns dem Verstehen von konkreten (Syntax-)Fehlermeldungen widmen, schauen wir uns noch zwei zusätzlich von der Benutzeroberfläche RStudio gegebene Hinweise (die keine Fehlermeldungen sind) an.

Hinweis im Skript

Schon vor Ausführen der Funktion erhält man Hinweise (Breakpoints), wenn man einen Syntaxfehler hat. Dann erscheint ein kleines gelbes Dreieck mit Ausrufezeichen in der gleichen Zeile, in welcher auch der Fehler ist. Außerdem ist das fragwürdige Zeichen (das dritte Kommata) zusätzlich orange unterstrichen.

Wenn man mit der Maus über das Dreieck fährt, sieht man den Hinweis.

Achtung: Das Skript muss gespeichert sein, damit man diese Hinweise angezeigt bekommt.

Lösung: daten[c(1,2,3)] oder daten[c(1,2,4,3)]

Wir bekommen den Hinweis, dass das dritte Argument, welches nach dem zweiten Komma folgen sollte, leer ist. In Abhängigkeit davon, welche Spalten aus Daten extrahiert werden sollen löscht man das Komma (um Spalte 1, 2 und 3 zu extrahieren) oder man ergänzt einen weiteren Spaltenindex (z.B. 4; um Spalte 1, 2, 4 und 3 zu extrahieren).

Nach dieser Korrektur hätten wir in der Konsole noch eine Fehlermeldung bekommen. Wir haben data anstatt daten eingetippt. Wenn man versucht, die Funktionen data() als Objekte zu benutzen, bekommt man folgende Fehlermeldung: Objekt des Typs ‘closure’ ist nicht indizierbar.

Hinweis in der Konsole

Bei einem unvollständigen Befehl, wenn man am Ende einer Funktion die schließende Klammer vergessen hat, wird in der folgenden Zeile ein + ausgegeben.

Lösung: daten[,2]

Damit extrahiert man die zweite Spalte aus daten, welche in einer fortlaufenden Spalte ausgegeben wird. Auch der Name der Spalte (Variable) wird ausgegeben. Aber: Dafür muss das Objekt daten auch (mindestens) zwei Dimensionen haben, d.h. eine Matrix oder ein Data Frame sein.

Fehlermeldung in der Konsole

Wenn ein oder mehrere Zeichen überflüssig sind bzw. fehlen, dann bekommt man Unerwartete(s) '...' in "..." ausgegeben. Hierbei teilt uns die Meldung mit, wo der Fehler liegt: In den Anführungszeichen "..." wird nur ein Teil des Codes ausgegeben und der Fehler ist zumeist das zuletzt ausgegebene Zeichen (oder es liegt unmittelbar davor).

Lösung: daten[2]

Damit extrahiert man auch die zweite Spalte aus daten, aber hier wird der Name der Spalte (Variable) nicht mit ausgegeben. Außerdem werden die Elemente der Spalte zeilwenweise wiedergegeben.

Wenn mehrere Syntaxfehler enthalten sind, und man nicht gleich alle erkennt, muss man diese nach und nach beseitigen.

Lösung: daten[2]

Zuerst wurde nur auf das fehlerhafte $ hingewiesen. Nachdem dieses gelöscht wurde, wird erst auf das falsche ) verwiesen.

Manchmal bekommt man auch nur unerwartetes Symbol in: "..." ausgegeben. In den Anführungszeichen "..." wird hier nur der Teil des Codes ausgegeben, in dem der Fehler ist, nicht aber (wie oben), auch das problematische Zeichen.

Lösung: daten[,2] oder daten[2]

Hier wurde nicht bemerkt, dass bei der ersten Funktion daten[,2 noch ein ] fehlt und einfach schon die nächste Funktion daten[,3] ausgeführt. So nahm R an, dass beide zusammen gehören würden.

Wenn man Komma-Fehler hat, bekommt man beispielsweise folgende Meldung angezeigt.

Lösung: daten[c(1,2)] oder daten[c(1,2,3)]

Hier weist uns R darauf hin, dass das dritte Argument, welches nach dem zweiten Komma folgen sollte, leer ist. In Abhängigkeit davon, welche Spalten aus Daten extrahiert werden sollen, löscht man das Komma (um Spalte 1 und 2 zu extrahieren) oder man ergänzt einen weiteren Spaltenindex (z.B. 3; um Spalte 1, 2 und 3 zu extrahieren).


2. R-Dokumentation

Wenn man nicht aus der Fehlermeldung schlau wird, ist es hilfreich, sich den Aufbau der genutzten Funktion anzuschauen. Dazu kann man die R-Dokumentation, welche sich im unteren rechten Panel bei Help befindet, nutzen. In das Suchfeld gibt man den Namen der Funktion ein. Alternativ kann man wieder in der Konsole ein ? vor die Funktion schreiben und den Befehl ausführen. Mit Klick auf das eingekreiste Icon kann man sich die Hilfe-Seite auch in einem extra Fenster anzeigen lassen.

Hier finden wir zu den meisten Funktionen folgende hilfreiche Abschnitte:

Im Folgenden schauen wir uns die R-Dokumentation exemplarisch für die Funktion matrix() an. Dazu öffnen wir die dazugehörige R-Dokumentations-Seite, indem wir matrix in das Suchfeld (siehe Abb. oben) oder ?matrix in die Konsole eingeben. Folgende Seite sollte sich nun öffnen:

Description

Man findet hier zu einer Funktion bzw. einem Set an verwandten Funktionen kurze Ausführungen zum Zweck einer Funktion.

Die Funktion matrix erstellt eine Matrix von einem gegebenem Set an Werten. Es gibt noch zwei verwandte Funktionen - as.matrix und is.matrix - welche ein Objekt in eien Matrix umwandeln bzw. überprüfen, ob das übergebene Objekt eine Matrix ist.

Usage

Zuerst wird die Default-Funktion gezeigt. Diese zeigt, welche Argumente schon voreingestellte Werte haben.

Per default …:

Um Defaults besser zu verstehen, führen wir einfach matrix() in der Konsole aus und schauen uns den Output an.


     [,1]
[1,]   NA

Bis auf byrow=FALSE können wir so alle Voreinstellungen im Output nachvollziehen. Dessen Funktionsweise sieht man erst bei mehreren Elementen in einer Matrix.

Arguments

Argumente sind Einstellungen, die ich für eine Funktion festlegen kann. In der R-Dokumentation sieht man links den Namen des Arguments (z.B. byrow) und rechts eine Beschreibung dazu (z.B. logical) verbunden mit verschiedenen Einstellungsoptionen (z.B. FALSE - spaltenweise Befüllen der Matrix).

Details

Im Abschnitt Details stehen weitere Detailinformationen zur Nutzung der Funktion.

1. Abschnitt matrix: Wir erfahren hier, dass wenn nrow (Zeilenanzahl) oder ncol (Spaltenanzahl) nicht festgelegt wird, versucht wird, auf dessen Länge zu schließen. Das schauen wir uns mal an einem Beispiel an.


# Beispiel 1:
matrix(data=c(1,1,2,2,3,3,4,4,5,5), nrow=5)

     [,1] [,2]
[1,]    1    3
[2,]    1    4
[3,]    2    4
[4,]    2    5
[5,]    3    5

Wir haben einen Vektor mit 10 Elementen reingegeben und nrow=5 festlegt. Daraus kann R schließen, dass die Matrix zwei Spalten haben muss.

2. Abschnitt matrix: Wenn die Anzahl der Elemente, die wir an data übergeben, kleiner ist, als die Anzahl der gewünschten Elmente in Matrix (nrow x ncol), dann wird data recycled. Das bedeutet, dass data nochmal genutzt wird, um die Matrix zu befüllen. […]


# Beispiel 2:
matrix(data=c(1,1,2,2,3), nrow=3, ncol=2)

     [,1] [,2]
[1,]    1    2
[2,]    1    3
[3,]    2    1

Es lohnt sich bei Schwierigkeiten mit Funktionen im Abschnitt Details nachzuschauen. Oftmals findet man hier hilfreiche weiterführende Informationen.

See also

In diesem Abschnitt bekommt man Funktionen angezeigt, die mit der vorliegenden Funktion in enger Verbindung stehen. Diese sind häufig mit einer kurzen Erklärung versehen.

Teilweise findet man hier Funktionen, die besser für das eigene Vorhaben geeignet sind.

Examples

Hier findet man einige beispielhafte Anwendungen der Funktion. Anhand der Beispiele bekommt man ein besseres Verständnis von der Syntax und Funktionsweise der Funktion. Was genau gemacht wird ist oftmals in kurzen Kommentaren (# ...) erklärt.


3. Suchen im Internet

Nun gibt es auch Fehlermeldungen, die man nicht so einfach versteht. Dafür kann es vielfältige Ursachen geben. Wenn man schon in der R-Dokumentation nachgeschaut hat und trotzdem noch ratlos ist, kann man im Internet nach Hilfe suchen. Man kann dafür Suchmaschinen nutzen oder in speziellen Foren suchen.

Hierbei gibt es nicht den einen Weg, fündig zu werden. Häufig gibt es eine Fehlermeldung, die bei verschiedenen Problemen (mit unterschiedlichen Funktionen) angezeigt wird. Dann muss man filtern, welche Seite für das eigene Anliegen relevant sein könnte. Es kann ebenso möglich sein, dass es zu manchen Problemen einfach noch keine Lösung gibt. Dieser Fall ist eher seltener und tritt vor allem bei neueren oder seltener genutzen Paketen auf.

Im Folgenden schauen wir uns einige wichtige Aspekte an, auf die man achten sollte, wenn man im Internet nach Lösungen zu Fehlermeldungen sucht.

Dafür schauen wir uns folgendes Beispiel an: Wir wollen eine Korrelationstabelle erstellen, in der wir aus daten die ersten beiden ([1:2]) Spalten mit den letzten beiden Spalten ([3:4]) korrelieren. Dazu wurde die Funktion cor.test() genutzt. Wir bekommen folgende Fehlermeldung:

a) Passende Suchbegriffe nutzen

Sinnvoll ist es im Suchtext drei Aspekte miteinzubeziehen:

Unsere Suche könnte folgendermaßen aussehen:

b) Ergebnisse filtern

Nachfolgend sehen wir die ersten fünf Ergebnisse der Suche.