Skip to content
Christian Treffenstädt edited this page Jun 1, 2014 · 20 revisions

Skripte mit R Markdown erstellen

Was ist eigentlich Markdown?

Markdown ist eine sehr einfache Syntax, die es Benutzern erlaubt, aus einfachen Textdateien gut gelayoutete Dokumente zu erstellen. Das Arbeiten mit Markdown bietet zwar nicht so viele Layoutoptionen wie zum Beispiel Microsoft Word, aber dafür sind mit Markdown erstellte Dokumente sehr einheitlich, vergleichbar und vor allem gibt es sehr viel weniger Probleme und Fehlerquellen bezüglich des Layouts.

Viele Benutzer wollen einfach schnell Dokumente erstellen, die ein vernünftiges Layout aufweisen, ohne dabei einen hohen Aufwand betreiben zu müssen. Markdown kann in solchen Fällen eine große Hilfe sein und erfreut sich daher seit einiger Zeit sehr großer Beliebtheit. Es gibt natürlich auch andere Varianten, um mittels Syntax gelayoutete Dokumente zu erstellen. Ein prominentes Beispiel hierfür ist LaTeX, welches sehr viel mehr Gestaltungsoptionen bietet als Markdown, dafür aber auch viel komplexer und entsprechend schwerer zu Erlenen ist. Besonders, wenn es um die schnelle Erstellung ganz einfacher Dokumente geht, ist Markdown daher das Mittel der Wahl.

Um Markdowndokumente zu erstellen benötigt man im Prinzip nur einen ganz einfachen Texteditor. Wünschenswert ist allerdings ein Programm, welches zum einen die Markdown Syntax hervorhebt (Syntaxhighlighting) und zum anderen die Option bietet, aus geschriebenen Markdown Code ein gerendertes Dokument zu erstellen.

Eine Datei, die in der Markdown Syntax geschrieben wurde, wird erst durch Rendern zu einem fertig gelayouteten Dokument!

Durch das Rendern wird aus dem einfachen Textdokument eine HTML-Datei erzeugt, in der die Markdown Syntax interpretiert wird, um so das Dokument entsprechend der Anweisungen zu layouten. Wie man z.B. mit RStudio Markdowndokumente rendert, wird weiter unten in dieser Einführung erläutert.

Einführung in die Markdown Syntax

In Markdowndokumenten gibt es verschiedene Befehlszeichen, die jeweils unterschiedliche Layoutanweisungen darstellen. Im Folgenden werden die wichtigsten dieser Befehle vorgestellt und erläutert. Eine sehr gute Einführung gibt es ebenfalls auf dieser Webseite:

Markdown Cheatsheet

Textformatierung mit Markdown

  • Um Text in fetter Schrift hervorzuheben umschließt man die entsprechende Textstelle mit zwei ** auf jeder Seite:

    Aus **Beispiel** wird so Beispiel

  • Um Text in kursiver Schrift hervorzuheben umschließt man die entsprechende Textstelle mit einem * auf jeder Seite:

    Aus *Beispiel* wird so Beispiel

  • Um Text in durchgestrichen dazustellen umschließt man die entsprechende Textstelle mit zwei ~ auf jeder Seite:

    Aus ~~Beispiel~~ wird so Beispiel

  • Statt der * kann man auch Unterstriche, also _ verwenden:

    Aus __Beispiel__ wird so Beispiel

    Aus _Beispiel_ wird so Beispiel

    Aus *__Beispiel__* wird so Beispiel (Fett und gleichzeitig kursiv durch Verwenden beider Zeichen)

Listen in Markdown

Wir können durch Verwendung von * auch einfache nicht nummerierte Listen erstellen. Markdown erkennt * als Listenzeichen, wenn danach ein Leerzeichen folgt:

* Eintrag

* Eintrag

* Eintrag

wird zu:

  • Eintrag
  • Eintrag
  • Eintrag

Wir können auch nummerierte Listen erstellen, in dem wir 1., 2., 3., usw. verwenden:

1. Eintrag

2. Eintrag

3. Eintrag

wird zu:

  1. Eintrag
  2. Eintrag
  3. Eintrag

Tabellen mit Markdown

Markdown bietet eine schöne und einfache Möglichkeit, um schnell kleine Tabellen zu erstellen. Dazu schreiben wir zunächst die Spaltennamen nebeneinander, getrennt durch |. In der Zeile darunter folgt die eigentliche Tabellenkonfiguration. Wir beschreiben jede Spalte mit - - - und trennen die Bindestrichte wie auch in der Zeile der Spaltennamen mit |. In den Zeilen darunter folgen dann die Einträge in die Tabelle, getrennt durch | wie zuvor schon. Das Ganze sieht dann wie folgt aus:

Test|Test|Test
---|---|---
1|2|3
1|2|3
1|2|3

wird zu:

Test Test Test
1 2 3
1 2 3
1 2 3

Wir können die Ausrichtung der einzelnen Spalten kontrollieren, in dem wir : in der Konfigurationszeile verwenden. Ein : links bedeutet linksbündige Ausrichtung (Standardeinstellung auch ohne :), ein : rechts bedeutet rechtsbündige Ausrichtung. Ein : sowohl links als auch rechts bedeutet eine Zentrierung der Zelleninhalte:

Test|Test|Test
:---|:---:|---:
l|z|r
l|z|r
l|z|r

wird zu:

Test Test Test
l z r
l z r
l z r

Überschriften in Markdown

Mit Hilfe von # lassen sich einfach Überschriften in Markdowndokumenten erstellen. Mehrere # bedeuten eine untergeordnete Ebene von Überschriften. Nach den # muss ein Leerzeichen sein, damit die Überschriften korrekt erkannt werden:

# Ebene 1

## Ebene 2

### Ebene 3

#### Ebene 4

##### Ebene 5

###### Ebene 6

wird zu:

Ebene 1

Ebene 2

Ebene 3

Ebene 4

Ebene 5
Ebene 6

Links in Markdowndokumente einfügen

In Markdowndokumente können sehr leicht Links zu Webseiten eingebaut werden, indem man folgenden Code benutzt:

[Meine Github Seite](http://www.github.com/ctreffe)

In den eckigen Klammern steht der Text, welcher später mit dem Link hinterlegt ist (auf den man also klicken muss, um zur verlinkten Seite zu kommen). In den runden Klammern dahinter steht dann die URL, auf die der Link zeigen soll. Im gerenderten Dokument sieht das wie folgt aus:

Meine Github Seite

Bilder in Markdowndokumente einfügen

Das einfügen von Bildern unterscheidet sich kaum vom Einfügen eines Links. Wichtig ist, dass die Bildatei auf einem Webserver liegt, so dass eine Webadresse hinterlegt werden kann:

![example](http://e-scientifics.de/content/example_kinderbild.jpg)

wird zu

example

Vor Bildlinks muss ein ! gesetzt werden. In den eckigen Klammern dahinter steht ein Alternativtext, der angezeigt werden kann, wenn das Bild unter der angegebenen Adresse nicht verfügbar ist. In den runden Klammern folgt der Link zur Bildatei. Bei lokalen Markdowndokumenten kann das auch ein normaler Systempfad sein.

HTML Code in Markdowndokumenten

Innerhalb von Markdowndokumenten lassen sich auch normale HTML-Tags verwenden, mit denen man Texte, Links, Bilder, etc. formatieren kann. So lassen sich zusätzliche Darstellungsmöglichkeiten nutzen, die HTML bietet:

<font color="red">Farbiges Textbeispiel</font>

wird zu

Farbiges Textbeispiel

<font size="5">Großes Textbeispiel</font>

wird zu

Großes Textbeispiel

<a href="www.github.com/ctreffe">Meine Github Seite</a>

wird zu

Meine Github Seite

Da Markdowndokumente durch das Rendering in Webseiten umgewandelt werden, können HTML-Tags wie man sieht ohne Probleme mitverarbeitet werden. Je nach dem verwendeten Rendering-Tool sind aber eventuell nicht alle HTML-Features oder Objekte verfügbar (z.B. gibt es auf github.com keine iframes und einige Konfigurationsparameter in HTML-Tags werden ignoriert).

HTML Bildlinks

Da Markdown Bildlinks keinerlei Konfigurationsmöglichkeiten bezüglich der Anzeige von Bildern bieten, kann es in vielen Fällen sinnvoll sein statt einem Markdown Bildlink einen einfachen HTML Bildlink in Markdowndokumenten zu verwenden. Der größte Vorteil ist dabei die einstellbare Bildgröße:

<img src="http://e-scientifics.de/content/example_kinderbild.jpg" alt="example" width="100">

wird zu

example

Codeblöcke und Syntaxhighlighting in Markdowndokumenten

Ein großer Vorteil von Markdown ist die Möglichkeit ganze Blöcke von Programmcode unterschiedlicher Programmiersprachen als einheitlichen Block darzustellen und in den meisten Fällen auch die entsprechende Syntax so hervorzuheben, wie es von den meisten Entwicklungsprogrammen ebenfalls gemacht wird. Codeblocke wie folgt gekennzeichnet:

Eine Zeile über dem Block: ```

Eine Zeile unter dem Block: ```

Um nun das Syntaxhighlighting zu aktivieren braucht man lediglich die verwendete Programmiersprache zu Beginn eines Codeblocks zu deklarieren:

Ein Beispiel geschrieben mit r!

Eine Zeile über dem Block: ```s

Eine Zeile unter dem Block: ```

Im folgenden Codeblock ist nun das R Syntaxhighlighting aktiviert. Zahlen werden und Strings (also Zeichenketten, die von " umschlossen werden) werden nun z.B. in unterschiedlichen Farben hervorgehoben. Kommentare werden ebenfalls anders dargestellt. Wie genau ein Codeblock mit aktiviertem Syntaxhighlighting dargestellt wird, hängt von der zum Rendern benutzten Software ab:

s = "R syntax highlighting"

n = 100 # Dies ist ein Kommentar

Codeblöcke mit Syntaxhighlighting machen Markdown zu einem tollen Werkzeug, mit dem Programmierer Anleitungen schreiben oder Code dokumentieren können. Ohne viel Aufwand erhält man so gelayoutete und präsentierbare Dokumente, die übersichtlich gestaltet und gut strukturiert sind. Diese Eigenschaften von Markdown sind auch für das Arbeiten mit R sehr interessant.

Von Markdown zu R Markdown

Die Arbeit mit R beinhaltet in aller Regel das Erstellen von Skripten mit der R Syntax. R Skripte werden aber nicht automatisch gerendert und bieten kaum Layoutmöglichkeiten (Außer durch das Arbeiten mit Kommentarzeilen etc.), da es sich hier um reine Textdokumente handelt.

R Chunks

R Markdown wurde entwickelt, um auch R Skripte in präsentierbare Dokumente umwandeln zu können. Im Prinzip handelt es sich bei Dokumenten, die in R Markdown erstellt werden, um ganz normale Markdowndokumente, in die spezielle R Codeblöcke integriert werden. Die Codeblöcke in R Markdowndokumenten nennen wir Chunks. R Markdown Chunks unterscheiden sich von herkömmlichen R Codeblöcken (wie weiter oben beschrieben) nur durch eine andere Syntaxdeklaration:

Ein R Chunk startet mit: ```{r}

Der Chunk endet mit: ```

Im restlichen Skript werden wir R Chunks immer wie folgt darstellen:

` ` `{r}

` ` `

Dabei ist zu beachten, dass in einem R Chunk keine Leerzeichen zwischen die `` gehören. Wir machen das im Folgenden nur, damit wir der Chunk-Code korrekt angezeigt werden kann. Wir sehen nun, dass ein R Chunk zunächst einmal genau so dargestellt wird, wie ein normaler R Codeblock:

s = "R syntax highlighting"

n = 100

Es gibt aber einen ersten wichtigen Unterschied, der zwar nicht aus dem gerenderten Dokument, wohl aber aus der RStudio Oberfläche ersichtlich ist. R Chunks werden anders dargestellt als herkömmliche R Codeblöcke.

Hier ein Screenshot von einem Chunk und einem Codeblock in der RStudio Oberfläche:

rchunk_rcodeblock

Wie man sieht wird der R Chunk von RStudio farblich unterlegt, während der herkömmliche Codeblock nicht weiter hervorgehoben wird. Zusätzlich haben wir im R Chunk Syntaxhighlighting für den Code. Dennoch sehen beide Codeblöcke im gerenderten Dokument identisch aus (siehe den Codeblock über dem Screenshot)!

Ausführung von R Code in Chunks

Bislang haben wir gesehen, dass sich R Chunks zumindest in ihrem Aussehen in RStudio von herkömmlichen R Codeblöcken unterscheiden. Der wesentliche Unterschied zwischen Chunks und normalen Codeblöcken liegt aber darin, dass R Code in Chunks ausgeführt wird, bevor ein gerendertes R Markdowndokument erstellt wird. Das Ergebnis der Codeausführung, welches in der R-Konsole angezeigt wird, wird dann ebenfalls in unserem gerenderten Markdowndokument als Codebblock dargestellt:

n = 100

n + n + n
## [1] 300

Wir sehen in der unteren Box die Konsolenausgabe, die wir auch durch Ausführen eines normalen R-Skripts erhalten würden. Durch diese Ausführung des R Codes lassen sich nun Dokumente erzeugen, die durch Markdown gelayoutet werden und zusätzlich R Code und dessen Ergebnisse enthalten. Dadurch haben Benutzer z. B. die Möglichkeit dynamischer Ergebnisberichte zu erstellen und können R Skripte und auch die Konsolenausgabe mit gelayouteten Texten stark aufwerten, was Struktur, Beschreibung und Übersichtlichkeit angeht.

In Ergebnisberichten iinteressieren uns häufig nur die Ergebnisse statistischer Analysen, nicht aber die R-Syntax, die der Analyse zu Grunde liegt. Daher lässt sich für jedes Chunk mit R Code einstellen, ob es im gerenderten Dokument angezeigt werden soll, oder eben nicht. Hierzu übergeben wir dem R Chunk den zusätzlichen Parameter echo und setzen diesen auf FALSE:

` ` `{r, echo=FALSE}

` ` `
## [1] 300

Wie wir sehen wird nun lediglich das Ergebnis aus der R-Konsole angezeigt, nicht aber die eigentliche Syntax.

Wir können R Chunks durch die Übergabe zusätzlicher Parameter in der Chunkdeklaration auch so konfigurieren, dass keine Ausführung des eigentlichen R Codes stattfindet. Dies ist oftmals der Fall, wenn wir in Anleitungen oder Skripten Beispiele für fehlerhaften R-Code anzeigen wollen, ohne die entstehenden Fehlermeldungen zu erhalten. Der Parameter eval ermöglicht es uns, die Ausführung des Codeblocks zu unterbinden und diesen lediglich anzuzeigen:

` ` `{r, eval=FALSE}

` ` `
n = 100

n + n + n

Nun wird uns lediglich die Syntax und nicht das Ergebnis einer Ausführung angezeigt.

Zugriff auf R Variablen in Markdown

Bislang haben wir nur die Möglichkeit kennen gelernt uns in R Markdowndokumenten Codeblöcke anzeigen zu lassen, die exakt das enthalten, was die Konsole uns bei einer normalen Ausführung des Chunks als R Skript zurückmelden würde. Wir können für die Darstellung von Ergebnissen in R Markdown Dokumenten aber auch zusätzliche Wege nutzen, die die Darstellung weiter verbessern. Eine Möglichkeit ist hierbei der direkte Zugriff aus der Markdown Syntax auf Variablen, die in R Chunks erzeugt wurden. Dieses wird durch inline Codeblöcke ermöglicht.

n = 100

# Ein inline Codeblock: `r n`

Wenn wir den inline Codeblock in unsere Markdown Syntax einfügen erhalten wir den Wert der Variablen n im Text:

Der Wert von n beträgt: 100

Auf diese Art und Weise lassen sich natürlich auch einzelne Ergebnisse von statistischen Analysen im Text darstellen oder innerhalb von Markdown Tabellen. Somit sind Benutzer nicht mehr nur auf den Konsolen-Output bei der Darstellung ihrer Ergebnisse angewiesen.

Markdown Tabellen mit pander

Zusätzlich zu der Möglichkeit, eigene Tabellen für die Darstellung von Daten und Ergebnissen mittels Markdown zu bauen, bietet die Bibliothek pander die Möglichkeit eine Vielzahl von R Objekten in fertige Markdown Tabellen umzuwandeln. Damit die ausgegebenen Tabellen allerdings auch als Markdown gerendert werden und nicht als Konsolen-Output, muss ein R Chunk so konfiguriert werden, dass sein Ergebnis als Markdown interpretiert wird. Dies erreicht man mit dem zusätzlichen Parameter results, dem man den wert 'asis' zuweisen muss.

Im R Chunk selbst wird nach dem Laden der Bibliothek der Befehl pander() verfügbar. Damit pander() uns eine Tablle ausgibt, die mit R Markdown kompatibel ist, muss mit Hilfe des Parameters style noch die Ausgabe auf R Markdown umgestellt werden (style="rmarkdown"). Im folgenden Beispiel werden die ersten 5 Spalten des mtcars Datensatzes als Markdown Tabelle ausgegeben:

` ` `{r, results='asis'}

` ` `
library(pander)
## Warning: package 'pander' was built under R version 3.0.3
## 
## Attaching package: 'pander'
## 
## Das folgende Objekt ist maskiert from 'package:knitr':
## 
##     pandoc
pander(mtcars[, 1:5], style = "rmarkdown")
  mpg cyl disp hp drat
Mazda RX4 21 6 160 110 3.9
Mazda RX4 Wag 21 6 160 110 3.9
Datsun 710 22.8 4 108 93 3.85
Hornet 4 Drive 21.4 6 258 110 3.08
Hornet Sportabout 18.7 8 360 175 3.15
Valiant 18.1 6 225 105 2.76
Duster 360 14.3 8 360 245 3.21
Merc 240D 24.4 4 146.7 62 3.69
Merc 230 22.8 4 140.8 95 3.92
Merc 280 19.2 6 167.6 123 3.92
Merc 280C 17.8 6 167.6 123 3.92
Merc 450SE 16.4 8 275.8 180 3.07
Merc 450SL 17.3 8 275.8 180 3.07
Merc 450SLC 15.2 8 275.8 180 3.07
Cadillac Fleetwood 10.4 8 472 205 2.93
Lincoln Continental 10.4 8 460 215 3
Chrysler Imperial 14.7 8 440 230 3.23
Fiat 128 32.4 4 78.7 66 4.08
Honda Civic 30.4 4 75.7 52 4.93
Toyota Corolla 33.9 4 71.1 65 4.22
Toyota Corona 21.5 4 120.1 97 3.7
Dodge Challenger 15.5 8 318 150 2.76
AMC Javelin 15.2 8 304 150 3.15
Camaro Z28 13.3 8 350 245 3.73
Pontiac Firebird 19.2 8 400 175 3.08
Fiat X1-9 27.3 4 79 66 4.08
Porsche 914-2 26 4 120.3 91 4.43
Lotus Europa 30.4 4 95.1 113 3.77
Ford Pantera L 15.8 8 351 264 4.22
Ferrari Dino 19.7 6 145 175 3.62
Maserati Bora 15 8 301 335 3.54
Volvo 142E 21.4 4 121 109 4.11

Pander ermöglicht über eine Vielzahl von Optionen das Aussehen und Verhalten von Tabellen zu beeinflussen. Ein Beispiel ist die Möglichkeit, bestimmte Reihen oder Zeilen in fetter Schrift darzustellen:

emphasize.strong.cols(2)  # Fette Schrift

emphasize.rows(3)  # Kursive Schrift

pander(mtcars[, 1:5], style = "rmarkdown")
  mpg cyl disp hp drat
Mazda RX4 21 6 160 110 3.9
Mazda RX4 Wag 21 6 160 110 3.9
Datsun 710 22.8 4 108 93 3.85
Hornet 4 Drive 21.4 6 258 110 3.08
Hornet Sportabout 18.7 8 360 175 3.15
Valiant 18.1 6 225 105 2.76
Duster 360 14.3 8 360 245 3.21
Merc 240D 24.4 4 146.7 62 3.69
Merc 230 22.8 4 140.8 95 3.92
Merc 280 19.2 6 167.6 123 3.92
Merc 280C 17.8 6 167.6 123 3.92
Merc 450SE 16.4 8 275.8 180 3.07
Merc 450SL 17.3 8 275.8 180 3.07
Merc 450SLC 15.2 8 275.8 180 3.07
Cadillac Fleetwood 10.4 8 472 205 2.93
Lincoln Continental 10.4 8 460 215 3
Chrysler Imperial 14.7 8 440 230 3.23
Fiat 128 32.4 4 78.7 66 4.08
Honda Civic 30.4 4 75.7 52 4.93
Toyota Corolla 33.9 4 71.1 65 4.22
Toyota Corona 21.5 4 120.1 97 3.7
Dodge Challenger 15.5 8 318 150 2.76
AMC Javelin 15.2 8 304 150 3.15
Camaro Z28 13.3 8 350 245 3.73
Pontiac Firebird 19.2 8 400 175 3.08
Fiat X1-9 27.3 4 79 66 4.08
Porsche 914-2 26 4 120.3 91 4.43
Lotus Europa 30.4 4 95.1 113 3.77
Ford Pantera L 15.8 8 351 264 4.22
Ferrari Dino 19.7 6 145 175 3.62
Maserati Bora 15 8 301 335 3.54
Volvo 142E 21.4 4 121 109 4.11

Darüber hinaus bietet die Funktion panderOptions() weitere Einstellungsmöglichkeiten, die die Darstellung verändern. IM folgenden Beispiel wird die Anzahl an Zeichen, ab der eine Tabelle in mehrere Tabellen (die dann untereinander dargestellt werden) aufgeteilt wird. So lassen sich mehr Spalten aus dem mtcars Datensatz in einer Tabelle anzeigen als zuvor.

Standardmäßig beträgt die Anzahl von Zeichen in einer Spalte, aber der eine Tabelle von pander geteilt wird, genau 80. Dadurch werden oftmals tabellen geteilt, die eigentlich komfortabel ungeteilt angezeigt werden könnten:

pander(mtcars[1:5, 1:8], style = "rmarkdown")
  mpg cyl disp hp drat
Mazda RX4 21 6 160 110 3.9
Mazda RX4 Wag 21 6 160 110 3.9
Datsun 710 22.8 4 108 93 3.85
Hornet 4 Drive 21.4 6 258 110 3.08
Hornet Sportabout 18.7 8 360 175 3.15

Table: Table continues below

  wt qsec vs
Mazda RX4 2.62 16.46 0
Mazda RX4 Wag 2.875 17.02 0
Datsun 710 2.32 18.61 1
Hornet 4 Drive 3.215 19.44 1
Hornet Sportabout 3.44 17.02 0

Durch das erhöhen der Zeichenzahl pro Zeile auf 120 über panderOptions() lässt sich die gleiche Tabelle ungeteilt darstellen:

panderOptions("table.split.table", 120)

pander(mtcars[1:5, 1:8], style = "rmarkdown")
  mpg cyl disp hp drat wt qsec vs
Mazda RX4 21 6 160 110 3.9 2.62 16.46 0
Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0
Datsun 710 22.8 4 108 93 3.85 2.32 18.61 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1
Hornet Sportabout 18.7 8 360 175 3.15 3.44 17.02 0

Pander ermöglicht auch die Ausgabe von verschiedenen R Ergebnisobjekten. Die Ergebnisse von Regressions- oder Varianzanalysen lassen sich so komfortable in Tabellenform ausgeben:

pander(t.test(mpg ~ vs, data = mtcars), style = "rmarkdown")
Test statistic df P value Alternative hypothesis
-4.667 22.72 0.0001098 * * * two.sided

Table: Welch Two Sample t-test: mpg by vs

pander(aov(mpg ~ vs + cyl, data = mtcars), style = "rmarkdown")
  Df Sum Sq Mean Sq F value Pr(>F)
vs 1 496.5 496.5 47.06 1.551e-07
cyl 1 323.6 323.6 30.67 5.695e-06
Residuals 29 306 10.55

Table: Analysis of Variance Model

Probleme bei der Ausgabe von R Markdown Tabellen

Es gibt aktuell ein Problem mit der Darstellung von Regressionsanalysen! In diesem Fall muss die Ausgabe von pander nachbearbeitet werden (Alle | müssen Aus den Kofpzeilen genommen werden.), da die Darstellung ansonsten fehlerhaft ist. Im folgenden Beispiel steht der Ausdruck Pr(>|t|) in einem Spaltenkopf. Da | von R Markdown fälschlicherweise als Steuerzeichen in der Tabelle erkannt wird, wird diese nun nicht mehr richtig dargestellt:

pander(lm(mpg ~ vs, data = mtcars), style = "rmarkdown")
  Estimate Std. Error t value Pr(>|t|)
vs 7.94 1.632 4.864 3.416e-05
(Intercept) 16.62 1.08 15.39 8.847e-16

Table: Fitting linear model: mpg ~ vs

Umgehen lässt sich der Fehler momentan nur, in dem man die normale pander Ausgabe nachträglich bearbeitet. Dazu muss die Ausgabe mittels pander.return() in eine eigene Variable gespeichert werden. Daraufhin lassen sich einzelne Elemente der Tabelle mit gsub() ersetzen. Zum Schluss wird die bearbeitete Tabelle mit cat() ausgegeben, wobei auf die korrekte Einstellung von sep geachtet werden muss:

pander_out <- pander.return(lm(mpg ~ vs, data = mtcars), style = "rmarkdown")  # Abfangen der normalen pander Ausgabe

test <- gsub(">.t.", ">t", pander_out)  # Ersetzen der problematischen Zeichen

cat(test, sep = "\n")  # Erneute Ausgabe der Tabelle mit geeignetem sep Parameterwert
  Estimate Std. Error t value Pr(>|t|)
vs 7.94 1.632 4.864 3.416e-05
(Intercept) 16.62 1.08 15.39 8.847e-16

Table: Fitting linear model: mpg ~ vs

So lassen sich momentane Probleme mit der pander Ausgabe beseitigen. Es gibt noch sehr viele weitere Optionen und Funktionen, im pander Paket. Für eine komplette Übersicht eignet sich die offizielle pander Referenz:

Package 'pander'

Arbeiten mit R Markdowndokumenten in RStudio

Um in RStudio eine neue R Markdowndatei (Dateieindung .rmd) zu erstellen benutzen wir einfach das Systemmenü:

New Markdown

Hier ein Screenshot eines neu erstellten R Markdowndokuments mit dem Standardinhalt, der einfach gelöscht werden kann:

Empty Markdown

Um ein R Markdowndokument zu rendern (also ein gelayoutetes HTML-Dokument zu erstellen), klicken wir auf den entsprechenden Button oben am Skript:

Knit Markdown

RStudio zeigt uns die gerenderte HTML-Datei in einem neuen Fenster an:

Rendered Markdown

In RStudio lassen sich R Chunks genau so ausführen wie normale R-Skripte. Das bedeutet, dass man als Benutzer nicht immer erst das Markdowndokument rendern lassen muss, um zu sehen, ob der eigene R Code funktioniert. Es gibt zwei nützliche Tastenkombinationen, die die Arbeit mit R Markdown in RStudio sehr vereinfachen:

  • Mit STRG+ALT+C lässt sich der Chunk ausführen, in dem der Cursor sich momentan befindet
  • Mit STRG+ALT+R lassen sich alle Chunks im R Markdowndokument nacheinander ausführen (Also ganzes Script ausführen!)

Allerdings kann man keine Markdownabschnitte ausführen, dies führt einfach zu Fehlermeldungen in der R-Konsole. Hier noch eine offizielle Einführung in R Markdown von der RStudio Webseite:

Using R Markdown with RStudio

Aufbereiten von R Markdowndokumenten für Github

R Markdowndokumente werden von RStudio beim Rendern zunächst in normale Markdowndokumente und dann erst in HTML-Dokumente umgewandelt. Die enstehenden Markdowndokumente werden dabei automatisch in dem Ordner mit abgespeichert, in dem sich auch die Rmd-Datei des R Markdowndokumentes befindet. Diese Markdowndatei kann genutzt werden, um R Markdowndokumente z.B. auf github.com in ein Wiki einzubinden, genau wie das vorliegende Skript. Bevor allerdings ein Upload zu Github möglich ist, muss das Markdowndokument vorbereitet werden und auch schon bei der Erstellung des R Markdowndokuments kann dafür gesorgt werden, dass die Anpassung später unproblematisch ist.

Anpassen des R Markdowndokuments

Ein R Markdowndokument, welches später als einfaches Markdowndokument genutzt werden soll, z.B. für den Upload auf Github, sollte so gestaltet werden, dass später möglichst wenig händische Anpassungen des von RStudio erstellten Markdowndokuments notwendig sind. Das hat vor allem den Grund, dass bei jeder Änderung des R Markdowndokumentes zunächst ein neues einfaches Markdowndokument erstellt wird, welches dann jedes Mal wieder aufs Neue angepasst werden muss. Dadurch vereinfacht sich der Umgang mit den entsprechenden Dokumenten enorm. In den folgenden Abschnitten werden einige Möglichkeiten beschrieben, die den späteren Anpassungsaufwand verringern.

Einfügen von Bildern aus Online-Quellen

Screenshots und andere externe Bilddateien, die in einem R Markdowndokument verwendet werden sollen, können bereits in RStudio sowohl von lokalen Quellen als auch von Online-Quellen geladen werden. Da beim späteren Upload eines Markdowndokuments auf Github keine lokalen Quellen mehr zur Verfügung stehen, sollte man externe Bilddateien immer schon im R Markdowndokument aus einer Online-Quelle laden. Dadurch entfällt später die Notwendigkeit, die lokalen Bildlinks im Markdowndokument durch Links zu Online-Quellen zu ersetzen.

Im Markdowndokument erstellte Plots richtig einbinden

Bei der Erstellung von Plots in R Markdowndokumenten generiert RStudio lokale Bilddateien (meistens im Unterordner figure, der im selben Ordner liegt wie die entsprechende Rmd-Datei), welche dann als lokale Bildlinks in das einfache Markdowndokument eingebunden werden. Bevor Benutzer also Markdowndokumente mit Plots auf Github online stellen können, müssen diese lokalen Bildlinks in den von RStudio erstellten Markdowndokumenten durch Online-Bildlinks ersetzt werden. Andernfalls würden die Plots auf Github später nicht angezeigt. Die entsprechenden Bilddateien, die R-Studio erstellt, müssen dementsprechend auf einen Server hochgeladen werden, von dem aus sie dann als Online-Quelle erreichbar sind.

Eine Möglichkeit, wie Benutzer verhindern können, diesen aufwendigen Anpassungsprozess bei jeder Veränderung des R Markdowndokuments erneut durchzuführen, ist die Vorab-Einbindung der entsprechenden R Plots als externen Bildlink. Hierzu nehmen wir zunächst ein einfaches Plot-Beispiel aus dem mtcars Datensatz:

plot(mtcars$mpg, mtcars$cyl, main = "Beispielplot")

Beispielplot

Jeder R plot sollte in R Markdowndokumenten in einem gesonderten Chunk erstellt werden, innerhalb dessen keine anderen Berechnungen und Anweisungen ausgeführt werden, als solche, die zur Erstellung des Plots notwendig sind. Der obige Codeblock enthält ausschließlich den Befehl plot() zur Erstellung einer einfachen Grafik. Sobald der Chunk fertiggestellt wurde und das R Markdowndokument von RStudio einmal gerendert worden ist, befindet sich die von RStudio erstellte Bilddatei mit dem Plot wie bereits erläutert im Unterordner "figure" des Ordners, in dem auch die Rmd-Datei liegt. Diese Bilddatei kann nun auf einen Server hochgeladen werden, von dem aus sie als Online-Quelle erreichbar ist. Anschließend kann der Plot einfach als externes Bild in das R Markdowndokument direkt unterhalb des R Chunks eingebunden werden, in dem der Plot zuvor erstellt wurde. Damit nun beim erneuten Rendern nicht zwei Plots im Markdowndokument erscheinen kann einfach die Chunkoption eval auf FALSE gesetzt werden. Der Chunk, welcher die Plotanweisung erhält, wird nun von RStudio beim Rendern nicht mehr ausgewertet und dennoch erscheint der zuvor als Online-Quelle eingebundene Plot. Ob der Codeblock darüber hinaus angezeigt werden soll oder nicht, kann der Benutzer mit der Chunkoption echo bestimmen. Hier ein Beispiel für den entsprechenden Code im R Markdowndokument:

` ` `{r, eval=FALSE}
plot(mtcars$mpg, mtcars$cyl, main='Beispielplot')
` ` `

![Beispielplot](http://e-scientifics.de/content/r-space/plots/markdown_github_example_plot.png)

wird zu

plot(mtcars$mpg, mtcars$cyl, main = "Beispielplot")

Beispielplot

Wie wir sehen entspricht die untere Darstellung des Codeblocks und des Plots exakt der oberen Darstellung, bei der die Bilddatei auf herkömmlichem Wege in das R-Markdowndokument eingebettet wurde. In der unteren Variante ist allerdings keinerlei Anpassung des einfachen Markdowndokumentes notwendig, während bei der oberen Variante wie beschrieben vor dem Upload auf Github die Ersetzung der lokalen Bildlinks durch Online-Quellen vorgenommen werden musste. Wenn man bei der Erstellung von R Markdowndokumenten mit Plots entsprechend der obigen Beschreibung vorgeht, muss man eine wichtige Sache beachten:

Bei jeder Veränderung des Plots muss dieser neu erstellt und hochgeladen werden, da ein Markdowndokument auf Github sonst mit veralteten Grafiken dargestellt würde!

Es bietet sich deshalb an, die Chunkoption eval bei der Erstellung des Skripts zunächst auf TRUE zu belassen. Dadurch werden zwar immer zwei Plots statt einem angezeigt, aber man hat sofort den Vergleich der Online-Quelle mit dem lokalen Plot und kann sehen, welche Online-Plots aktualisiert werden müssen. Erst unmittelbar vor dem finalen Rendering des fertigen Dokuments kann man dann eval auf FALSE setzen.

Anpassen des Markdowndokuments

Nachdem RStudio aus dem R Markdowndokument ein einfaches Markdowndokument erstellt hat, müssen alle lokalen Bildlinks müssen durch Bildlinks zu Online-Quellen ersetzt werden, bevor ein Upload auf Github erfolgen kann. Sofern sich Benutzer an die vorherigen Hinweise und Beschreibungen gehalten haben, sollte dieser Punkt jedoch entfallen.

Zuletzt muss eine Veränderung an den R Codeblöcken vorgenommen werden, damit das Syntaxhighlighting auch auf Github funktioniert. Die Kennzeichnung der Codeblöcke mit r wird von Github nicht verstanden, daher muss der Alias s für das korrekte Syntaxhighlighting genutzt werden:

` ` `r

` ` `

muss ersetzt werden durch:

` ` `s

` ` `

Dies lässt sich sehr leicht mit der Suchen-und-Ersetzen-Funktion eines beliebigen Editors durchführen. Dabei braucht nur der Anfang des Codeblocks verändert zu werden. Sobald die Codeblöcke im einfachen Markdowndokument entsprechend angepasst wurden, kann der Upload auf Github erfolgen.