Reproduzierbare Berichte, Analysen und Präsentationen mit Quarto (.qmd)
Quarto ist der Nachfolger von R Markdown. Eine .qmd-Datei kombiniert Text (Markdown), Code (R, Python, etc.) und Ergebnisse (Plots, Tabellen) in einem Dokument. Beim Rendern wird daraus HTML, PDF oder Word.
• Reproduzierbar: Code + Text in einer Datei
• Mehrere Ausgabeformate (HTML, PDF, Word)
• Automatische Nummerierung (Figures, Tables)
• Einfache Zusammenarbeit via Git
# Typischer Ablauf: 1. Datei erstellen: analyse.qmd 2. Text + Code schreiben 3. Rendern → HTML/PDF/Word 4. Abgeben oder teilen
Jede Quarto-Datei hat drei Bestandteile:
--- title: "Meine Analyse" # YAML-Header format: html --- ## Einleitung <-- Markdown-Text Hier steht normaler Text mit **fett** und *kursiv*. ```{r} <-- Code Chunk #| label: fig-scatter library(tidyverse) ggplot(mtcars, aes(wt, mpg)) + geom_point() ```
Ctrl+Alt+I fügt einen neuen Code Chunk ein.Der YAML-Block steht zwischen --- Zeichen und steuert Titel, Format und globale Optionen.
--- title: "Hausarbeit Block 2" author: "Max Muster" date: today format: html ---
--- title: "Regression Analysis" author: "Anna Beispiel" date: today format: html: toc: true # Inhaltsverzeichnis code-fold: true # Code einklappbar code-tools: true # Code-Toolbar theme: cosmo # Bootstrap-Theme execute: warning: false # Warnungen ausblenden message: false # Meldungen ausblenden ---
--- format: pdf: documentclass: article geometry: "margin=2.5cm" ---
R-Code steht in Chunks, die mit ```{r} beginnen und mit ``` enden.
```{r} mean(c(3, 7, 5, 9)) # Ergebnis: 6 ```
#|)```{r} #| label: daten-laden #| echo: true #| warning: false library(tidyverse) df <- read_csv("daten.csv") glimpse(df) ```
#| (Hash-Pipe) für Chunk-Optionen, nicht die alte R-Markdown-Syntax {r echo=FALSE}.| Option | Wert | Beschreibung |
|---|---|---|
#| echo: false | true/false | Code anzeigen? |
#| eval: false | true/false | Code ausführen? |
#| output: false | true/false/asis | Ergebnis anzeigen? |
#| warning: false | true/false | Warnungen anzeigen? |
#| message: false | true/false | Meldungen anzeigen? |
#| error: true | true/false | Fehler trotzdem zeigen? |
#| include: false | true/false | Code + Ergebnis komplett ausblenden |
#| cache: true | true/false | Ergebnis cachen (schneller) |
```{r} #| echo: false summary(df) ```
```{r} #| eval: false install.packages("tidyverse") ```
--- execute: echo: false # Gilt für ALLE Chunks warning: false ---
Einzelne Chunks können globale Optionen überschreiben:
```{r} #| echo: true # Nur dieser Chunk zeigt Code head(df) ```
Ergebnisse direkt im Text einbetten mit `r ausdruck`:
Der Datensatz hat `r nrow(df)` Zeilen und `r ncol(df)` Spalten. Der Mittelwert ist `r round(mean(df$umsatz), 2)` CHF.
Ergebnis: «Der Datensatz hat 100 Zeilen und 5 Spalten. Der Mittelwert ist 4523.17 CHF.»
```{r} #| label: fig-scatter #| fig-cap: "Zusammenhang zwischen Gewicht und Verbrauch" #| fig-width: 6 #| fig-height: 4 ggplot(mtcars, aes(wt, mpg)) + geom_point(color = "#3333B2") + geom_smooth(method = "lm") + labs(x = "Gewicht (1000 lbs)", y = "Meilen/Gallone") ```
| Option | Beschreibung | Beispiel |
|---|---|---|
#| label: fig-xxx | Label für Cross-Reference | fig-scatter |
#| fig-cap: | Bildunterschrift | "Scatter Plot" |
#| fig-width: | Breite in Zoll | 6 |
#| fig-height: | Höhe in Zoll | 4 |
#| fig-align: | Ausrichtung | center |
#| layout-ncol: | Plots nebeneinander | 2 |
```{r} #| label: fig-vergleich #| fig-cap: "Vergleich: Histogram vs. Boxplot" #| layout-ncol: 2 ggplot(df, aes(umsatz)) + geom_histogram(bins = 20) ggplot(df, aes(gruppe, umsatz)) + geom_boxplot() ```
| Variable | Mittelwert | SD | |------------|-----------|-------| | Umsatz | 4523 | 1205 | | Werbung | 2800 | 890 |
```{r} #| label: tbl-summary #| tbl-cap: "Deskriptive Statistik" df %>% summarize( M = mean(umsatz), SD = sd(umsatz), N = n() ) %>% knitr::kable(digits = 2) ```
tbl- beginnen (z.B. tbl-summary), damit Quarto sie nummeriert.Verweise auf Figures und Tables im Text:
Wie in @fig-scatter zu sehen, sinkt der Verbrauch mit steigendem Gewicht. Die Ergebnisse fasst @tbl-summary zusammen.
Ergebnis: «Wie in Figure 1 zu sehen, sinkt der Verbrauch mit steigendem Gewicht. Die Ergebnisse fasst Table 1 zusammen.»
| Typ | Label-Prefix | Verweis |
|---|---|---|
| Figure | fig- | @fig-scatter |
| Table | tbl- | @tbl-summary |
| Equation | eq- | @eq-regression |
| Section | sec- | @sec-methoden |
# Klick auf "Render" Button # oder Shortcut: Ctrl + Shift + K
# HTML erzeugen quarto render analyse.qmd # PDF erzeugen quarto render analyse.qmd --to pdf # Word erzeugen quarto render analyse.qmd --to docx
--- title: "Block 2: Inferenz-Analyse" author: "Vorname Nachname" date: today format: html: toc: true code-fold: true self-contained: true # Eine einzige HTML-Datei execute: warning: false message: false --- ## Setup ```{r} library(tidyverse) library(infer) df <- read_csv("daten.csv") ``` ## Explorative Analyse Der Datensatz hat `r nrow(df)` Beobachtungen. ```{r} #| label: fig-verteilung #| fig-cap: "Verteilung der Zielvariable" ggplot(df, aes(y)) + geom_histogram(bins = 20) ``` ## Ergebnisse Wie @fig-verteilung zeigt, ist die Variable annähernd normalverteilt.
self-contained: true im YAML (alles in einer Datei)warning: false und message: false global gesetztfig-cap und labeltbl-cap und labelC:/Users/...)
• Quarto: Using R — Offizielle Dokumentation
• R for Data Science: Quarto — Hadley Wickham
• Quarto Cheat Sheet — Posit/RStudio
• Cross References — Quarto Docs
• Execution Options — Chunk-Optionen Referenz