p_load(tidyverse,
janitor, here)
Error in p_load(tidyverse, janitor, here): could not find function "p_load"
Was tun, wenn etwas schief geht?
Daniela Palleschi
Humboldt-Universität zu Berlin
Mi. den 14.02.2024
Mo. den 27.05.2024
Die Ressourcen, die ich für dieses Kapitel verwendet habe, waren Abschnitt 3.6 “Troublshooting Error Messages” aus dem Webbuch R for Graduate Students von Wendy Huynh (2019), und Perkel (2023).
In diesem Kapitel werden wir lernen…
Das folgende Code-Stück gibt uns den ersten Fehler:
Error in p_load(tidyverse, janitor, here): could not find function "p_load"
Was ist das Problem mit dem obigen Code? Die Funktion p_load()
konnte nicht gefunden werden, weil sie aus dem Paket pacman
stammt, aber wir haben dieses Paket noch nicht geladen. Das ist der Grund, warum wir pacman::p_load()
schreiben, wenn wir unsere Pakete einladen.
Um die Funktion p_load()
zu benutzen, müssen wir angeben, dass sie aus dem Paket pacman
stammt, wie wir es in diesem Buch immer getan haben (oder wir könnten dieser Zeile library(pacman)
voranstellen).
Fehler- oder Warnmeldungen sind bei der Programmierung im Allgemeinen sehr häufig. Programmiersprachen sind sehr wortgetreu, sie versuchen normalerweise nicht zu erraten, was Sie wollen. Das bedeutet, dass selbst der kleinste Fehler Ihren Code zerstören kann. Es kann extrem frustrierend und demotivierend sein, wenn man solche Fehlermeldungen erhält. Es mag ein gewisser Trost sein zu wissen, dass jeder Fehler macht, sogar Profis. Mit zunehmender Erfahrung werden Sie lernen, Codefehler effizienter zu erkennen und zu beheben. Heute lernen wir einige Ressourcen kennen, die Ihnen auf diesem Weg helfen können.
RStudio erkennt in der Regel Syntaxfehler und teilt Ihnen vor der Ausführung Ihres Codes mit, ob Sie etwas übersehen haben. Das folgende Code-Stück gibt zum Beispiel eine Fehlermeldung aus.
Error: <text>:1:26: unexpected string constant
1: lexdec[c("Subject", "RT" "Correct"
^
RStudio erkennt diesen Syntaxfehler und visualisiert ihn für Sie, wie in Abbildung 12.2. Wir sehen ein rotes “X” neben der Zeilennummer (42
) sowie eine rote Unterstreichung für den problematischen oder unerwarteten Code.
Die Syntax von "Correct"
selbst ist nicht falsch, aber sie ist unerwartet, weil ein Komma nach der vorherigen Zeichenkette fehlt. Erinnern Sie sich, dass c()
eine Liste von Argumenten zu einem Vektor kombiniert, und diese Argumente müssen durch ein Komma getrennt werden. Fehlende Kommas sind ein sehr häufiger Grund für fehlerhaften Code, also halten Sie die Augen offen!
Syntaxfehler sind sehr häufig und treten auf, wenn Sie ein Komma oder eine Klammer ausgelassen haben, ein Objekt, eine Variable oder einen Funktionsnamen falsch geschrieben haben oder sogar eine Funktion aufgerufen haben, ohne vorher das entsprechende Paket zu laden (wie wir es oben mit p_load()
getan haben).
Im Folgenden erhalten wir eine informative Fehlermeldung, die uns sagt, dass eine unerwartete schließende eckige Klammer vorhanden ist.
Error: <text>:1:36: unexpected ']'
1: lexdec[c("Subject", "RT", "Correct"]
^
Error in `[.data.frame`(lexdec, c("Subject", "rt", "Correct")): undefined columns selected
Error: <text>:1:36: unexpected ']'
1: lexdec[c("Subject", "RT", "Correct"]
^
Wenn wir im Tidyverse arbeiten, erhalten wir etwas andere (und manchmal informativere) Fehlermeldungen.
Error in `select()`:
! Can't select columns that don't exist.
✖ Column `Subjct` doesn't exist.
Hier wird uns genau gesagt, wo das Problem liegt: Wir haben keine Variable namens Subjct
. Dies ist eindeutig ein Tippfehler. Unten erhalten wir einen ähnlichen Fehler.
Error in `select()`:
! Can't select columns that don't exist.
✖ Column `subject` doesn't exist.
Dieses Mal ist der Tippfehler auf die Groß- und Kleinschreibung zurückzuführen, denn unsere Variable “Subjekt” beginnt mit einem großen “S”.
Einige häufige Syntaxfehler sind:
Lexdec$Subject
statt lexdec$Subject
)Länge(lexdec)
statt Länge(lexdec)
)Das Rendern eines Quarto-Dokuments kann auch Fehlerwarnungen ausgeben, wenn Ihr Code ausgeführt wurde. Vielleicht lief Ihr Code perfekt, wenn Sie ihn direkt im Skript abgearbeitet haben, aber er funktioniert nicht, wenn er gerendert wird. Diese Fehlerwarnungen sind oft darauf zurückzuführen, dass Ihr Code nicht linear geschrieben wurde (d.h. jeder Codeabschnitt sollte vor dem nächsten ausgeführt werden), oder dass Codeabschnitt-Optionen die Ausführung eines erforderlichen Codeabschnitts blockieren (z.B. durch die Einstellung eval: false
). Glücklicherweise enthalten die Fehlerwarnungen Informationen darüber, welcher Codechunk problematisch ist. Manchmal ist der Fehler auf einen Fehler in diesem Codechunk zurückzuführen oder darauf, dass ein vorheriger Codechunk nicht ausgeführt wird, z.B. wenn Quarto ein erforderliches Paket nicht lädt oder Daten nicht lädt oder ein neues Objekt erzeugt. Ein solches Beispiel sehen wir in Abbildung 12.5.
Sehen Sie sich zunächst die Codeabschnitte in Abbildung 12.5 an. Der erste Codeabschnitt enthält die Option eval: false
, und wird daher beim Rendern des Skripts nicht ausgeführt. Das bedeutet, dass das Paket languageR
nicht geladen wird. Der zweite Codeabschnitt versucht dann, die ersten 6 Zeilen des Datensatzes lexdec
zu drucken, der Teil des Pakets languageR
ist, aber da dieses Paket beim Rendern nicht geladen wurde, erhalten wir die Warnung: Objekt 'lexdec' nicht gefunden
. Dies ist insofern informativ, als es uns sagt, dass es ein Problem beim Finden von lexdec
gibt, aber es sagt uns nicht explizit, dass es daran liegt, dass wir das Paket nicht geladen haben. Bei solchen Fehlern müssen wir manchmal nachforschen, indem wir unseren Code untersuchen.
Schauen wir uns auch die Fehlerwarnung genauer an. In diesem kurzen Skript können wir leicht erkennen, wo das problematische lexdec
ist, aber vielleicht haben wir ein sehr langes Skript geschrieben und es ist nicht klar, wo die Quelle des Problems liegt, wenn wir nur den Fehlertext betrachten. Wir erhalten auch Informationen darüber, wo Quarto auf ein Problem gestoßen ist: Qutting from lines 11-12 [unnamed-chunk-2] (Untitled.qmd)
. Wir erhalten die Zeilennummer und die Nummer des Codeabschnitts. Dies ist eine sehr nützliche Information, wenn wir ein längeres Skript mit vielen Codeabschnitten haben.
Ein häufiger Fehler beim Laden von Daten ist auf einen falschen Dateipfad zurückzuführen. Da wir in diesem Kurs innerhalb eines RProjekts arbeiten, ist dies häufig darauf zurückzuführen, dass wir nicht innerhalb unseres RProjekts arbeiten. Erinnern Sie sich, dass wir das here
-Paket verwenden, weil es das Arbeitsverzeichnis relativ zu dem Ordner setzt, der unser RProjekt enthält. Wenn Sie nicht in einem RProjekt arbeiten oder sich in einem falschen RProjekt befinden, ist der Dateipfad nicht korrekt. In einem solchen Fall kann es zu einer Warnung wie in Abbildung 12.6 kommen, wo wir die Warnung "Users/danielapalleschi/daten/langaugeR_english.csv" existiert nicht
erhalten. Diese Aussage ist richtig, da dieser Dateipfad auf meinem Rechner tatsächlich nicht existiert. Beachten Sie, dass oben in der Mitte des Bildes “RStudio” steht und rechts daneben “Project: (None)”. Beides bedeutet, dass Sie nicht innerhalb eines RProjekts arbeiten, d. h. Ihr Arbeitsverzeichnis ist nicht relativ zu dem Ordner, der Ihr RProjekt enthält. Wenn Sie feststellen, dass Sie in einem falschen oder gar keinem RProjekt arbeiten, können Sie das richtige RProjekt öffnen, indem Sie auf die Stelle klicken, an der “Project: (None)” steht, wo die letzten RProjekte angezeigt werden.
Vergleichen Sie dies mit Abbildung 12.7. Das gleiche Skript wird ohne Warnung ausgeführt, und Sie können sehen, dass wir innerhalb eines RProjekts mit dem Namen r4ling
arbeiten (Sie können das main
ignorieren, das hängt mit dem Projekt zusammen, das Git verwendet), und die csv-Datei wird ohne Warnung geladen.
Wenn Sie auf Rendering-Probleme stoßen, empfehle ich Ihnen, die folgenden Schritte zu befolgen:
eval: false
, das ausgeführt werden muss?
Session
> Restart R
)
Session
> Restart R
) und führen Sie jeden Codechunk vom Anfang Ihres Skripts bis zum problematischen Codechunk aus, wobei Sie genau auf die Codechunk-Optionen achten. Sehen Sie, was das Problem ist?
Wenn Sie nach diesen Schritten nicht in der Lage sind, den Fehler zu lokalisieren und zu beheben, würde ich Sie weiterhin um Hilfe bitten. Wir werden uns nun einige Stellen ansehen, an denen Sie Antworten auf Fehler finden können, die Sie nicht ohne weiteres selbst lösen können.
Für manche Probleme ist es schwierig, eine Lösung zu finden. Glücklicherweise gibt es eine sehr aktive R-Gemeinschaft im Internet. Es gibt viele Quellen für Hilfe, aber wir werden uns hier die häufigsten und hilfreichsten ansehen.
Im Zweifelsfall: Google! Wenn Sie die Fehlermeldung, die Sie erhalten, in Google eingeben, erhalten Sie in der Regel eine Vielzahl von Antworten. Je nachdem, wie häufig dieser Fehler auftritt und wie technisch die Erklärung ist, die Sie finden, können diese Antworten hilfreich sein oder auch nicht. Möglicherweise finden Sie einige Blogbeiträge oder Forenbeiträge, in denen das Problem und mögliche Lösungen diskutiert werden. Dies ist ein guter erster Schritt, um das Problem zu lösen.
Stack Overflow ist eine Online-Community für Entwickler mit vielen Forenbeiträgen zu R-Programmierproblemen. In der Regel finden Sie einen Thread, in dem jemand das gleiche Problem hatte wie Sie, und mehrere andere antworten mit möglichen Lösungen. Dies kann eine großartige Möglichkeit sein, zu lernen und Lösungen zu finden, und wenn Sie ein Problem googeln, werden Sie normalerweise zu einem Stack Overflow-Thread geführt. Wenn Sie wirklich nicht weiterkommen, können Sie sogar Ihre eigene Frage stellen! Dazu müssen Sie ein Konto erstellen.
Denken Sie daran, dass es eine Fülle von Dokumentationen für Pakete (und Funktionen) gibt. Wenn Sie bemerken, dass ein Code-Stück einen Fehler auslöst, versuchen Sie, die Hilfeseite für das entsprechende Paket oder die Funktion (?Paket
oder ?Funktion
in der Konsole) aufzurufen. Alternativ können Sie auch den Namen des Pakets oder der Funktion in Google eingeben, um die Online-Dokumentation zu finden, die Ihnen helfen könnte, besser zu verstehen, was die Funktion erwartet, und dies mit dem zu vergleichen, was Sie ihr gegeben haben.
Chatbots work best for small, discrete programming tasks, such as loading data, performing basic data manipulations and creating visualizations and websites.
— Perkel (2023)
Obwohl ich ChatGPT selbst nicht oft benutze, habe ich von weniger erfahrenen R-Benutzern gehört, dass es beim Auffinden von Syntaxfehlern ein Lebensretter sein kann. Ich schlage ChatGPT erst zum Schluss vor, denn obwohl es bei Syntaxfehlern sehr effizient ist, kann man seinen Code am besten verbessern, wenn man lernt, einfache Fehler schnell zu erkennen und zu lokalisieren, ohne sich auf die KI verlassen zu müssen. Es kann jedoch von großem Vorteil sein, Zeit zu sparen, wenn Sie das Problem in Ihrem Code einfach nicht erkennen können, und ChatGPT liefert detaillierte Beschreibungen dessen, was es für das Problem hält und wie der vorgeschlagene Code das Problem behebt. Dies kann ein wertvolles Lernmittel sein.
Das Kopieren und Einfügen von Code ist sehr üblich (Sie werden in der Regel nicht ein ganzes Skript von Grund auf neu schreiben). Wichtig ist, dass Sie Ihren Code verstehen, denn das ist der beste Weg, um ihn schnell zu reparieren, wenn etwas schief läuft, und ChatGPT, Google, Stackflow und dergleichen werden Ihnen nicht immer helfen können. ChatGPT wird Ihnen zum Beispiel nicht sagen können, dass Sie einen Variablennamen mit Kamelhülsen geschrieben haben (cameCaseLooksLikeThis
), wenn Ihre Variablen mit Schlangenhülsen benannt sind (snake_case_looks_like_this
), oder wenn es einen anderen Tippfehler gibt, der nichts mit der Syntax zu tun hat. Wenn Sie in der Lage sind, Fehler-/Warnmeldungen zu interpretieren und die Ursache des Problems ausfindig zu machen, ist das der schnellste Weg zur Lösung.
Dennoch können Syntaxfehler für neue Programmierer schwierig zu erkennen sein. Wenn man nicht weiterkommt, kann es hilfreich sein, ChatGPT zu benutzen, um nicht nur eine Lösung zu erhalten, sondern auch eine detaillierte Beschreibung der Fehlerquelle und -lösung. Um ChatGPT auszuprobieren, müssen Sie ein Konto haben.
The temptation to copy and paste code snippets from ChatGPT or Stackoverflow is real, but true mastery lies in comprehension.
— Travis Oliphant ((teoliphant?)) October 20, 2023
I've copied and pasted a lot of code. But as a programmer, it's your duty to understand.
And to do so, you'll eventually end up in documentation 😉. pic.twitter.com/HWi09tPz6O
Es ist wichtig zu wissen, dass ChatGPT ein Tausendsassa ist, der nichts beherrscht. Das bedeutet, dass es sich mit vielen Themen auskennt, aber kein Experte in einem dieser Themen ist. Der beste Ratschlag in Bezug auf die Verwendung von ChatGPT für Programmierzwecke, den ich gefunden habe, lautet: “Vertrauen, aber überprüfen” (Perkel, 2023). Vertrauen Sie nicht blind auf das, was die KI Ihnen sagt: Sie ist nur so gut wie die Daten, auf denen sie trainiert wurde, und kann überheblich sein und überzeugend klingen. Denken Sie daran, dass “‘[i]m Falle, dass Sie nicht genug wissen, um den Unterschied zwischen etwas Richtigem und etwas, das eigentlich Unsinn ist, zu erkennen, Sie sich in Schwierigkeiten bringen könnten’” (Zitat der Linguistin Emily Morgan von der UC Davis in Perkel, 2023).
Seien Sie also skeptisch gegenüber den Lösungen, die ChatGPT Ihnen anbietet, vor allem, wenn Ihre Probleme komplexer werden. Testen Sie immer, ob der vorgeschlagene Code nicht nur ohne eine weitere Warnung oder Fehlermeldung läuft, sondern ob er auch das erreicht, was Sie erwarten. Nur weil Sie keine Warnung erhalten, heißt das nicht, dass der Code auch das tut, was Sie wollen!
ChatGPT und Datenschutz: Alles, was Sie in ChatGPT eingeben, wird an die Server von OpenAI gesendet und kann für Trainingszwecke verwendet werden. Geben Sie niemals sensible Informationen in ChatGPT ein.
ChatGPT und akademische Integrität: Denken Sie daran, dass der Einsatz von künstlicher Intelligenz im akademischen Umfeld derzeit eine Grauzone ist. Ich empfehle die Verwendung von ChatGPT zur Fehlersuche in bereits fehlerhaftem Code oder zur Unterstützung bei der Lösung komplexer Programmieraufgaben. Schauen Sie sich unbedingt die Empfehlungen für das Umgehen mit Künstlicher Intelligenz in Prüfungen der Humboldt-Universität an .
Darüber hinaus werden LLM (Large Language Models) auf Daten trainiert, die aktuell sein können oder auch nicht. Zum Beispiel wird ChatGPT vielleicht nicht auf der neuesten Version eines Pakets trainiert und ist sich daher möglicherweise der Probleme mit einem veralteten Argument nicht bewusst.
Ein weiteres, allgemeineres Problem bei der Verwendung von ChatGPT oder einem anderen LMM (Large Language Model) ist die Frage, ob es ethisch vertretbar ist, sich zu sehr auf künstliche Intelligenz zu verlassen, bei der wiederholt festgestellt wurde, dass sie rassische und geschlechtsspezifische Vorurteile hat (was sich nicht auf Ihren Code auswirken sollte, aber eine größere Frage bezüglich der Fütterung des Modells ist).
In diesem Kapitel haben wir gelernt…
Hergestellt mit R version 4.4.0 (2024-04-24) (Puppy Cup) und RStudioversion 2023.9.0.463 (Desert Sunflower).
R version 4.4.0 (2024-04-24)
Platform: aarch64-apple-darwin20
Running under: macOS Ventura 13.2.1
Matrix products: default
BLAS: /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRlapack.dylib; LAPACK version 3.12.0
attached base packages:
[1] stats graphics grDevices datasets utils methods base
other attached packages:
[1] languageR_1.5.0 here_1.0.1 janitor_2.2.0 lubridate_1.9.3
[5] forcats_1.0.0 stringr_1.5.1 dplyr_1.1.4 purrr_1.0.2
[9] readr_2.1.5 tidyr_1.3.1 tibble_3.2.1 ggplot2_3.5.1
[13] tidyverse_2.0.0
loaded via a namespace (and not attached):
[1] gtable_0.3.5 jsonlite_1.8.8 compiler_4.4.0 renv_1.0.7
[5] tidyselect_1.2.1 snakecase_0.11.1 scales_1.3.0 yaml_2.3.8
[9] fastmap_1.1.1 R6_2.5.1 generics_0.1.3 knitr_1.46
[13] htmlwidgets_1.6.4 rprojroot_2.0.4 munsell_0.5.1 pillar_1.9.0
[17] tzdb_0.4.0 rlang_1.1.3 utf8_1.2.4 stringi_1.8.3
[21] xfun_0.43 timechange_0.3.0 cli_3.6.2 withr_3.0.0
[25] magrittr_2.0.3 digest_0.6.35 grid_4.4.0 rstudioapi_0.16.0
[29] hms_1.1.3 lifecycle_1.0.4 vctrs_0.6.5 evaluate_0.23
[33] glue_1.7.0 fansi_1.0.6 colorspace_2.1-0 pacman_0.5.1
[37] rmarkdown_2.26 tools_4.4.0 pkgconfig_2.0.3 htmltools_0.5.8.1
---
title: "Troubleshooting"
subtitle: "Was tun, wenn etwas schief geht?"
author: "Daniela Palleschi"
institute: Humboldt-Universität zu Berlin
footer: "Woche 16 - Troubleshooting"
date: "02/14/2024"
date-format: "ddd [den] DD.MM.YYYY"
date-modified: last-modified
shift-heading-level-by: +1
error: true
warning: true
message: true
---
# Ressourcen
Die Ressourcen, die ich für dieses Kapitel verwendet habe, waren [Abschnitt 3.6 "Troublshooting Error Messages"](https://bookdown.org/yih_huynh/Guide-to-R-Book/trouble.html) aus dem Webbuch [R for Graduate Students](https://bookdown.org/yih_huynh/Guide-to-R-Book/) von Wendy Huynh (2019), und @perkel_six_2023.
# Lernziele {.unnumbered .unlisted}
In diesem Kapitel werden wir lernen...
- wie man mit allgemeinen Warnungen und Fehlermeldungen umgeht
- wie man Fehler beim Rendern von Quarto-Skripten behebt
- wo man Hilfe findet, wenn man mit fehlerhaftem Code nicht weiterkommt
# Einrichten
Das folgende Code-Stück gibt uns den ersten Fehler:
```{r}
p_load(tidyverse,
janitor,
here)
```
Was ist das Problem mit dem obigen Code? Die Funktion `p_load()` konnte nicht gefunden werden, weil sie aus dem Paket `pacman` stammt, aber wir haben dieses Paket noch nicht geladen. Das ist der Grund, warum wir `pacman::p_load()` schreiben, wenn wir unsere Pakete einladen.
```{r}
#| echo: false
pacman::p_load(tidyverse,
janitor,
here)
```
```{r}
#| echo: false
tab_message <-
dplyr::tribble(
~Message, ~Source, ~Solution,
'`could not find function "xyz"`', "missing package for function `xyz`", "load package, or specify package name: `package::xyz()`",
"`unexpected string constant`", "incorrect use of quotation marks, possibly missing punctuation between list of strings", "check quotation marks/add missing comma"
)
```
```{r}
#| echo: false
#| eval: false
#| label: tbl-messages
#| tbl-cap: List of common messages, the source of the problem, and typical solutions
tab_message |>
gt::gt() |>
gt::fmt_markdown()
```
Um die Funktion `p_load()` zu benutzen, müssen wir angeben, dass sie aus dem Paket `pacman` stammt, wie wir es in diesem Buch immer getan haben (oder wir könnten dieser Zeile `library(pacman)` voranstellen).
```{r}
#| echo: true
pacman::p_load(tidyverse,
janitor,
here,
languageR)
```
# Fehlermeldungen
Fehler- oder Warnmeldungen sind bei der Programmierung im Allgemeinen sehr häufig. Programmiersprachen sind sehr wortgetreu, sie versuchen normalerweise nicht zu erraten, was Sie wollen. Das bedeutet, dass selbst der kleinste Fehler Ihren Code zerstören kann. Es kann extrem frustrierend und demotivierend sein, wenn man solche Fehlermeldungen erhält. Es mag ein gewisser Trost sein zu wissen, dass jeder Fehler macht, sogar Profis. Mit zunehmender Erfahrung werden Sie lernen, Codefehler effizienter zu erkennen und zu beheben. Heute lernen wir einige Ressourcen kennen, die Ihnen auf diesem Weg helfen können.
```{r}
#| label: fig-error
#| fig-cap: Kunstwerke von Alison Horst
#| echo: false
knitr::include_graphics(here("media", "Horst_error.png"))
```
## RStudio-Syntax-Checker
RStudio erkennt in der Regel Syntaxfehler und teilt Ihnen vor der Ausführung Ihres Codes mit, ob Sie etwas übersehen haben. Das folgende Code-Stück gibt zum Beispiel eine Fehlermeldung aus.
```{r}
lexdec[c("Subject", "RT" "Correct")]
```
RStudio erkennt diesen Syntaxfehler und visualisiert ihn für Sie, wie in @fig-rstudio. Wir sehen ein rotes "X" neben der Zeilennummer (`42`) sowie eine rote Unterstreichung für den problematischen oder unerwarteten Code.
```{r}
#| label: fig-rstudio
#| fig-cap: RStudio-Syntaxfehler-Warnung
#| out-width: "80%"
#| echo: false
knitr::include_graphics(here("media", "rstudio_error.png"))
```
Die Syntax von `"Correct"` selbst ist nicht falsch, aber sie ist unerwartet, weil ein Komma nach der vorherigen Zeichenkette fehlt. Erinnern Sie sich, dass `c()` eine Liste von Argumenten zu einem Vektor kombiniert, und diese Argumente müssen durch ein Komma getrennt werden. Fehlende Kommas sind ein sehr häufiger Grund für fehlerhaften Code, also halten Sie die Augen offen!
```{r}
#| label: fig-troubleshooting
#| fig-cap: Kunstwerke von Alison Horst
#| echo: false
knitr::include_graphics(here("media", "Horst_troubleshooting.jpeg"))
```
## Syntaxfehler
Syntaxfehler sind sehr häufig und treten auf, wenn Sie ein Komma oder eine Klammer ausgelassen haben, ein Objekt, eine Variable oder einen Funktionsnamen falsch geschrieben haben oder sogar eine Funktion aufgerufen haben, ohne vorher das entsprechende Paket zu laden (wie wir es oben mit `p_load()` getan haben).
Im Folgenden erhalten wir eine informative Fehlermeldung, die uns sagt, dass eine unerwartete schließende eckige Klammer vorhanden ist.
```{r}
lexdec[c("Subject", "RT", "Correct"]
```
```{r}
lexdec[c("Subject", "rt", "Correct")]
```
```{r}
lexdec[c("Subject", "RT", "Correct"])
```
Wenn wir im Tidyverse arbeiten, erhalten wir etwas andere (und manchmal informativere) Fehlermeldungen.
```{r}
lexdec |>
select("Subjct", "RT", "Correct")
```
Hier wird uns genau gesagt, wo das Problem liegt: Wir haben keine Variable namens `Subjct`. Dies ist eindeutig ein Tippfehler. Unten erhalten wir einen ähnlichen Fehler.
```{r}
lexdec |>
select("subject", "RT", "Correct")
```
Dieses Mal ist der Tippfehler auf die Groß- und Kleinschreibung zurückzuführen, denn unsere Variable "Subjekt" beginnt mit einem großen "S".
Einige häufige Syntaxfehler sind:
- falsche Großschreibung (z.B. `Lexdec$Subject` statt `lexdec$Subject`)
- Tippfehler (z. B. `Länge(lexdec)` statt `Länge(lexdec)`)
- schließende Interpunktion, wie z. B. ein schließendes Anführungszeichen, eine Klammer oder eine eckige Klammer
- fortgesetzte Interpunktion, typischerweise fehlt ein Komma oder eine Pipe
```{r}
#| label: fig-typo
#| fig-cap: Kunstwerke von Alison Horst
#| echo: false
#| eval: true
knitr::include_graphics(here("media", "Horst_typo.png"))
```
# Rendering-Fehler
Das Rendern eines Quarto-Dokuments kann auch Fehlerwarnungen ausgeben, wenn Ihr Code ausgeführt wurde. Vielleicht lief Ihr Code perfekt, wenn Sie ihn direkt im Skript abgearbeitet haben, aber er funktioniert nicht, wenn er gerendert wird. Diese Fehlerwarnungen sind oft darauf zurückzuführen, dass Ihr Code nicht linear geschrieben wurde (d.h. jeder Codeabschnitt sollte vor dem nächsten ausgeführt werden), oder dass Codeabschnitt-Optionen die Ausführung eines erforderlichen Codeabschnitts blockieren (z.B. durch die Einstellung `eval: false`). Glücklicherweise enthalten die Fehlerwarnungen Informationen darüber, welcher Codechunk problematisch ist. Manchmal ist der Fehler auf einen Fehler in diesem Codechunk zurückzuführen oder darauf, dass ein vorheriger Codechunk nicht ausgeführt wird, z.B. wenn Quarto ein erforderliches Paket nicht lädt oder Daten nicht lädt oder ein neues Objekt erzeugt. Ein solches Beispiel sehen wir in @fig-render.
```{r}
#| label: fig-render
#| fig-cap: Kunstwerke von Alison Horst
#| echo: false
#| out-width: "90%"
knitr::include_graphics(here("media", "render_error.png"))
```
Sehen Sie sich zunächst die Codeabschnitte in @fig-render an. Der erste Codeabschnitt enthält die Option `eval: false`, und wird daher beim Rendern des Skripts nicht ausgeführt. Das bedeutet, dass das Paket `languageR` nicht geladen wird. Der zweite Codeabschnitt versucht dann, die ersten 6 Zeilen des Datensatzes `lexdec` zu drucken, der Teil des Pakets `languageR` ist, aber da dieses Paket beim Rendern nicht geladen wurde, erhalten wir die Warnung: `Objekt 'lexdec' nicht gefunden`. Dies ist insofern informativ, als es uns sagt, dass es ein Problem beim Finden von `lexdec` gibt, aber es sagt uns nicht explizit, dass es daran liegt, dass wir das Paket nicht geladen haben. Bei solchen Fehlern müssen wir manchmal nachforschen, indem wir unseren Code untersuchen.
Schauen wir uns auch die Fehlerwarnung genauer an. In diesem kurzen Skript können wir leicht erkennen, wo das problematische `lexdec` ist, aber vielleicht haben wir ein sehr langes Skript geschrieben und es ist nicht klar, wo die Quelle des Problems liegt, wenn wir nur den Fehlertext betrachten. Wir erhalten auch Informationen darüber, *wo* Quarto auf ein Problem gestoßen ist: `Qutting from lines 11-12 [unnamed-chunk-2] (Untitled.qmd)`. Wir erhalten die Zeilennummer und die Nummer des Codeabschnitts. Dies ist eine sehr nützliche Information, wenn wir ein längeres Skript mit vielen Codeabschnitten haben.
## RProjects
Ein häufiger Fehler beim Laden von Daten ist auf einen falschen Dateipfad zurückzuführen. Da wir in diesem Kurs innerhalb eines RProjekts arbeiten, ist dies häufig darauf zurückzuführen, dass wir nicht innerhalb unseres RProjekts arbeiten. Erinnern Sie sich, dass wir das `here`-Paket verwenden, weil es das Arbeitsverzeichnis relativ zu dem Ordner setzt, der unser RProjekt enthält. Wenn Sie nicht in einem RProjekt arbeiten oder sich in einem falschen RProjekt befinden, ist der Dateipfad nicht korrekt. In einem solchen Fall kann es zu einer Warnung wie in @fig-no-rproj kommen, wo wir die Warnung `"Users/danielapalleschi/daten/langaugeR_english.csv" existiert nicht` erhalten. Diese Aussage ist richtig, da dieser Dateipfad auf meinem Rechner tatsächlich nicht existiert. Beachten Sie, dass oben in der Mitte des Bildes "RStudio" steht und rechts daneben "Project: (None)". Beides bedeutet, dass Sie nicht innerhalb eines RProjekts arbeiten, d. h. Ihr Arbeitsverzeichnis ist nicht relativ zu dem Ordner, der Ihr RProjekt enthält. Wenn Sie feststellen, dass Sie in einem falschen oder gar keinem RProjekt arbeiten, können Sie das richtige RProjekt öffnen, indem Sie auf die Stelle klicken, an der "Project: (None)" steht, wo die letzten RProjekte angezeigt werden.
```{r}
#| label: fig-no-rproj
#| fig-cap: Kunstwerke von Alison Horst
#| echo: false
#| out-width: "70%"
knitr::include_graphics(here("media", "load_no_rproject.png"))
```
Vergleichen Sie dies mit @fig-rproj. Das gleiche Skript wird ohne Warnung ausgeführt, und Sie können sehen, dass wir innerhalb eines RProjekts mit dem Namen `r4ling` arbeiten (Sie können das `main` ignorieren, das hängt mit dem Projekt zusammen, das Git verwendet), und die csv-Datei wird ohne Warnung geladen.
```{r}
#| label: fig-rproj
#| fig-cap: Kunstwerke von Alison Horst
#| echo: false
#| out-width: "70%"
knitr::include_graphics(here("media", "load_rproject.png"))
```
## Behebung von Rendering-Fehlern
Wenn Sie auf Rendering-Probleme stoßen, empfehle ich Ihnen, die folgenden Schritte zu befolgen:
1. Prüfen Sie, ob die Fehlerwarnung mit einer Datei zusammenhängt, die "nicht existiert".
+ Stellen Sie sicher, dass Sie im richtigen RProjekt arbeiten.
+ Vergewissern Sie sich, dass die Datei tatsächlich existiert (folgen Sie z. B. dem in der Fehlermeldung angegebenen Dateipfad auf Ihrem Computer, um sicherzustellen, dass die Datei tatsächlich in diesem Verzeichnis existiert; achten Sie auf Tippfehler in Ordner- oder Dateinamen).
1. Schauen Sie sich an, *wo* das Problem aufgetreten ist (welche Zeile/Codechunk), und gehen Sie zu dem Codechunk.
2. Interpretieren Sie den Fehlertext und den Code: Ist sofort klar, wo das Problem liegt?
+ Ja: gut, beheben Sie es!
+ Nein: weiter
3. Prüfen Sie die obigen Code-Chunk-Optionen, gibt es irgendetwas mit `eval: false`, das ausgeführt werden muss?
+ Ja: prima, beheben Sie es!
+ Nein: weiter
4. Löschen Sie Ihre R-Sitzung (`Session` > `Restart R`)
+ Alternativ können Sie die R-Sitzung löschen und dann auf die Schaltfläche "Run > Run All Chunks Above" (Ausführen > Alle Chunks oben ausführen) in der rechten oberen Ecke des Editorfensters klicken (in @fig-render, "Run"). Dieser Schritt befolgt die Code-Chunk-Optionen. Dies sollte zu demselben Fehler führen. Wenn dies nicht der Fall ist, versuchen Sie, R zu schließen und erneut zu öffnen. Wenn der gleiche Fehler auftritt, Sie aber immer noch nicht wissen, was er bedeutet, fahren Sie fort.
5. Löschen Sie Ihre R-Sitzung (`Session` > `Restart R`) und führen Sie jeden Codechunk vom Anfang Ihres Skripts bis zum problematischen Codechunk aus, wobei Sie genau auf die Codechunk-Optionen achten. Sehen Sie, was das Problem ist?
+ Ja: beheben
+ Nein: weiter
Wenn Sie nach diesen Schritten nicht in der Lage sind, den Fehler zu lokalisieren und zu beheben, würde ich Sie weiterhin um Hilfe bitten. Wir werden uns nun einige Stellen ansehen, an denen Sie Antworten auf Fehler finden können, die Sie nicht ohne weiteres selbst lösen können.
# Um Hilfe bitten
Für manche Probleme ist es schwierig, eine Lösung zu finden. Glücklicherweise gibt es eine sehr aktive R-Gemeinschaft im Internet. Es gibt viele Quellen für Hilfe, aber wir werden uns hier die häufigsten und hilfreichsten ansehen.
## Google
Im Zweifelsfall: Google! Wenn Sie die Fehlermeldung, die Sie erhalten, in Google eingeben, erhalten Sie in der Regel eine Vielzahl von Antworten. Je nachdem, wie häufig dieser Fehler auftritt und wie technisch die Erklärung ist, die Sie finden, können diese Antworten hilfreich sein oder auch nicht. Möglicherweise finden Sie einige Blogbeiträge oder Forenbeiträge, in denen das Problem und mögliche Lösungen diskutiert werden. Dies ist ein guter erster Schritt, um das Problem zu lösen.
## Stackoverflow
Stack Overflow ist eine Online-Community für Entwickler mit vielen Forenbeiträgen zu R-Programmierproblemen. In der Regel finden Sie einen Thread, in dem jemand das gleiche Problem hatte wie Sie, und mehrere andere antworten mit möglichen Lösungen. Dies kann eine großartige Möglichkeit sein, zu lernen und Lösungen zu finden, und wenn Sie ein Problem googeln, werden Sie normalerweise zu einem Stack Overflow-Thread geführt. Wenn Sie wirklich nicht weiterkommen, können Sie sogar Ihre eigene Frage stellen! Dazu müssen Sie ein Konto erstellen.
## Dokumentation
Denken Sie daran, dass es eine Fülle von Dokumentationen für Pakete (und Funktionen) gibt. Wenn Sie bemerken, dass ein Code-Stück einen Fehler auslöst, versuchen Sie, die Hilfeseite für das entsprechende Paket oder die Funktion (`?Paket` oder `?Funktion` in der Konsole) aufzurufen. Alternativ können Sie auch den Namen des Pakets oder der Funktion in Google eingeben, um die Online-Dokumentation zu finden, die Ihnen helfen könnte, besser zu verstehen, was die Funktion erwartet, und dies mit dem zu vergleichen, was Sie ihr gegeben haben.
## ChatGPT
> Chatbots work best for small, discrete programming tasks, such as loading data, performing basic data manipulations and creating visualizations and websites.
>
> --- @perkel_six_2023
Obwohl ich ChatGPT selbst nicht oft benutze, habe ich von weniger erfahrenen R-Benutzern gehört, dass es beim Auffinden von Syntaxfehlern ein Lebensretter sein kann. Ich schlage ChatGPT erst zum Schluss vor, denn obwohl es bei Syntaxfehlern sehr effizient ist, kann man seinen Code am besten verbessern, wenn man lernt, einfache Fehler schnell zu erkennen und zu lokalisieren, ohne sich auf die KI verlassen zu müssen. Es kann jedoch von großem Vorteil sein, Zeit zu sparen, wenn Sie das Problem in Ihrem Code einfach nicht erkennen können, und ChatGPT liefert detaillierte Beschreibungen dessen, was es für das Problem hält und wie der vorgeschlagene Code das Problem behebt. Dies kann ein wertvolles Lernmittel sein.
Das Kopieren und Einfügen von Code ist sehr üblich (Sie werden in der Regel nicht ein ganzes Skript von Grund auf neu schreiben). Wichtig ist, dass Sie Ihren Code verstehen, denn das ist der beste Weg, um ihn schnell zu reparieren, wenn etwas schief läuft, und ChatGPT, Google, Stackflow und dergleichen werden Ihnen nicht immer helfen können. ChatGPT wird Ihnen zum Beispiel nicht sagen können, dass Sie einen Variablennamen mit Kamelhülsen geschrieben haben (`cameCaseLooksLikeThis`), wenn Ihre Variablen mit Schlangenhülsen benannt sind (`snake_case_looks_like_this`), oder wenn es einen anderen Tippfehler gibt, der nichts mit der Syntax zu tun hat. Wenn Sie in der Lage sind, Fehler-/Warnmeldungen zu interpretieren und die Ursache des Problems ausfindig zu machen, ist das der schnellste Weg zur Lösung.
Dennoch können Syntaxfehler für neue Programmierer schwierig zu erkennen sein. Wenn man nicht weiterkommt, kann es hilfreich sein, [ChatGPT](https://chat.openai.com/) zu benutzen, um nicht nur eine Lösung zu erhalten, sondern auch eine detaillierte Beschreibung der Fehlerquelle und -lösung. Um ChatGPT auszuprobieren, müssen Sie ein Konto haben.
::: {.content-visible when-format="html"}
<center>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">The temptation to copy and paste code snippets from ChatGPT or Stackoverflow is real, but true mastery lies in comprehension. <br><br>I've copied and pasted a lot of code. But as a programmer, it's your duty to understand. <br><br>And to do so, you'll eventually end up in documentation 😉. <a href="https://t.co/HWi09tPz6O">pic.twitter.com/HWi09tPz6O</a></p>— Travis Oliphant (@teoliphant) <a href="https://twitter.com/teoliphant/status/1715356699203076143?ref_src=twsrc%5Etfw">October 20, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</center>
:::
::: {.content-visible when-format="pdf"}
```{r}
#| echo: false
#| label: fig-twitter-white
#| fig-cap: Ein Tweet über die Vorteile und Kosten der Verwendung von ChatGPT zur Korrektur von fehlerhaftem Code [Klicken Sie hier, um den Tweet zu sehen.](https://x.com/teoliphant/status/1715356699203076143?s=20)
#| out-width: "70%"
knitr::include_graphics(
here::here("media", "twitter_chatgpt.png")
)
```
:::
Es ist wichtig zu wissen, dass ChatGPT ein Tausendsassa ist, der nichts beherrscht. Das bedeutet, dass es sich mit vielen Themen auskennt, aber kein Experte in einem dieser Themen ist. Der beste Ratschlag in Bezug auf die Verwendung von ChatGPT für Programmierzwecke, den ich gefunden habe, lautet: "Vertrauen, aber überprüfen" [@perkel_six_2023]. Vertrauen Sie nicht blind auf das, was die KI Ihnen sagt: Sie ist nur so gut wie die Daten, auf denen sie trainiert wurde, und kann überheblich sein und überzeugend klingen. Denken Sie daran, dass "*'[i]m Falle, dass Sie nicht genug wissen, um den Unterschied zwischen etwas Richtigem und etwas, das eigentlich Unsinn ist, zu erkennen, Sie sich in Schwierigkeiten bringen könnten'*" [Zitat der Linguistin Emily Morgan von der UC Davis in @perkel_six_2023].
Seien Sie also skeptisch gegenüber den Lösungen, die ChatGPT Ihnen anbietet, vor allem, wenn Ihre Probleme komplexer werden. Testen Sie immer, ob der vorgeschlagene Code nicht nur ohne eine weitere Warnung oder Fehlermeldung läuft, sondern ob er auch das erreicht, was Sie erwarten. Nur weil Sie keine Warnung erhalten, heißt das nicht, dass der Code auch das tut, was Sie wollen!
::: {.callout-warning}
# Disclaimer {.unlisted .uncounted .unnumbered}
ChatGPT und Datenschutz: Alles, was Sie in ChatGPT eingeben, wird an die Server von OpenAI gesendet und kann für Trainingszwecke verwendet werden. Geben Sie niemals sensible Informationen in ChatGPT ein.
ChatGPT und akademische Integrität: Denken Sie daran, dass der Einsatz von künstlicher Intelligenz im akademischen Umfeld derzeit eine Grauzone ist. Ich empfehle die Verwendung von ChatGPT zur Fehlersuche in bereits fehlerhaftem Code oder zur Unterstützung bei der Lösung komplexer Programmieraufgaben. Schauen Sie sich unbedingt die [Empfehlungen für das Umgehen mit Künstlicher Intelligenz in Prüfungen](https://www.hu-berlin.de/de/pr/nachrichten/september-2023/hu_empfehlungen_ki-in-pruefungen_20230905.pdf) der Humboldt-Universität an .
Darüber hinaus werden LLM (Large Language Models) auf Daten trainiert, die aktuell sein können oder auch nicht. Zum Beispiel wird ChatGPT vielleicht nicht auf der neuesten Version eines Pakets trainiert und ist sich daher möglicherweise der Probleme mit einem veralteten Argument nicht bewusst.
Ein weiteres, allgemeineres Problem bei der Verwendung von ChatGPT oder einem anderen LMM (Large Language Model) ist die Frage, ob es ethisch vertretbar ist, sich zu sehr auf künstliche Intelligenz zu verlassen, bei der wiederholt festgestellt wurde, dass sie rassische und geschlechtsspezifische Vorurteile hat (was sich nicht auf Ihren Code auswirken sollte, aber eine größere Frage bezüglich der Fütterung des Modells ist).
:::
# Lernziele 🏁 {.unnumbered .unlisted}
In diesem Kapitel haben wir gelernt...
- wie man mit allgemeinen Warnungen und Fehlermeldungen umgeht ✅
- wie man Fehler beim Rendern von Quarto-Skripten behebt ✅
- wo man Hilfe findet, wenn man mit fehlerhaftem Code nicht weiterkommt ✅
# Session Info {.unnumbered}
```{r}
#| eval: false
#| echo: false
RStudio.Version()$version
```
Hergestellt mit `r R.version.string` (`r R.version$nickname`) und RStudioversion 2023.9.0.463 (Desert Sunflower).
```{r}
print(sessionInfo(),locale = F)
```