Kapitel 10 Berichte

Scripte schreiben ist schön und gut, aber das was dabei rauskommt ist in erster Linie ein Haufen Konsolen-Output, gespickt mit Plots, die ihr ggf. manuell speichern müsst, und dann wollt ihr das in eure krummen Word-Dokumente stecken und das will doch niemand. In SPSS ist das einfach. Ihr drückt den großen bunten Knopf wo “Mach mal Statistik” draufsteht und dann fallen da PDFs raus. In R ist das anders. Habt ihr vermutlich gemerkt. Das erste Output, das ihr mit R erzeugt wird wahrscheinlich nicht besonders hübsch aussehen — das ist schade, aber es ist nunmal auch die einfachste Art. Was in der Konsole passiert, kann auch problemlos auf großen Servern in der CloudTM passieren und ferngesteuert werden — bei SPSS bleibt euch nur Remotedesktop-Kram. Aber ich schweife ab. Das schöne an R ist jedenfalls die Flexibilität, die wir beim Output haben. Vielleicht habt ihr den Abschnitt zu sjPlot im Kapitel zu Packages schon gelesen, und wie die sjt.*-Funktionen hübsche Tabellen produzieren. Diese Tabellen sind HTML — dasselbe Zeug, aus dem Webseiten zusammengesteckt werden, und auch dasselbe Zeug, das so grob auch in Word-Dokumenten steckt. Wir können auch gleich eine ganze Analyse in HTML produzieren, mit Plots an den richtigen stellen und Tabellen in schön!

Wie das funktioniert soll in diesem Kapitel erklärt werden. Als Vorraussetzung bzw. further reading könnt ihr euch bei diesen RStudio-Ressourcen umschauen:

10.1 Markdown

Habt ihr schonmal HTML gesehen? So mit <html><body><p>Hallo Welt</p></body></html>?
Den Scheiß will kein Mensch per Hand schreiben, wenn’s nur um Text und vielleicht mal Bilder geht.
Dafür gibt es Markdown.
Markdown zu lernen wird euch ungefähr 5 Minuten kosten, wenn ihr euch Zeit lasst und zwischendurch nochmal auf Klo geht.

Der obige Paragraph sieht im Markdown-Rohtext übrigens so aus:

Habt ihr schonmal HTML gesehen? So mit `<html><body><p>Hallo Welt</p></body></html>`?  
Den Scheiß will *kein Mensch* per Hand schreiben, wenn's nur um Text und vielleicht mal Bilder geht.  
Dafür gibt es [Markdown](http://rmarkdown.rstudio.com/authoring_basics.html).  
Markdown zu lernen wird euch **ungefähr 5 Minuten** kosten, _wenn_ ihr euch Zeit lasst und zwischendurch nochmal auf Klo geht.

Nicht so schwer, oder?
Das wird übersetzt in folgendes HTML:

<p>Habt ihr schonmal HTML gesehen? So mit <code>&lt;html&gt;&lt;body&gt;&lt;p&gt;Hallo Welt&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</code>?<br />
Den Scheiß will <em>kein Mensch</em> per Hand schreiben, wenn’s nur um Text und vielleicht mal Bilder geht.<br />
Dafür gibt es <a href="http://rmarkdown.rstudio.com/authoring_basics.html">Markdown</a>.<br />
Markdown zu lernen wird euch <strong>ungefähr 5 Minuten</strong> kosten, <em>wenn</em> ihr euch Zeit lasst und zwischendurch nochmal auf Klo geht.</p>

Anstrengend.

Was RStudio euch mittels RMarkdown erlaubt ist ein Bericht in Markdown geschrieben, zwischendurch mit R Code Chunks, die von R einfach ausgeführt werden, und am Ende fällt eine HTML-Datei raus, die ihr einfach im Browser öffnen könnt.
Optional könnt ihr da auch ein PDF rausfallen lassen, aber das erfordert möglicherweise rudimentäre LaTeX-Kenntnisse, und das will ja niemand.

10.2 RMarkdown

RMarkdown ist R + Markdown. Jip.
Ihr schreibt ganz normales Markdown, und wenn ihr R Code einfügen wollt, setzt ihr da so einen Block rein:

```{r}
nrow(sleep)
```

Und in eurem fertigen Dokument landet dann euer Text und der R Code und das Output des R-Codes.
Diese ganze Einführung ist in RMarkdown geschrieben, inklusive allen Code-Beispiele, Bildern und sowieso, und wenn ihr euch erstmal ein bisschen durch die oben verlinkte Einführung geklickt habt und gesehen habt, dass das gar nicht so schwer ist, werdet auch ihr irgendwann vermutlich lieber RMarkdown benutzen als Word.

Ihr könnt damit loslegen, sobald ihr RMarkdown installiert habt:

# Für die Grundfunktion
install.packages("rmarkdown")

# Schöne Output-Formate (optional)
install.packages("rmdformats")

# Schöne Präsentationen (Optional)
install.packages("revealjs")

Also los, macht mal ein neues RMarkdown-Dokument auf:

Neues Dokument f&uuml;r RMarkdown

Abbildung 10.1: Neues Dokument für RMarkdown

Soweit alle mitgekommen? Gut.
Als nächstes dürft ihr euch was wünschen: Einen Dateinamen und einen AutorInnennamen.

Beliebig ausfüllen und "HTML" ausgewählt lassen

Abbildung 10.2: Beliebig ausfüllen und “HTML” ausgewählt lassen

Und sieheda, ein RMarkdown default document:

---
title: "Untitled"
author: "Lukas"
date: "8/15/2017"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

## R Markdown

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see <http://rmarkdown.rstudio.com>.

When you click the **Knit** button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:

```{r cars}
summary(cars)
```

## Including Plots

You can also embed plots, for example:

```{r pressure, echo=FALSE}
plot(pressure)
```

Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot.

Das könnt ihr jetzt erstmal speichern, vielleicht testhalber etwas reinschreiben und sobald ihr den “Knit”-Button drückt, rödelt RMarkdown im Hintergrund los und spuckt euch ein HTML aus.
So einfach.
Jetzt könnt ihr damit beliebig experimentieren, den Text anpassen, eigenen Code reinschreiben und wenn ihr Fragen habt, googlet ihr die einfach solange, bis ihr jemanden findet, der/die die gleiche Frage auch schon hatte und rausgefunden hat wie’s geht.
Oder es steht in der oben verlinkten Dokumentation von RStudio.
Vermutlich letzteres.

10.2.1 Der YAML-Header

Als nächstes könnt ihr ein bisschen an den Optionen rumspielen:

Output Optionen f&uuml;r diversen Kram

Abbildung 10.3: Output Optionen für diversen Kram

So Dinge wie die Dimensionen der ausgegebenen Plots (“figure height/width”), Inhaltsverzeichnis (“Table of Contents”) etc. sind einfach über dieses Menü machbar, alles was irgendwie darüberhinausgeht muss über die Optionen am Anfang des Dokuments gesetzt werden.
Das oben ist der YAML header. YAML ist auch eine Markup-Sprache wie HTML, und weil es so viele dieser Markup-Sprachen gibt, heißt YAML lang “Yet Another Markup Language”10. Es gibt auch noch HAML und TOML
Ihr erkennt das Muster.

Der Standard-Header definiert nur die wichtigstens Elemente, aber wir können den unter Anderem durch die Optionen im Menü erweitern. Ein umfangreicheres Beispiel aus einem alten QM-Aufgabenzettel sieht zum Beispiel so aus:

---
title: "Aufgabenblatt 5"
author: "Lukas"
date: "Rendered `r format(Sys.time(), '%F %H:%M')`"
output:
  html_document:
    toc: true
    toc_float: true
    toc_depth: 4
    highlight: tango
    fig_width: 9
    fig_retina: 2
    theme: yeti
    code_folding: show
    df_print: paged
---

Was euch da komisch vorkommen könnte ist der Teil mit dem date:. Das rechts daneben ist ein String mit einem inline code chunk, und alles was in RMarkdown ` r und ` steht wird wie R-Code behandelt und ausgeführt, das heißt das Datum des Dokuments wird in diesem Fall automatisch auf format(Sys.time(), '%F %H:%M') gesetzt, was folgendes ergibt:

format(Sys.time(), '%F %H:%M')
[1] "2018-11-17 18:30"

Boom, Dokument zeigt immer automatisch an, wann es zuletzt generiert (rendered, bzw. knitted) wurde.

Spitzfindigen Lesenden wird etwas aufgefallen sein: “Aber seltsamer Nerd Mensch”, werden sie sagen, “wenn dieses Dokument hier in RMarkdon geschrieben wurde, und diese inline Code chunks automatisch ausgeführt werden” werden sie feststellen, woraufhin sie sich fragen werden: “wie ist es dann möglich den rohen Code dafür hier reinzuschreiben ohne, dass er ausgeführt wird?” — und dazu, liebe hypothetische Lesende, habe ich eine Antwort: Zero-width non-joiners everywhere, vielleicht ASCII escape characters, und extra `. Ihr werdet dieses Wissen vermutlich nie brauchen, aber ich habe ~30 Minuten damit verbracht herauszufinden wie ich das anstelle, also will ich dafür auch mindestens ein bisschen street cred.


  1. Alternativ kann YAML auch für YAML Ain’t Markup Language” stehen, wenn ihr rekursive Akronyme bevorzugt