21  Fehlermeldungen

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: 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. Laden des Paketes einer Funktion vergessen) 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 gehen wir uns zuerst darauf ein, welche Hilfe uns RStudio gibt, um Fehler zu vermeiden. Anschließend schauen wir uns an einigen konkreten (Syntax-)Fehlermeldungen an, wie man diese verstehen kann. Danach lernen wir, wie wir Suchmaschinen sinnvoll nutzen können, um Lösungen für unsere Fehlermeldungen zu finden.

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

21.1 Tools die uns helfen, Fehler zu vermeiden

Bevor wir uns dem Verstehen von konkreten (Syntax-)Fehlermeldungen widmen und anschauen, wie wir effizient im Internet suchen können, schauen wir uns zwei Hilfsmittel an, die uns die Entwicklungsumgebung RStudio gibt, um Fehler zu vermeiden.

21.1.1 R-Dokumentation

Wenn wir eine uns noch unbekannte Funktion nutzen (aber auch wenn wir aus einer Fehlermeldung nicht schlau werden) können wir die Dokumentation nutzen. Diese können wir in RStudio im unteren rechten Panel unter Help öffnen. In das Suchfeld geben wir den Namen der Funktion ein.

Alternativ können wir die Hilfefunktionen ? oder help() nutzen (z.B. ?matrix oder help(matrix)).

Mit Klick auf das eingekreiste Icon kann man sich die Hilfe-Seite auch in einem extra Fenster anzeigen lassen.

Wir bekommen hier (zumeist) folgende Informationen: aus welchem Paket die Funktion ist (oben links in { }), was die Funktion macht (Description), die Funktionsdefinition ggf. mit Defaults (Usage), ihre Parameter mit jeweils gültigen Argumenten (Arguments), weitere Details zur Nutzung (Details), ähnliche Funktionen (See also) und Beispiele zur Nutzung (Examples).

Was sind Parameter, Argumente und Defaults?

Parameter bezeichnet die (formalen) Variablen einer Funktion (z.B. nrow aus matrix()), denen wir unsere (tatsächlichen) Argumente (z.B. 3), d.h. unseren Input, übergeben. Default bezeichnet ein voreingestelltes Argument (z.B. nrow=1).

Ohne explizite Spezifikation des Parameters unsererseits wird (wenn vorhanden) der Default verwendet. Wir könnten natürlich auch ein anderes (als das voreingestellte) Argument festlegen.

Funktionen, die ausschließlich Parameter mit Defaults besitzen, (z.B. matrix()) werden auch ohne Spezifikation ausgeführt. Funktionen mit (min. einem) Parameter ohne Default (z.B. mean()) werden ohne Spezifikation dieser nicht ausgeführt (wir müssen dem Parameter x einen Vektor, von dem wir den Mittelwert berechnen wollen, übergeben). Mehr Informationen zu Funktionsdefinition und etwaigen Defaults finden wir im Abschnitt Usage in der R-Dokumentation.

Mehr Informationen zum Aufbau von Funktionen finden wir in der Einführung in R

Eine detaillierte Einführung zur Nutzung der Dokumentation befindet sich im Kapitel Einführung in R Studio.

21.1.2 Code Diagnostik

Achtung: Wir können die Code Diagnostik nur nutzen, wenn wir unser Skript gespeichert haben.

Vor Ausführung unseres Codes erhalten wir Hinweise, beispielsweise wenn Argumente einer Funktion fehlen oder unerwartete Zeichen auftauchen.

Der Fehler wird unterstrichen und es erscheint außerdem ein Symbol links neben der Zeilennummerierung. Zusätzlich erhalten wir einen ausformulierten Hinweis, wenn wir mit der Maus über das Symbol fahren.

Lösung

Das dritte Argument, welches nach dem zweiten Komma in c() folgen sollte, ist leer. In unserem Beispiel sind die Argumente von c() Zahlen (zur Indexierung der Spalten vom Dataframe daten). Wenn wir die Spalten 1, 2 und 3 extrahieren wollten, würden wir das überflüssige Komma löschen: daten[,c(1,2,3)]


Lösung Unser Code endet mit einer schließenden runden Klammer, welche kein öffnendes Pendant hat. Außerdem hat unsere öffnende eckige Klammer kein abschließendes Pendant. Wahrscheinlich haben wir uns vertippt und anstatt einer schließenden eckigen Klammer eine schließende runde Klammer eingefügt. So würde der richtige Code aussehen: daten[,c(1,2,3)]


Auf dieser Seite wird die Möglichkeiten der Code Diagnostics noch detaillierter erklärt und wir erhalten eine Anleitung dazu, wie wir verschiedene Einstellungen tätigen können (in der oberen Menüleiste über Tools > Global Options > Code > Diagnostics).

21.2 Fehlermeldungen verstehen

Schauen wir uns einmal den typischen Aufbau von Fehlermeldungen an:

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 konzentrieren wir uns auf eine Art von Fehler, 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.

Schauen wir uns nun einige Beispiele an:

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

z.B. 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

z.B. 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

z.B. 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

z.B. 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).

21.3 Suchen im Internet

Nun gibt es auch Fehlermeldungen, die wir nicht auf Anhieb verstehen. Dafür kann es vielfältige Ursachen geben. Wenn wir schon in der R-Dokumentation nachgeschaut haben und trotzdem noch ratlos sind, können wir im Internet nach Hilfe suchen. Wir können dafür Suchmaschinen oder direkt spezielle Foren nutzen.

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 Spalten [1:2] mit den letzten beiden Spalten [3:4] korrelieren. Dazu wurde die Funktion cor.test() genutzt. Wir bekommen folgende Fehlermeldung:

21.3.1 Passende Suchbegriffe nutzen

Sinnvoll ist es im Suchtext drei Aspekte miteinzubeziehen:

  • das Programm, mit dem es Probleme gibt
  • die Funktion, mit der es Probleme gibt
    • auch ersichtlich an der Information vor dem Doppelpunkt
  • Ausschnitte aus der Fehlermeldung
    • von den Informationen nach dem Doppelpunkt

Unsere Suche könnte folgendermaßen aussehen:

Anstatt eine globale Suchmaschine wie google oder ecosia zu nutzen, kann man auch eine spezifisch für Anliegen in R konzipierte Suchmaschine wie rseek nutzen. Dann kann man im Suchtext den Namen des Programms weglassen, beispielsweise nur cor.test x numerischer Vektor suchen.

21.3.2 Ergebnisse filtern

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

Mit Ausnahme des zweiten Links sieht es so aus, als würden die Seiten zu unspezifisch für unser Problem sein.

Der zweite Link weist gleich zwei Übereinstimmungen auf: Wir wollten einen correlation test rechnen und haben die selbe Fehlermeldung (‘x’ must be a numeric vector) bekommen.

Schauen wir uns also das zweite Ergebnis an.

21.3.3 Lösungsvorschläge ausprobieren

In Foren findet man in aller Regel oben die Problembeschreibung und darunter die geposteten Lösungsvorschläge.

In unserem Beispiel, hat der/die Fragende mit der gleichen Funktion (cor.test()) gearbeitet.

Schauen wir uns den Lösungsvorschlag an: Es wird vorgeschlagen den Datensatz mit str() zu überprüfen, ob die enthaltenen Variablen numerische Vektoren sind. Wenn dem nicht so ist, muss man sie dementsprechend umwandeln.

str(daten)
'data.frame':   5 obs. of  4 variables:
 $ Var_1: num  0 1 3 2 2
 $ Var_2: num  3 2 0 3 1
 $ Var_3: num  3 0 1 3 1
 $ Var_4: num  1 2 1 0 3

Bei uns scheinen alle Spalten numerisch (num) zu sein. Diese Lösung scheint also nicht passend für unser Problem zu sein.

21.3.4 Zurück zu b) Ergebnisse filtern und c) Lösungsvorschläge ausprobieren

Gehen wir also zurück zu unserer Suche und schauen uns andere Seiten an. So sehen die nächsten fünf Ergebnisse der Suche aus.

Bis auf den zweiten Link sehen die Vorschläge hier auch wieder sehr unspezifisch aus. Bei diesem gibt es zwei Parallelen zu unserem Problem: cor.test wird auf einen data frame angewendet. Sehen wir uns die Seite mal an.

Wir landen in einem Foreneintrag. Die Antwort von dasonk weißt uns darauf hin, dass man an cor.test() nur zwei Vektoren übergeben kann. Wir haben aber 4 Vektoren übergeben. In der nächsten Antwort von anbende wird vorgeschlagen, die Korrelationstabelle mit cor() zu erstellen. Allerdings muss man die Signifikanztestung immer noch mit cor.test() machen.

Die Antwort hat uns schon weitergeholfen: Wir haben eine Vorstellung davon, wo der Fehler liegen könnte. Jetzt ist es sinnvoll, eine neue Suche zu starten, um nach einer Funktion zu suchen, die sowohl eine Korrelationstabelle erstellt, als auch eine Signifikanztestung durchführt.

Hier kombinieren wir Suchwörter zum Programm und zu dem, was die Funktion, die wir suchen, leisten soll.

Dann schauen wir uns wieder die ersten 5 Vorschläge dazu an:

Der erste Vorschlag ist nicht ganz das, was wir wollen. Hier geht es scheinbar mehr um elegante Korrelationstabellen.

Der zweite Vorschlag hingegen scheint vielversprechender. Schauen wir uns diesen einmal an.

Es ist eine Seite, auf der verschiedene Aspekte der Umsetzung von Korrelationstabellen in R erklärt werden. Oben finden wir eine Gliederung. Wir springen gleich zum Punkt ‘Correlation matrix with significance levels (p-value)’.

Hier erfahren wir, dass man die Funktion rcorr() aus dem Hmisc-Paket nutzen kann. Außerdem wird man darauf hingewiesen, dass diese Funktion nur mit Matrizen arbeiten kann. Der Befehl, mit dem man Objekte in Matrizen umwandeln kann, wird auch angegeben.

Probieren wir diesen Weg einmal aus.

# install.packages("Hmisc")
library(Hmisc)
rcorr(as.matrix(daten[1:2]), as.matrix(daten[3:4]))
      Var_1 Var_2 Var_3 Var_4
Var_1  1.00 -0.74 -0.29 -0.04
Var_2 -0.74  1.00  0.66 -0.44
Var_3 -0.29  0.66  1.00 -0.69
Var_4 -0.04 -0.44 -0.69  1.00

n= 5 


P
      Var_1  Var_2  Var_3  Var_4 
Var_1        0.1528 0.6309 0.9510
Var_2 0.1528        0.2279 0.4616
Var_3 0.6309 0.2279        0.2006
Var_4 0.9510 0.4616 0.2006       

Wir erhalten zwei Matrizen als Output. Eine enthält die Korrelationen, die andere die p-Werte. Wir haben also gefunden, wonach wir gesucht haben.

21.4 Und wenn man keine Lösung gefunden hat?

Wenn man im ersten Durchlauf nichts gefunden hat, ist es beispielsweise sinnvoll, andere Ausschnitte aus der Fehlermeldung in den Suchtext zu inkludieren.

Manchmal ist ein Fehler so global, dass er bei verschiedenen Funktionen auftaucht. Daher lohnt es sich manchmal auch, eine Suche ohne den Funktionsnamen durchzuführen. Spätestens, wenn man bei der Suche mit allen drei Suchbegriffen nichts gefunden hat, ist es sinnvoll, nur mit Programm + Fehlermeldung zu suchen.

Wir können auch auf allgemeine Tipps zum Suchen im Internet zurückgreifen, u.a.:

  • mit Zitaten exakte Phrasen suchen
    • z.B. “Fehler in cor.test.default”
  • alternative Begriffe suchen (logische Operatoren)
    • AND ist der Default wenn wir mehrere Wörter eingeben
    • mit OR (oder |) können wir mehrere Optionen angeben z.B. “cor.test | cor.test.default”
  • aus- bzw. einschließen von Wörtern
    • vor allem in Kombination mit Zitaten ist dieses Tool sehr nützlich
    • ausschließen z.B. “Fehler in cor.test.default” -str()
    • einschließen z.B. “Fehler in cor.test.default +r

Ein weiterer Tipp ist es, auf Englisch zu suchen. Die Wahrscheinlichkeit ist hier viel größer, dass man Lösungsvorschläge findet.

Wenn man, wie in diesem Kapitel zu sehen, die Fehlermeldungen auf deutsch ausgegeben bekommt, kann man das folgendermaßen auf englisch ändern:

Sys.setenv(LANGUAGE="en")

21.5 Weiterführende Hilfe

Ganz generell kann es sehr hilfreich sein, wenn man ein bisschen mit der Funktion “spielt” - etwas wegnimmt oder verändert - und schaut, ob es dann funktioniert oder wie sich die Fehlermeldung verändert. Das hilft meist, das Problem etwas einzugrenzen - und man lernt nebenbei die Funktion besser kennen.

Im R-Fehlermeldungsleitfaden der Uni Münster (unter 3. Fehlertextliste), auf R-bloggers sowie PROGRAMMINGR findet man jeweils eine Übersicht über geläufige Fehlermeldungen mit Lösungen und teilweise auch Beispielen.

Eine Einführung in weitere Möglichkeitens des Debuggings und der dafür in R eingebauten Tools finden wir auf Advanced R.

21.6 Automatische Suche mit dem Paket errorist

Es gibt das Paket errorist, mit dem bei jeder Fehler- und Warnmeldung eine automatische Suche in Google gestartet wird. Schauen wir uns die Funktionsweise des Pakets am im Abschnitt Suchen im Internet genutzten Beispiels an.

Zuerst installieren wir das Paket:

install.packages("errorist", dependencies=TRUE)

Dann laden wir das Paket und schauen uns an, was bei Ausführung unseres fehlerhaften Codes passiert.

library(errorist)
cor.test(daten[1:2], daten[3:4])

Sofort öffnet sich ein neues Fenster im Browser, in dem in Google folgender Text gesucht wird: “Fehler in cor.test.default(daten[1:2], daten[3:4]) : ‘x’ muss ein numerischer Vektor sein r programming”.

Das Paket übernimmt sozusagen den ersten Schritt bei der Suche im Internet, passende Suchbegriffe zu nutzen, für uns. Die Ergebnisse müssen wir nach wie vor alleine filtern, um eine geeignete Lösung zu finden.

Wenn wir uns den Aufbau des Suchtextes anschauen, sehen wir, dass die gesamte Fehlermeldung und “r programming” gesucht wird. In unserer manuellen Suche haben wir die gleichen Begriffe genutzt; wir haben lediglich nicht die gesamte Fehlermeldung genutzt, sondern daraus den Namen der Funktion und die eigentliche Fehlermeldung. Unser manueller Suchtext enthielt folglich weniger Wörter und generiert damit u.U. mehr Ergebnisse.

Ob ihr das Paket nutzen möchtet oder lieber analog sucht bleibt euch überlassen.


Um eine möglichst exakte Replikation der Funktionen zu gewährleisten gibt es im folgenden relevante Angaben zum System (R-Version, Betriebssystem, geladene Pakete mit Angaben zur Version), mit welchem diese Seite erstellt wurde.

sessionInfo()
R version 4.4.2 (2024-10-31)
Platform: x86_64-pc-linux-gnu
Running under: Ubuntu 24.04.1 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so;  LAPACK version 3.12.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

time zone: Etc/UTC
tzcode source: system (glibc)

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] Hmisc_5.2-0

loaded via a namespace (and not attached):
 [1] gtable_0.3.6      jsonlite_1.8.9    dplyr_1.1.4       compiler_4.4.2   
 [5] rpart_4.1.23      tidyselect_1.2.1  htmlTable_2.4.3   stringr_1.5.1    
 [9] gridExtra_2.3     cluster_2.1.6     scales_1.3.0      yaml_2.3.10      
[13] fastmap_1.2.0     ggplot2_3.5.1     R6_2.5.1          generics_0.1.3   
[17] Formula_1.2-5     knitr_1.49        backports_1.5.0   htmlwidgets_1.6.4
[21] checkmate_2.3.2   tibble_3.2.1      munsell_0.5.1     nnet_7.3-19      
[25] pillar_1.9.0      rlang_1.1.4       utf8_1.2.4        stringi_1.8.4    
[29] xfun_0.49         cli_3.6.3         magrittr_2.0.3    digest_0.6.37    
[33] grid_4.4.2        rstudioapi_0.17.1 base64enc_0.1-3   lifecycle_1.0.4  
[37] vctrs_0.6.5       data.table_1.16.2 evaluate_1.0.1    glue_1.8.0       
[41] fansi_1.0.6       colorspace_2.1-1  foreign_0.8-87    rmarkdown_2.29   
[45] tools_4.4.2       pkgconfig_2.0.3   htmltools_0.5.8.1

Für Informationen zur Interpretation dieses Outputs schaut auch den Abschnitt Replizierbarkeit von Analysen des Kapitels zu Paketen an.