Angewandte Datenverarbeitung und Visualisierung
  • D. Palleschi
  • Moodle
  1. Anhang
  2. A  Aufgaben
  • Kursübersicht
    • Kursübersicht
    • Erforderliche Software
    • Sitzungsinformationen
  • Grundlagen
    • 1  Einführung in R und RStudio
    • 2  Datenvisualiserung 1
    • 3  Dynamische Berichte mit Quarto
    • 4  Data Wrangling 1: Transformation
    • 5  Datenvisualisierung 2
  • Nächste Stufe
    • 6  Einlesen von Daten
    • 7  Deskriptive Statistik
    • 8  Datenvisualisierung 3
    • 9  Data Wrangling 2: Tidying
  • Fortgeschrittene Themen
    • 10  Base R
    • 11  Datenvisualisierung 4
    • 12  Troubleshooting
  • Berichte
    • 13  Bericht 1
    • 14  Bericht 2
  • Literaturverzeichnis
  • Anhang
    • A  Aufgaben

Kapitelinhalt

  • A.1 Einführung in R und RStudio
    • A.1.1 Neue R-Skript
    • A.1.2 Paket-Installation
    • A.1.3 Rechnen in R
    • A.1.4 Rechnen mit Objekte und Funktionen
    • A.1.5 Vektoren
  • A.2 Datenvisualierung 1
    • A.2.1 Kombination von Plots mit Patchwork
    • A.2.2 Reproduzieren eines Plots
  • A.3 Quarto
    • A.3.1 Schreiben und Formatieren eines Quarto-Dokuments
    • A.3.2 Kodierung in einem Quarto-Dokument
    • A.3.3 Plots in Quarto
    • A.3.4 Ausgabeformate
  • A.4 Data Wrangling 1: Transformation
    • A.4.1 Pipes und Zeilen
    • A.4.2 Spalten
  • A.5 Datavisualisierung 2: Beziehungen
    • A.5.1 Visualisierung von Beziehungen
    • A.5.2 ggsave()
  • A.6 Dateneinlesung
  • A.7 Deskriptive Statistik
    • A.7.1 Standardabweichung
    • A.7.2 summary()
  • A.8 Datenvisualisierung 3
    • A.8.1 Boxplot mit Facette
    • A.8.2 Errorbar plot
    • A.8.3 Patchwork
  • A.9 Data Wrangling 2
    • A.9.1 pivot_longer() |> summarise()
    • A.9.2 pivot_wider()
  • A.10 base R
    • A.10.1 tidyverse zur base R
  • A.11 Datenvisualisierung 4
    • A.11.1 Mehrteilige Darstellung
    • A.11.2 Beschriftungen
    • A.11.3 Anpassungen
  1. Anhang
  2. A  Aufgaben

Anhang A — Aufgaben

Autor:in
Zugehörigkeit

Daniela Palleschi

Humboldt-Universität zu Berlin

Geändert

den 25.06.2024

Hier finden Sie die Aufgaben zu den einzelnen Kapiteln.

A.1 Einführung in R und RStudio

Diese Übungen finden sich auch in Kapitel 1.

A.1.1 Neue R-Skript

  1. Öffnen Sie ein neues R-Skript (File > New File > R Script)
    • wenn sich oben links ein neues Fenster öffnet: “Datei > Speichern unter…”.
      • speichern Sie es in Ihrem ‘notizen’ Ordner
    • schreiben Sie oben in das Skript: # Angewandte Datenverarbeitung und Visualisierung - Woche 1 (17.04.2023)

A.1.2 Paket-Installation

  1. Installieren Sie das here-Paket (in der Konsole).
  2. Führen Sie die Funktion here() (in Ihre R-Skript mit Strg+/Cmd+Eingabe). Was geschieht in der Konsole?

A.1.3 Rechnen in R

  1. Versuchen Sie, die folgenden Berechnungen in der Konsole auszuführen:
# Addition
16+32
[1] 48
# Multiplikation
16*32
[1] 512
# Subtraktion
16-32
[1] -16
# Division
16/32
[1] 0.5
  1. Schreiben Sie diese Berechnungen in Ihr Skript, und drücken Sie Cmd/Strg-Eingabe, um sie auszuführen. Was passiert?

A.1.4 Rechnen mit Objekte und Funktionen

  1. Speichern Sie die Werte 16 und 32 als Objekte namens x bzw. y.

  2. Versuchen Sie, die Funktion mean() mit Ihren gespeicherten Variablen (x und y) als “verkettete” Argumente auszuführen (d.h., mit c()).

  3. Machen Sie dasselbe mit der Funktion sum(). Was passiert, wenn Sie c() nicht verwenden?

A.1.5 Vektoren

  1. Erstelle einen Vektor namens vec1, der die Werte 12, 183, 56, 25 und 18 enthält
  2. Erstellen Sie einen Vektor namens vec2, der die Werte 8, 5, 1, 6 und 8 enthält
  3. Create a vector called vec3 that contains the values 28, 54, 10, 13, 2, and 81
  4. Finde die Summe von vec1.
  5. Finde die Summe von vec1 plus vec2. Wie unterscheidet sich das Ergebnis von dem, das Sie für vec1 allein erhalten haben?
  6. Was passiert, wenn du versuchst, die Summe von vec1 und vec3 zu finden?

A.2 Datenvisualierung 1

Diese Übungen finden sich auch in Kapitel 2.

A.2.1 Kombination von Plots mit Patchwork

  1. Reproduzieren Sie unser Histogramm als Dichte-Diagramm, indem Sie geom_histogram() durch geom_density() ersetzen.

    • Was zeigt diese Art der Darstellung?
  2. Erstellen Sie ein Balkendiagramm, das die Anzahl der Beobachtungen pro Wortklasse zeigt (Hinweis: Sie benötigen die Variable Class aus unserem Datensatz).

  3. Drucken Sie Ihren Dichteplot und Ihren Klassen-Balkenplot übereinander mit Hilfe des patchwork Pakets

A.2.2 Reproduzieren eines Plots

  1. Reproduzieren Sie die folgenden Diagramme so genau wie möglich (Hinweis: Sie benötigen das Argument position = "dodge"):
Abbildung A.1: zu reproduzierende Abbildung

A.3 Quarto

Diese Übungen finden sich auch in Kapitel 3.

A.3.1 Schreiben und Formatieren eines Quarto-Dokuments

  1. Führen den folgenden Code in der Konsole aus: RStudio.Version()$version
    • wenn die ausgegebene Version 2022.07 oder höher ist, können Sie Quarto benutzen
    • wenn nicht, aktualisieren Sie RStudio: Help > Check for updates
  2. Erstellen Sie in Ihrem R-Projekt-Ordner, in dem ihr Ihre Kursunterlagen/Notizen aufbewahren, einen neuen Ordner für Woche 3
  3. File > New Document > Quarto Document
    • Geben Sie ihm einen Titel wie “Quarto - Woche 3”
    • Deaktivieren Sie die Option “open with Visual Editor”.
  4. Schauen das neue Skript an, um mehr über Quarto zu erfahren.
  5. Klicken Sie auf die Schaltfläche “Render” am oberen Rand des Dokuments
    • Speichern Sie das Dokument in dem Ordner für Woche 3, den Sie gerade erstellt haben.
    • Was geschiehen? Vergleichen die Ausgabe mit dem Quellcode des Dokuments.
  6. Gehen Sie zurück zu Ihrem neuen Ordner 03-quarto
    • Was hat sich geändert?

in der YAML…

  1. Ändern Sie den Titel, wenn Sie das tun möchten.
  2. Raten Sie, wie man einen “Untertitel” (EN: subtitle) hinzufügen könnte (Hinweis: es ist ähnlich wie beim Hinzufügen eines title)
  3. Fügen Sie einen Autor hinzu, Autor: "vorname nachname" (siehe Beispiel unten)
  4. Füge ein Inhaltsverzeichnis hinzu (EN: Table of Contents, toc), indem du format so änderst, dass es wie folgt aussieht:
---
title: "Quarto - Woche 3"
author: "Vorname Nachname"
format:
  html:
    toc: true
---
  1. Rendern nun das Dokument. Sehen Sie Ihre Änderungen?

  2. Fügen Sie Ihrem Dokument einige Überschriften und Texte hinzu, die das Format und die Struktur von Quarto-Dokumenten beschreiben. Fügen Sie beispielsweise eine Überschrift mit dem Titel “YAML” ein, die kurz beschreibt, wie YAML formatiert ist.

  3. Fügen Ihrem .qmd Dokumententext eine Textformatierung hinzu.

  4. Fügen eine Aufzählungsliste hinzu

  5. Fügen eine nummerierte Liste hinzu

  6. Rendern Sie das Dokument. Hat es geklappt?

A.3.2 Kodierung in einem Quarto-Dokument

A.3.2.1 Code chunks

  1. Fügen Sie einen Code Chunk zu deiner .qmd Datei hinzu
    • Fügen Sie einige mathematische Operationen ein (Addition, Subtraktion, etc)
    • Fügen Sie informative Anmerkungen zu Ihrem Code hinzu (z.B. ## Addition)
  2. Fügen Sie einen Text unter deinem Code-Chunk hinzu, der beschreibt, was der obige Code erreicht hat.
  3. Rendern Sie das Dokument. Hat es geklappt?

A.3.2.2 Concatenate

Erinnern Sie sich, dass wir letzte Woche die Funktion c() (EN: concatenate) gesehen haben, die mehrere Werte kombiniert (z.B. mean(c(3,4,25)) ergibt den Mittelwert von 3,4 und 25)

  1. In einem Code-Stück: Erstellen sie ein Objekt, das eine Liste von Zahlen enthält (z.B. Objektname <- c(...))
  2. Berechnen Sie den Mittelwert dieser Zahlen, indem Sie nur den Objektnamen verwendt.
  3. Speichern Sie den Mittelwert dieser Zahlen als ein Objekt
  4. Rendern Sie das Dokument und seht sich den Abschnitt mit Ihrem Code-Chunk an.
    • Ändern Sie nun im Quellcode die Chunk-Einstellungen auf echo: false und rendern das Dokument. Was ändert sich?
    • Setzen Sie nun echo: true, aber eval: false. Rendern das Dokument. Was ändert sich?

A.3.3 Plots in Quarto

  1. Einen neuen Codeabschnitt erstellen und das Balkendiagramm von letzter Woche erzeugen, aber als Objekt speichern
    • stellen Sie sicher, dass Sie alle erforderlichen Pakete oder Datensätze laden
  2. In einem separaten Codechunk nur den Objektnamen dieses Diagramms angeben
  3. Rendern Sie das Dokument, um zu sehen, wo die Abbildung gedruckt wurde.

A.3.4 Ausgabeformate

  1. Ersetzen Sie html in der YAML durch revealjs. Rendert das Dokument.
    • Schauen Sie den Ordner für die Notizen dieser Woche an. Welche Dateien seht?
  2. Setzen Sie nun format auf pdf. Rendert das Dokument.
    • Läuft es?
    • Versuchen Sie, pdf durch den Buchstaben l zu ersetzen. R schlägt eine Vervollständigung vor, welche ist es? Wähle sie aus und rendere das Dokument.
  3. Setzen Sie das Format wieder auf html. Rendert das Dokument.
  4. Gehen Sie zurück zu Ihrem Ordner mit den Notizen dieser Woche. Welche Dateien seht?
    • Ist die Ausgabe von revealjs dort?
  5. Fügen Sie eine “Session Info” Abschnitt am Ende des Dokuments hin.

A.4 Data Wrangling 1: Transformation

Diese Übungen finden sich auch in Kapitel 4. Befolgen Sie die Einrichtung aus diesem Kapitel, um diese Übungen zu bearbeiten Kapitel 4.1.

A.4.1 Pipes und Zeilen

  1. in einer einzigen Pipeline df_lexdec für Zeilen drucken, die jede der folgenden Bedingungen erfüllen:
  • die Reaktionszeiten (RT) waren größer als 500ms und kleiner als 550ms
  • aus den Wörtern (Word) pear, elephant oder tortoise stammen
  • und ordnen Sie sie in der Reihenfolge der Reaktionszeiten (RT) (kleinste bis größte)
  1. Sortiere (arrange()) df_lexdec in absteigender Reihenfolge (desc()), um die Versuche mit den längsten Reaktionszeiten zu finden.

A.4.2 Spalten

  1. Speichern Sie in einer einzigen Pipeline ein neues Objekt namens df_rz, das df_lexdec enthält, und dann (|>):
    • Erstellen Sie nochmal eine neue Variable (mit mutate()) namens rz_s (siehe ex. 4.4: RT durch 1000 dividieren), und dann (|>)
    • Selektieren (mit select()) Sie die Variablen Subject, NativeLanguage, Word, rz_s, Length, und Frequency, und dann (|>)
    • Erstelle eine neue Variable rz_s_laenge (mit mutate()), die rz_s geteilt durch Length ist, und dann (|>)
      • und wird vor Length gesetzt (mit relocate()), und dann (|>)
    • Benennen (mit rename()`) Sie diese Variablen in Englisch um, so dass sie in Deutsch (und mit Kleinbuchstaben) sind
  1. Die ersten 6 Zeilen von df_rz ausgeben (Tipp: head() verwenden).

A.5 Datavisualisierung 2: Beziehungen

Diese Übungen finden sich auch in Kapitel 5. Befolgen Sie die Einrichtung aus diesem Kapitel, um diese Übungen zu bearbeiten Kapitel 5.1.

A.5.1 Visualisierung von Beziehungen

    1. Zeichnen Sie abweichende Balkenplots von AgeSubject (x-Achse) nach CV (Facetten).
    2. Ändern Sie Ihre Code-Chunk-Optionen für den letzten Plot so, dass der Code, aber nicht der Plot, in der Ausgabe gedruckt wird.
  1. Filtern Sie die Daten, um nur ältere Teilnehmer einzuschließen, und stellen Sie RTlexdec (x-Achse) durch RTnaming (y-Achse) dar. Übertragen Sie CV auf Farbe (colour) und Form (shape). Fügen Sie geeignete Beschriftungen hinzu.
    1. Ändern Sie die Code-Chunk-Optionen für den letzten Plot so, dass der Plot, aber nicht der Code, in der Ausgabe gedruckt wird.

A.5.2 ggsave()

  1. Speichern Sie den letzten Plot lokal und stellen Sie den Code Chunk so ein, dass er beim Rendern nicht ausgeführt wird.

A.6 Dateneinlesung

Diese Übungen finden sich auch in Kapitel 6 Befolgen Sie die Einrichtung aus diesem Kapitel, um diese Übungen zu bearbeiten Kapitel 6.1.

Nun wollen wir üben, das Paket readr zu benutzen und mit unseren Daten zu arbeiten.

readr Funktionen

  1. Welche Funktion würdest du benutzen, um eine Datei zu lesen, in der die Felder mit “|” getrennt sind?
  2. Welche Argumente haben read_csv() und read_tsv() gemeinsam?
  3. Welche Funktion(en) könnten Sie verwenden, um einen Datensatz mit einem Semikolon (;) als Trennzeichen einzulesen?

Data wrangling

Laden Sie die Datei groesse_geburtstag.csv erneut. Benutzen Sie Pipes, um auch die Funktion clean_names zu benutzen, und um die folgenden Änderungen im Objekt df_groesse vorzunehmen.

  1. Umwandlung der Variablen l1 in einen Faktor.
  2. Umbenennen von
  • grosse in groesse
  • was_fur_ein_haustier in haustierart

Plots

  1. Erstelle ein Streudiagramm mit unserem df_groesse-Datensatz, das die Beziehung zwischen unserem Geburtsmonat und unseren Größe visualisiert (es macht keinen Sinn, dies zu vergleichen, aber es ist nur eine Übung). Suchen Sie Ihren Geburtstag in der Grafik. Stellen Sie die Farbe und die Form so ein, dass sie “L1” entsprechen. Fügen Sie einen Titel für die Grafik hinzu.
  1. Ein Balkendiagramm erstellen, das die Häufigkeit der verschiedenen Haustierarten zeigt. Auf der x-Achse wollen wir haustierart. Um die Visualisierung zu erleichtern, fügen Sie haustierart auch als fill in die Ästhetik ein. Geben Sie geeignete Diagramm- und Achsentitel mit lab(...) an. What is the most frequent pet type?

A.7 Deskriptive Statistik

Diese Übungen begleiten Kapitel 7. Um diese Aufgaben zu erledigen, müssen Sie die Pakete tidyverse, janitor und here laden, sowie den Datensatz languageR_english.csv, wie es in Kapitel 7.1.

A.7.1 Standardabweichung

  1. Berechnen Sie die Standardabweichung der Werte 152, 19, 1398, 67, 2111, ohne die Funktion sd() zu benutzen.
    • zeige deine Arbeit. Die folgende R-Syntax könnte nützlich sein (je nachdem, wie Sie es machen wollen):
      • c()
      • mean()
      • x^2 berechnet das Quadrat eines Wertes (hier, x)
      • sqrt() berechnet die Quadratwurzel
      • length() liefert die Anzahl der Beobachtungen in einem Vektor
  1. Benutze die Funktion sd(), um die Standardabweichung der obigen Werte zu drucken. Haben Sie es richtig gemacht?

A.7.2 summary()

  1. Benutze summarise, um den Mittelwert, die Standardabweichung und die Anzahl der Beobachtungen für rt_naming im df_eng Datenrahmen zu drucken.
    • Hinweis: Müssen Sie fehlende Werte (NA) entfernen?
  1. Machen Sie dasselbe, aber fügen Sie das Argument .by() hinzu, um die mittlere Reaktionszeit der Benennungsaufgabe (rt_naming) pro word_category zu ermitteln
    • Ordnen Sie die Ausgabe nach der mittleren Antwortzeit für die Namensgebung an.

A.8 Datenvisualisierung 3

Diese Übungen begleiten Kapitel 8. Um diese Aufgaben zu erledigen, müssen Sie die Pakete tidyverse, janitor und here laden, sowie den Datensatz languageR_english.csv, wie es in Kapitel 8.1.

A.8.1 Boxplot mit Facette

  1. Erzeugen Sie einen Plot namens fig_boxplot, der ein Boxplot der df_eng Daten ist, mit:
    • age_subject auf der x-Achse
    • rt_naming auf der y-Achse
    • age_subject als colour oder fill (wähle eine, es gibt keine falsche Wahl)
    • word_category in zwei Facetten mit facet_wrap() aufgetragen
    • die von Ihnen gewählte theme_-Einstellung (z.B. theme_bw(); für weitere Optionen siehe hier)

A.8.2 Errorbar plot

  1. Versuchen Sie, Abbildung A.2 zu reproduzieren. Hinweis: Sie werden die Variable rt_naming aus df_eng verwenden.
Abbildung A.2: Plot to be reproduced

A.8.3 Patchwork

  1. Verwenden Sie das Paket patchwork, um Ihren Boxplot und Ihre Fehlerbalkenplots nebeneinander darzustellen. Es sollte ungefähr so aussehen wie Abbildung A.3. Hinweis: Wenn Sie die “tag-level” (“A” und “B”) zu den Plots hinzufügen möchten, müssen Sie + plot_annotation(tag_level = "A") aus patchwork hinzufügen.
Abbildung A.3: Combined plots with patchwork

A.9 Data Wrangling 2

Diese Übungen begleiten Kapitel 9. Um diese Aufgaben zu erledigen, müssen Sie die Pakete tidyverse, janitor und here laden, sowie den Datensatz languageR_english.csv (df_eng), wie es in Kapitel 9.1.

A.9.1 pivot_longer() |> summarise()

  1. Erstellen Sie df_eng_long (wie in Kapitel 9.5.1). Verwenden Sie dann die Funktion summarise(), um die folgenden zusammenfassenden Statistiken zu erstellen:
# A tibble: 2 × 3
  response   mean    sd
  <chr>     <dbl> <dbl>
1 rt_lexdec  708.  115.
2 rt_naming  566.  101.

Hinweis: Müssen Sie NA entfernen (wir haben im letzten Kapital gesehen, wie man das macht)?

A.9.2 pivot_wider()

  1. Verwenden Sie pivot_wider, um mit rt_naming neue Variablen zu erstellen: naming_old und naming_young, die die Reaktionszeiten beim Benennen für alte bzw. junge Teilnehmer enthalten. Hinweis: Sie müssen rt_lexdec entfernen. Speichern Sie den Datenrahmen als df_eng_wider als Objekt. Der resultierende Datenrahmen sollte 2284 Beobachtungen und 6 Variablen enthalten.
  1. Erstellen Sie Abbildung A.4 mit df_eng_wider.
Abbildung A.4: Scatterplot of naming task reaction times per word for old versus young participants
  1. Warum brauchen wir unseren df_eng_wide-Datensatz, um Abbildung A.4 zu erstellen? Mit anderen Worten, warum ist df_eng_wide die geeignete Struktur, aber nicht df_eng_long für ein solches Streudiagramm?

A.10 base R

Diese Übungen begleiten Kapitel 10. Sie brauchen keine Pakete zu laden, da diese Übungen die Verwendung von Basis-R voraussetzen. Sie sollten jedoch tidyverse laden, wenn Sie den Beispielcode ausführen wollen.

A.10.1 tidyverse zur base R

Konvertieren Sie den folgenden tidyverse-Code in Base R. Wir werden wieder den Datensatz languageR_english.csv verwenden.

Einlesung

df_eng <- 
  readr::read_csv(here::here("daten", "languageR_english.csv"))

Auswahl der Spalten

df_eng |> 
  select(Word, WrittenFrequency)
# A tibble: 10 × 2
   Word   WrittenFrequency
   <chr>             <dbl>
 1 doe                3.91
 2 whore              4.52
 3 stress             6.51
 4 pork               5.02
 5 plug               4.89
 6 prop               4.77
 7 dawn               6.38
 8 dog                7.16
 9 arc                4.89
10 skirt              5.93

Zeilen filtern

df_eng |> 
  filter(WrittenFrequency > 5.6)
# A tibble: 10 × 7
   AgeSubject Word   LengthInLetters WrittenFrequency WordCategory RTlexdec
   <chr>      <chr>            <dbl>            <dbl> <chr>           <dbl>
 1 young      stress               6             6.51 N                547.
 2 young      dawn                 4             6.38 N                584.
 3 young      dog                  3             7.16 N                527.
 4 young      skirt                5             5.93 N                536.
 5 young      are                  3            11.3  N                611.
 6 young      pipe                 4             6.00 N                563.
 7 young      guard                5             6.59 N                559.
 8 young      slope                5             5.80 N                633.
 9 young      pile                 4             6.16 N                595.
10 young      tide                 4             6.08 N                598.
# ℹ 1 more variable: RTnaming <dbl>

Auswahl von Zeilen und Spalten

df_eng |> 
  filter(WrittenFrequency > 5.6 & AgeSubject == "old") |> 
  select(AgeSubject, Word, WrittenFrequency) 
# A tibble: 10 × 3
   AgeSubject Word   WrittenFrequency
   <chr>      <chr>             <dbl>
 1 old        stress             6.51
 2 old        dawn               6.38
 3 old        dog                7.16
 4 old        skirt              5.93
 5 old        are               11.3 
 6 old        pipe               6.00
 7 old        guard              6.59
 8 old        slope              5.80
 9 old        pile               6.16
10 old        tide               6.08

Streudiagramm

df_eng |> 
  ggplot() +
  aes(x = WrittenFrequency, y = RTlexdec) +
  geom_point()

Tidyverse versus Base R

Wie ist Ihr Eindruck von Base R im Vergleich zu Tidyverse? Würden Sie, basierend auf dem, was Sie gesehen haben, das eine dem anderen vorziehen, oder würden Sie das eine nur in bestimmten Fällen vorziehen? Hier gibt es keine richtige Antwort.

A.11 Datenvisualisierung 4

Diese Übungen begleiten Kapitel 11. Um diese Aufgaben zu erledigen, müssen Sie die Pakete tidyverse, janitor, here, und patchwork laden, sowie den Datensatz languageR_english.csv (df_eng), wie es in Kapitel 11.1.

A.11.1 Mehrteilige Darstellung

  1. Erzeugen von Abbildung 11.9 und Abbildung 11.5 für rt_naming (anstelle von rt_lexdec). Drucken der Plots nebeneinander mit patchwork.

A.11.2 Beschriftungen

  1. Benutzen Sie labs(), um Beschriftungen für den Titel, die x- und y-Achse und für die von Ihnen verwendete Ästhetik (Form, Farbe, etc.) hinzuzufügen, die in einer Legende resultieren. Dies sollte damit enden, dass der Titel der Legende auch einen eigenen Namen erhält.

A.11.3 Anpassungen

  1. Fügen Sie den beiden Diagrammen Anpassungen hinzu, indem Sie ein Standardthema wählen, gefolgt von theme() mit Anpassungen für die Achsentitel, den Legendentitel und den Diagrammtitel. Sie können face, size, colour, family (d.h. Schriftart) ändern. Sie können ?theme in der Konsole eingeben oder googeln, um einige Ideen zu bekommen. Wenn Sie sich nicht kreativ fühlen, versuchen Sie einfach, eine der Anpassungen zu replizieren, die Sie in Abbildung 11.10 sehen
Literaturverzeichnis