```{r}
#| label: optionen-zeigen
werte <- c(12.1, 14.3, 11.8, 15.0, 13.6)
round(mean(werte), 2)
```[1] 13.36
#|-Zeilen im Chunk und steuern, was sichtbar wirdfig-, tbl-, sec-freeze spart Rechenzeit, merkt aber nicht, wenn sich nur die Daten ändernVorwissen: Warum Text und Rechnung in dieselbe Datei gehören, steht unter Reproduzierbarkeit. Diese Seite beschreibt das Werkzeug selbst. Sie ist mit Quarto gebaut, und die Chunks unten laufen beim Rendern tatsächlich.
Quarto ist ein Kommandozeilenprogramm von Posit und der Nachfolger von R Markdown. Es liest eine .qmd-Datei, lässt den Code von einer Engine ausführen und übergibt das Ergebnis an Pandoc, das daraus das Zielformat erzeugt. Zwei Engines sind üblich:
| Engine | Wann | Eigenheit |
|---|---|---|
| knitr | sobald ein R-Chunk im Dokument steht | Python läuft über reticulate in derselben Sitzung mit; Inline-Code mit r |
| jupyter | reines Python-Dokument oder .ipynb |
Inline-Code in der Form {python} |
RStudio, Positron und VS Code rufen Quarto nur auf. Installiert wird es einmal von quarto.org, in RStudio ist es bereits dabei.
Der Kopf zwischen den drei Strichen legt Titel und Format fest. Darunter steht gewöhnliches Markdown. Code-Chunks beginnen mit der Sprache in geschweiften Klammern; die Zeilen mit #| am Anfang sind Optionen für diesen Chunk.
Mit echo: fenced zeigt Quarto einen Chunk samt seinen Optionen. So sieht der folgende Chunk im Quelltext aus, und darunter steht, was er beim Rendern ausgibt:
[1] 13.36
Die Optionen, die man ständig braucht:
| Option | Wirkung |
|---|---|
label |
Name des Chunks; mit fig- oder tbl- davor auch Ziel für Querverweise |
echo: false |
Code ausblenden, Ergebnis zeigen |
eval: false |
Code zeigen, nicht ausführen |
include: false |
ausführen, aber weder Code noch Ergebnis zeigen, etwa für das Laden von Paketen |
output: false |
ausführen, Code zeigen, Ergebnis ausblenden |
warning: false, message: false |
Warnungen und Paketmeldungen unterdrücken |
fig-cap, fig-width, fig-height |
Bildunterschrift und Grösse einer Grafik |
Was für alle Chunks gelten soll, gehört einmal in den Kopf unter execute: statt in jeden Chunk.
| Format | Kopfzeile | Voraussetzung |
|---|---|---|
| Webseite | format: html |
nichts |
| PDF über Typst | format: typst |
nichts, Typst ist in Quarto enthalten |
| PDF über LaTeX | format: pdf |
eine LaTeX-Installation, am einfachsten quarto install tinytex |
| Word | format: docx |
nichts; Vorlage über reference-doc |
| Folien | format: revealjs |
nichts, Ergebnis ist eine HTML-Datei |
| Dashboard | format: dashboard |
nichts |
Mehrere Formate gleichzeitig sind möglich; quarto render bericht.qmd erzeugt dann alle.
Querverweise funktionieren nur mit dem richtigen Präfix im Label. Ein Chunk mit label: verlauf und ein Verweis @verlauf ergeben im Text ein Fragezeichen; richtig ist label: fig-verlauf und @fig-verlauf, was als „Abbildung 1” erscheint. Dasselbe gilt für Tabellen mit tbl- und Abschnitte mit sec-.
Zwei Bausteine ohne Code:
Der erste setzt einen hervorgehobenen Hinweiskasten, der zweite macht aus den Überschriften darin anklickbare Reiter. Diese Sammlung verwendet Reiter für jedes Beispiel in R und Python.
freezeEine Datei _quarto.yml im Ordner macht aus mehreren Dokumenten ein Projekt. Dort stehen gemeinsame Einstellungen, bei einer Website auch Navigation und Seitenleiste. quarto render rendert dann alles, quarto preview startet einen lokalen Server und rendert bei jedem Speichern neu.
In Projekten mit viel Rechenzeit hilft freeze: auto unter execute:. Quarto speichert die Ergebnisse jedes Dokuments im Ordner _freeze und rechnet es nur neu, wenn sich die Quelldatei geändert hat.
Genau darin liegt die Falle: Ändert sich nur die eingelesene Datendatei, bleibt das Dokument unverändert, und Quarto zeigt die alten Ergebnisse. Nach neuen Daten den passenden Ordner unter _freeze löschen; beim nächsten Rendern wird das Dokument dann neu gerechnet.
Ein Bericht verweist mit @verlauf auf eine Grafik, deren Chunk #| label: verlauf trägt. Im gerenderten Dokument steht statt „Abbildung 1” nur ?@verlauf. Was fehlt?
fig- im Label und im Verweis
label: fig-verlauf und @fig-verlauf lösen das. Eine Bildunterschrift mit fig-cap gehört dazu.
echo: true haben
Ein Website-Projekt nutzt freeze: auto. Die CSV-Datei mit den Daten wurde ersetzt, das Dokument nicht angefasst. Was zeigt die Website nach dem nächsten Rendern?
freeze: auto rechnet nur neu, wenn sich die .qmd-Datei ändert. Eine Änderung an eingelesenen Dateien bemerkt es nicht. Den Ordner des Dokuments unter _freeze löschen, dann wird neu gerechnet.
Ein Chunk lädt nur Pakete und setzt Einstellungen. Weder Code noch Ausgabe sollen im Dokument erscheinen, ausgeführt werden muss er trotzdem. Welche Option passt?
include: false
eval: false
echo: false
Ein Dokument rendern und laufend ansehen
PDF ohne LaTeX
Einstellungen für alle Chunks festlegen
Neues Website-Projekt anlegen
Website auf GitHub Pages veröffentlichen
Der Befehl rendert und schreibt das Ergebnis in den Zweig gh-pages, aus dem GitHub Pages die Website ausliefert. Automatisch bei jedem Push geht es mit einer GitHub Action; diese Sammlung wird so gebaut.
Freeze für ein einzelnes Dokument aufheben