CMP-05: Tabellen mit bookdown

Im fünften Teil CMP-05 des Kurses zu Cross Media Publishing erkläre ich die Einbindung von einfachen aber auch komplex formatierten Tabellen. Sie lernen wie Sie das Datenformat für Tabellen erzeugen können und wie Sie Tabelle für Webseiten und eBooks (HTML) und PDF (LaTeX) generieren können. Am Schluss der Lektion können Sie nicht nur Querverweise auf Tabellen setzen sondern auch auf (Zwischen-)Überschriften.

Im fünften Teil CMP-05 des Kurses zu Cross Media Publishing erkläre ich die Einbindung von einfachen aber auch komplex formatierten Tabellen. Sie lernen wie Sie das Datenformat für Tabellen erzeugen können und wie Sie Tabelle für Webseiten und eBooks (HTML) und PDF (LaTeX) generieren können. Am Schluss der Lektion können Sie nicht nur Querverweise auf Tabellen setzen sondern auch auf (Zwischen-)Überschriften.

Ähnlich wie bereits bei der Bearbeitung von Grafiken in CMP-04 kommen wir hier nicht mit den Standard-Befehlen von John Grubers Markdown bzw von pandoc nicht aus. Ich werde mich daher ausschließlich auf die Möglichkeiten von R Markdown konzentrieren. Wieder ist es das Paket knitr das wir für verwenden werden. Aufbauend auf dem Programm-Befehl kable  (kommt von: Knitr + Table) kann für komplexere Tabellen knitr in Verbindung mit dem Paket kableExtra verwendet werden.

CMP-05: Voraussetzungen

  • Erfolgreiches Durcharbeiten von Cross Media Publishing Tutorial Nr. 1 (CMP-01)
  • Erfolgreiches Durcharbeiten von Cross Media Publishing Tutorial Nr. 2 (CMP-02)
  • Erfolgreiches Durcharbeiten von Cross Media Publishing Tutorial Nr. 3 (CMP-03)
  • Erfolgreiches Durcharbeiten von Cross Media Publishing Tutorial Nr. 3 (CMP-03a)

[Tutorial 4 ist für diese Lektion nicht unbedingt erforderlich.]

CMP-05: Learning Outcomes

Wenn Sie dieses Tutorial durcharbeiten, dann können Sie

  • Einfache Tabellen mit knitr einbinden
  • Komplexe Tabellen mit knitr und kableExtra
  • Querverweise auf Tabellen setzen
  • Querverweise auf (Zwischen-)Überschriften setzen

CMP-05: knitr als Hauptprogramm für bookdown Tabellen

Äquivalent zur Einbindung von Grafiken mit R-Programmblocks lassen sich auch Tabellen besser mit den erweiterten Möglichkeiten von R Markdown bearbeiten. Es gibt in R gleich mehrere Programmpakete, die die Gestaltung von Tabellen unterstützen (z.b. knitr, tables, stargazer, pander, xtable). 

CMP-05: RStudio Interface mit Beispiele von R-Pakete für Tabellen
Arbeiten mit Tabellen (aus https://rmarkdown.rstudio.com/lesson-7.html)

Ich konzentriere mich hier auf Tabellen mit dem Befehl kable des Programms knitr, das wir bereits kennen und das in R sowieso eine ganz zentrale Rolle bei der Erstellung von  dynamischen Dokumenten einnimmt. Die Programme knitr und bookdown spielen schon deshalb sehr gut zusammen weil sie beide von Yihui Xie entwickelt worden sind (siehe zu knitr auch den Video von Roger Peng). 

Alle Programmpakete für Tabellen sind natürlich vor allem für die Darstellung von Zahlen gedacht und stützten sich auf die zentrale Datenstruktur von R, dem dataframe. Wir müssen also unseren Tabelleninhalt entweder als Zahlentabellen z.b. über Excel oder als Text in das R Datenformat einspielen. Ich gehe im Weiteren davon aus, dass wir Text-Tabellen generieren wollen.

CMP-05: Datenstruktur für eine Tabelle erzeugen

Als Beispiel zeige ich das Erzeugen einer Datenstruktur mit drei Zeilen und drei Spalten Der zu verwendende Programmbefehl heißt: 

meineTabelle <- data.frame(
        Kopfzeile1 = 
                c("1. Zeile von 1. Spalte",
                  "2. Zeile von 1. Spalte",
                  "3. Zeile von 1. Spalte"), 
        Kopfzeile2 =
                 c("1. Zeile von 2. Spalte",
                   "2. Zeile von 2. Spalte",
                   "3. Ziele von 2. Spalte"),
        Kopfzeile3 =
                 c("1. Zeile von 3. Spalte",
                   "2. Zeile von 3. Spalte",
                   "3. Zeile von 2. Spalte")
    )
  1. meineTabelle: Name der neu zu erzeugenden Datenstruktur
  2. <-: Zuweisungszeichen: alles was rechts von diesem Zeichen kommt, wir der unter meineTabelle abgespeicherten Variablen zugewiesen. In unserem Fall eine Datenstruktur.
  3. data.frame: Das ist der Befehl zur Erzeugung eines spezifischen Datenrahmens in Form tabellarischen Datenstruktur von Matrizen oder Listen.
  4. c:  Das ist der Programmbefehl, der verschiedene Elemente zu einem Vektor bzw. einer Liste miteinander verbindet (c steht für combine).

Wir können uns diese Tabelle in RStudio ansehen, wenn wir links unten in die Console den Befehl eigeben:

View(meineTabelle)

CMP-05: Tabelle generieren mit knitr::kable

Wir müssen die erstellte Datenstruktur nur auch als Tabelle für unserem Markdown Text generieren und einbinden. Das geschieht mit dem folgenden kleinen Programm:

kable(
  meineTabelle, 
    col.names = c("Kopfzeile 1", "Kopfzeile 2", 
               "Kopfzeile 3"),
    caption = "Meine erste Tabelle mit knitr",
    booktabs = TRUE
 )
  1. kable: Das ist der Programmbefehl. Dazu müssen wir das Programmpaket knitr mit library(knitr) bereits geladen, oder aber knitr::kable schreiben.
  2. meineTabelle: das ist die Datenstruktur, die wir oben erzeugt haben.
  3. col.names: Diese Zeile ist nur notwendig, wenn wir den Namen der Kopfzeile aus der Datenstruktur verändern wollen. Als Standard dürfen wir für Variablen bei der Datenstruktur nur Namen ohne Leerzeichen verwenden. 
  4. caption: Das ist die Überschrift für die Tabelle.
  5. booktabs: Ergibt ein ein schöneres Tabellenformat mit z.B. abwechselndem grauem Hintergrund nach jeder zweiten Zeile.

Wenn wir den R Programmblock wie in CMP-04 erzeugen, brauchen wir wieder einen Namen des Block mit dem wir auf die Grafik referenzieren können. Auch das Kommando ECHO=FALSE ist wieder notwendig, damit nicht der gesamte Progrommcode in unserem Buch ausgedruckt wird, sondern nur die Grafik als Ergebnis sichtbar wird.

CMP-05: Tabelle mit knitr
Tabelle mit knitr: Programmcode Darstellung in HTML-Seite

CMP-05: Komplexe Tabellen mit kableExtra

In der Dokumentation zum kable -Befehl (rechts unten den Help-Reiter anklicken und kable in das Suchfeld eingeben) schreibt der Entwickler:

This is a very simple table generator. It is simple by design. It is not intended to replace any other R packages for making tables.

kable kann zwar noch mit align den Text in den Spalten ausrichten, das war es dann aber. Schon bei einfachen Formatierungsünschen steigt kable bereits aus. Sei es die Positionierung der gesamten Tabelle, oder lange Texte, die über mehrere Zeilen einer Spalte gehen,  oder gar einespezielle Formatierung der Spalten und Reihen --- kable kann das nicht.

Hier kommt glücklicherweise das R-Programmpaket kableExtra zu Hilfe. Einen Überblick zu den weitreichenden Gestaltungsmöglichkeiten finden Sie auf eigens für Neulinge geschriebenen "Vignetten" sowohl  für HTML als auch für PDF (in LaTeX).

Dieses Paket müssen wir zuerst mal installieren. Das funktioniert genauso wie bei der Installation des bookdown-Paketes, nur dass Sie diesmal kableExtra in das Suchfenster eingeben müssen und nach der Installation dann dieses neue Paket auch laden müssen (library(kableExtra)).

Die Programmbefehle von kableExtra werden direkt nach dem schon bisher verwendeten kable-Befehl mit dem sog. Pipe-Operator %>% Zeile für Zeile angehängt.

Allerdings verlangen 8 der 24 Programmbefehle, die es derzeit in kableExtra gibt, dass das Endformat (HTML oder LaTeX) in kable selbst, vorher spezifiziert werden muss. Daher müssen für Tabellen, die diese Befehle verwenden, zwei Versionen geschrieben werden. Das widerspricht natürlich dem Ziel "ein Ausgangstext für viele Endformate".  Ich habe aber (bisher?) keine andere Lösung gefunden.

Ich kann hier nicht die vielen Möglichkeiten von der Kombination knitr+kableExtra aufzeigen und werde mich daher auf zwei Beispiele konzentrieren. 

A) Text, der eine (LaTeX)-Tabelle frei umfließt

CMP-05: Tabelle mit fließendem Text. Codierung und Ergebnis als PDF
Tabelle mit fließendem Text herum. Codierung und Ergebnis als PDF

B) Tabelle mit extrem langen Textzeilen und mehreren Zeilen pro Spalte

Als zweites Beispiel nehme ich eine Originaltabelle aus der bereits besprochenen Masterthese, die ich als Demo-Projekt (, 4.5 MB) herangezogen habe. Die Tabelle, von der ich spreche, geht von Seite 21 bis 23.

Wird bei dieser Tabelle nur der kable-Befehl verwendet, dann laufen die langen Zeilen bei der PDF Version über den Rand hinaus.  Beim folgenden Beispiel zeige ich auch gleich, wie diese komplizierte Tabelle sowohl für HTML als auch für LaTeX adaptiert wird.

CMP-05: Beginn der Codierung einer komplexen Tabelle in R(Studio)
Beginn der Codierung der komplexen Tabelle in R(Studio)

 

CMP-05: Programmcode der komplexen Tabelle für LaTeX und HTML (links) und das Ergebnis in PDF und HTML (rechts)
Programmcode der komplexen Tabelle für LaTeX und HTML (links) und das Ergebnis in PDF und HTML (rechts)

Wie bereits bei der Lektion über Grafiken gezeigt, können auch auf Tabellen aktive Links als Sprungmarken gesetzt werden. Wiederum ist es der Name des R-Programmblocks der als Ziel angegeben werden muss. Statt fig: heißt es aber nun tab:.

Die Tabelle \@ref(tab:ziele) zeigt wie ich das "Problem-Statement" 
von Euler (2014) auf das Projekt "audiumus" konkretisiert habe.

CMP-05: Querverweise erzeugen

Nachdem ich bereits Querverweise für Grafiken und Tabellen vorgestellt habe, fehlen noch interne Links zu (Zwischen-)Überschriften. 

Obwohl Sie die Überschrift selbst als Verweistext nehmen können, empfehle ich Ihnen extra eine Identifikation zu wählen. Wenn Sie nämlich später die Überschrift ändern, funktioniert Ihr Verweis nicht mehr, bzw. Sie müssten dann alle Verweise im Text korrigieren.

CMP-04: Sprungmarke in einer Abschnittsüberschrift setzen
Sprungmarke in einer Abschnittsüberschrift setzen. Achtung: Sie müssen eine geschwungene Klammer verwenden und ihr Text muss mit einer Raute beginnen und darf keine Leerzeichen oder Sonderzeichen enthalten.

Sie können von jedem beliebigen Ort ihres Buches zu jeder beliebigen (Zwischen-)Überschrift springen. Und zwar unabhängig davon ob Sprungmarke und Referenz sich in derselben Datei befinden oder nicht.

CMP-04: Referenz auf eine Zwischenüberschrift
Referenz aus der Datei "05-summary.Rmd" auf die Zwischenüberschrift, die sich in der Datei "04-application.Rmd" befindet.

Aus dem Text in der eckigen Klammer wird ein Link, der auf den Abschnitt "Problemdefinition" verweist.

CMP-05: Zusammenfassung

Mit dieser Lektion haben Sie die Einbindung von einfachen und komplexen Tabellen sowie ihre Referenzierung gelernt. Außerdem wissen Sie nun auch, wie Sie auf (Zwischen-)Überschriften Querverweise als aktive Links setzen können.

In der nächsten Lektion erkläre ich das Referenzieren von Literaturzitaten. Dann beginnen wir bereits mit der Vorbereitung zur Veröffentlichung. Wie bereits in CMP-04 erwähnt: Sie sollen daher jetzt mit den gelernten Programmbefehlen nicht nur experimentieren, sondern (weiter) kontinuierlich an der Formatierung Ihres gesamten Textes arbeiten! Nehmen Sie sich vor, dass Sie bis zur nächsten Lektion etwa zwei Drittel Ihres Textes durchgesehen und – bis auf Kurzbeleg und Literaturverzeichnis – auch bereits formatiert haben.

Von Peter Baumgartner

Seit mehr als 30 Jahren treiben mich die Themen eLearning/Blended Learning und (Hochschul)-Didaktik um. Als Universitätsprofessor hat sich dieses Interesse in 13 Bücher, knapp über 200 Artikel und 20 betreuten Dissertationen niedergeschlagen. Jetzt in der Pension beschäftige ich mich zunehmend auch mit Open Science und Data Science Education.

Eine Antwort auf „CMP-05: Tabellen mit bookdown“

Ich habe folgende Mail bekommen:

beim Durcharbeiten von CMP-05 (was bestens funktioniert hat) bin ich auf ein generelles Problem gestoßen: Wie lassen sich – bezogen auf eine Textinfomation – zwei Programmbefehle in geschweiften Klammern unterbringen?

Wenn ich z.B. eine Überschrift mit einer Verweismarke versehen will (wie von Dir unter „CMP-05: Querverweise erzeugen“ beschrieben und per Screenshot erläutert) und zugleich die Überschrift aus der Nummerierungslogik heraus nehmen will (also den Befehl {-} gleichzeitig zu der Verweismarke verwenden will) und dann beide Befehle nacheinander in der Editierzeile anführe (z.B. die Verweismarke {#Intro} und dann den Befehl {-}), wird der erste Befehl als Fließtext bei der Ausgabe angezeigt und nur der zweite Befehl als Programmanweisung berücksichtigt (auch bei der umgekehrten Reihenfolge ist es so).

Gibt es hier vielleicht eine (ganz einfache?) Lösung?

Tatsächlich: Zwei geschungene Klammern sind nicht erlubt. Aber die Lösung ist einfach:

CMP05a: Lösung 1

# Index {- #zum-index}
…
Gehe [zum Stichwortverzeichnis](#zum-index)

Die Befehle werden mit einem Leerzeichen in die geschwungene Klammer geschrieben. Es ist daher keine zweite geschwungene Klammer nötig. Statt dem -  kann auch der Befehl .unnumbered eingegeben werden.

Es gibt noch weitere Möglichkeiten. Ich führe sie alle an, damit Sie ein Gspür für die „Mächtigkeit“ des Konvertierwerkzeuges pandoc bekommen – und lernen dort auch nachzuschauen!

die gibt es, sogar mehrere. Hilfestellung für Spezialfragen finden sich auf den pandoc-Seiten, die unten ich bei den Lösungen jeweils angegeben habe. hier insbesondere die Erweiterung zu den impliziten Referenzen für Überschriften aber auch die Erweiterung zu den automatisch generierten Identifikationen.

CMP05a: Lösung 2

# Intro {-}
…
Gehe zur [Intro]

Da jede Überschrift automatisch eine Identifikation generiert (siehe auto_identifiers) kann mit einer impliziten Referenz darauf verwiesen werden (siehe implicit_header_references). Eine zweite geschwungene Klammer ist daher nicht notwendig.

CMP05a: Lösung 3

# Intro {-}
…
Gehe zum [ersten Kapitel](#Intro)

Bei dieser Lösung wird mit einer explizit Referenz auf die automatisch generierte ID gezeigt. Auch dadurch wird eine zweite geschwungene eingespart. Allerdings sind – insbesonderebei Verwendung von Sonderzeichen oder mehreren Wörtern in Überschrift die Regeln für automatisch generierte ID zu beachten (siehe auto_identifiers).

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert