Eerder schreef ik een snelle introductie op enkele algemene kenmerken van LaTeX, een opensource software syteem om verschillende soorten documenten te zetten. Dit programmma wordt vooral gebruikt voor maken van wetenschappelijke documenten. Die introductie is hier te vinden. Daarin laat ik zien hoe \(\Latex\) werkt en welke verschillende soorten documenten je ermee kunt maken (waaronder artikel, boek, rapport, een poster, een proefschrift, een presentatie). Verder kun je hier \(\Latex\)-tutorial ook informatie vinden en hier Snel overzicht.
\(\Latex\) werkt met veel verschillende commando’s en je moet de tijd nemen dit te leren. Op internet is overigens wel goede informatie te vinden en de meeste problemen kun je zelf oplossen. De laatste jaren vinden er binnen het programma R veel ontwikkelingen plaats die het maken van wetenschappelijke documenten vergemakkelijken. De ontwikkelingen vallen onder de term RMarkdown dat in 2015 met de introductie van het knitr-pakket werd geïntroduceerd. Hier wordt binne R gebruik gemaakt van de Markdown taal waarmee technische documenten betrekkelijk eenvoudig te maken zijn. Het pakket maakt het mogelijk om verschillende soorten documenten te maken (waaronder pdf, html en word). Tot slot maakt RMarkdown het mogelijk om tekst (inclusief bv. grafieken, tabellen en referentie) en analyses in een keer te draaien. Met RMarkdown, knitr en alles wat hier aan vastzit kun je onder anderen:
- Een goed uitziend wetenschappelijk document maken in verschillende formats tegelijkertijd (pdf, html en word);
- Kun je met notebooks werken waarin naast tekst analyses zijn opgenomen;
- Kun je nieuwe vormen van presentaties voorbereiden;
- Kun je dashboards maken waarin informatie overzichtelijk, aantrekkelijk, flexibel en interactief wordt gepresenteerd;
- Kun je interactieve toepassingen maken bijvoorbeeld door de inzet van Shiny; - Kun je wetenschappelijke artikelen maken; - Kun je boeken zelf maken; - KUn je een blog en website maken.
Een uitgebreide gids hierover vind je hier RMarkdown: The Definitive Guide. En een handleiding vind je hier Cheat sheet RMarkdown.
Om met onderstaande te kunnen werken moet je in ieder geval R installeren R alsmede RStudio RStudio. Om pdf te draaien moet je ook Latex op je computer installeren. Heb je dat niet kun je ook binnen R/RStudio het pakket tinytex. Als je R en RStudio hebt binnengehaald moet je de pakketten knitr en rmarkdown binnenhalen. Voor achtergrondinformatie over R, RStudio en RMarkdown vind je hier RRStudioRMarkdowninformatie
Deze workshop is eerder gegeven door Schmidt op 11 Mei 2016 en er waren wat aanvullende materialen beschikbaar:
Deze tutorial is gemaakt als onderdeel van een programma van Dr. C Titus Brown’s Data Intensive Biology (DIB) trainingsprogramma op de Universiteit van Californie, Davis. Dit DIB trainingsprogramma omvat lokale + remote workshops die onderwerpen en gereedschappen behandelen in de bio-informatica en data analyse.
Het college werd gegeven vanuit Ann Arbor Michigan en drie klassen van elders deden tegelijkertijd mee:
De Github repository, die ik binnen heb gehaald en hier gebruik voor deze les, kan worden gevonden op hier.
Opgelet: Dit soort werk introduceert wel een groot aantal Engelse woorden in onze Nederlandse taal. Enkele daarvan heb ik laten staan, niet omdat ik ze mooi vind maar omdat ze al overal gebruikt worden. Gewone mensen praten al over bijvoorbeeld renderen, cachen, files, widgets en output. Met excuses hiervoor, bij voorbaat.
Voordat je gaat werken met de workshopmaterialen, zorg ervoor dat je het volgende hebt gedaan:
devtools::session_info() in de R console te draaien.devtools:: aan om de session_info() functie in R te gebruiken ipv het devtools pakket en de sessionInfo() functie binnen het utils pakket. Het runnen van devtools::session_info() stelt ons in staat de versie van R en RStudio vast te stellen.Heb je de volgende versie van R en RStudio?
Versie 3.3.0 (2016-05-03)RStudio: 0.99.1172
## Installeer de goede pakketten
install.packages("rmarkdown") # Dit zorgt voor koele dynamische documenten
install.packages("knitr") # Hier kun je R code Chunks mee runnen
install.packages("ggplot2") # Voor het plotten van mooie figuren
install.packages("DT") # Om interactieve HTML tabellen te maken## Deze pakketten ook laden om er zeker van te zijn dat je de goede pakketten hebt
library("rmarkdown") # Dit zorgt voor koele dynamische documenten
library("knitr") # Hier kun je R code Chunks mee runnen
library("ggplot2") # Voor het plotten van mooie figuren
library("DT") # Om interactieve HTML tabellen te makenZijn er nog problemen, meld het ajb!
Deze tutorial kon niet samengesteld worden zonder onderstaande goede bronnen:
Literate programming, zoals dat in het Engels wordt genoemd, is het basisidee achter dynamische documenten en is ge?ntroduceerd door Donald Knuth in 1984. Oorspronkelijk om de broncode en de bijbehorende software documentatie samen te brengen. Tegenwoordig cre?ren we dynamische documenten waarin het programma of de analyse code samen draaien om tot ‘outputs’ te komen (bv. tabellen, plots, modellen, etc) die worden uitgelegd via narratief schrijven.
De drie stappen van Literate Programming:
Er blijven 2 stappen voor ons voor wat betreft het schrijven:
Traditioneel gebruikten mensen commentaren om het verhaal in de code file kwijt te kunnen raken (voor R zou dat een .R file zijn). Deze file zou het volgende in kunnen houden:
# Titel: Relatie tussen Autogewicht en Gasefficientie/of-verbruik
# Door : Marian Schmidt
# Datum: 11 Mei 2016
# Ik verspel dat er een relatie is tussen het gewicht van de auto en de afstand die met de brandstof afgelegd kan worden.
# Dat test ik met een lineaire analyse van de ''mtcarsdataset' als onderdeel van de R datasets
# Hoe zien de data eruit?
#datatable(mtcars) # Interactieve tabel
# Is er een relatie tussen het gewicht en de afstand per, in dit geval, gallon?
lm_mpg <- lm(mpg ~ wt, data = mtcars) # Run het lineaire model dat mpg voorspelt op basis van wt
coef_lm_mpg <- coef(summary(lm_mpg)) # Haal de coefficienten eruit voor de tabel die komt
kable(coef_lm_mpg) # Maak een niet-interactieve tabel - een functie in knitr
# Plot de relatie tussen gewicht en afstand in mijl per gallon
plot <- ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point() + #
geom_smooth(method = "lm") + theme_bw() + # Maak een lineair model en maak het zwart en wit
xlab("Weight (1000lbs)") + ylab("Miles per Gallon") # Voeg tekst aan de assen toe
# Het lijkt erop dat met een toename van 1000 pounds er een afname is van brandstof gebruik met 5.34 mijl per gallon
# Het eindDe gebruiker zal de commentaren lezen en de codes zelf runnen.
Echter, ‘literate programming’ stelt ons in staat de code te runnen en de resultaten te beschrijven, allemaal in een document dat we kunnen delen. We zouden bijvoorbeeld het volgende kunnen doen:
Relatie tussen gewicht van de auto en het brandstofverbruik
Door: Harrie Jonkman
Datum: 27 november 2018
Ik voorspel dat er een relatie is tussen het gewicht en de afstand die met de brandstof kan worden afgelegd. Ik test dat met een lineair model op een dataset in R en zet dit als volgt in het programma.
# Is er een relatie tussen het gewicht van de auto en de afstand die het kan afleggen met de brandstof?
lm_mpg <- lm(mpg ~ wt, data = mtcars) # Run het lineair model dat mpg voorspelt op basis van wt
coef_lm_mpg <- coef(summary(lm_mpg)) # Haal de co?ffici?nten voor de tabel eruit
kable(coef_lm_mpg) # Maak een niet-interactieve tabel - functie in knitr| Estimate | Std. Error | t value | Pr(>|t|) | |
|---|---|---|---|---|
| (Intercept) | 37.285126 | 1.877627 | 19.857575 | 0 |
| wt | -5.344472 | 0.559101 | -9.559044 | 0 |
# Plot de relatie tussen gewicht en mijl per gallon
plot <- ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point() + #
geom_smooth(method = "lm") + theme_bw() + # voeg lineair model toe en maak het zwart en wit
xlab("Weight (1000lbs)") + ylab("Miles per Gallon") # Voeg tekst aan x en y-as toeHet lijkt erop dat met elke 1000 pond er een afname is in brandstof gebruik met 5.3444716 mijl per gallon
Het einde
Reproduceerbaar onderzoek is een mogelijk product van dynamische documenten, echter, goed resultaat is niet gegarandeerd!
Goede uitvoering van reproduceerbaar onderzoek houdt in ieder geval in:
codes die in de tekst staan.devtools::session_info() gebruiken.Wat het belang van reproduceerbaar onderzoek betreft, zie ook het document van de Koninklijke Nederlandse Academie voor Wetenschappen
Om RMarkdown helemaal te begrijpen moeten we het eerst iets over Markdown weten. Dat is een systeem om een simpele, leesbare tekst te maken die eenvoudig kan worden omgezet naar HTML. Markdown is essentieel voor twee dingen:
Belangrijkste doel van Markdown:
Maakt de syntax van het orginele (pre-HTML) document zo leesbaar mogelijk.
Zou je deze code liever in HTML lezen?
<body>
<section>
<h1>Paklijst voor bergklimmen</h1>
<ul>
<li>Bergschoenen</li>
<li>Klimgordel</li>
<li>Rugzak</li>
<li>Touw</li>
<li>Zelfzekering</li>
</ul>
</section>
</body>Of deze code in Markdown?
Markdown is makkelijker om te lezen!
We zullen meer over de syntax van Markdown praten nadat we RMarkdown hebben geintroduceerd maar laten we ons allereerst beseffen hoeveel makkelijker ons leven is/zal zijn omdat Markdown bestaat! Dank je John Gruber en Aaron Swartz (RIP) voor het ontwikkelen van Markdown in 2004!
RMarkdown is een variant van Markdown dat het makkelijker maakt om met RStudio dynamische documenten, presentaties en rapporten te maken. Het omvat ‘R code chunks’ (ik laat hier even het Engels staan) om met knitr te gebruiken waarmee makkelijker reproduceerbare (web-based) rapporten gemaakt kunnen worden die automatisch aangepast worden wanneer de onderliggende code is veranderd.
RMarkdown geeft verschillende typen files waaronder onder anderen:
Terwijl er heel veel verschillende documenten kunnen worden geleverd met RMarkdown, ligt hier de nadruk in de eerste plaats op HTML output files omdat die voor mijn onderzoek misschien het meest bruikbaar en flexibel zijn.
Een aantrekkelijk gereedschap voor reproduceerbare en dynamische rapporten!
In het kort, om een rapport te maken:
.Rmd file.
Werkwijze om een rapport te maken
Overzicht van de stappen die RMarkdown maakt om een ‘gerenderd’ document te krijgen:
.Rmd rapport met ‘R code chunks’ en markdown verhalen (zoals hierboven in stappen beschreven)..Rmd-file aan knitr om de ‘R code chunks’ uit te voeren en een nieuwe .md file te maken.
.md file aan pandoc, die er een definitief document van maakt (b.v. html, Microsoft word, pdf, etc.).
.Rmd) om in een ander (in dit geval: HTML)Hoe een Rmd document wordt omgezet
Hoewel dit mogelijk wat ingewikkeld lijkt, kunnen we op de Knit knop drukken boven aan de pagina die er zo uitziet:
of we kunnen de volgende code runnen:
.Rmd fileLaten we eens met een RMarkdown gaan werken!
YAML staat voor “YAML Ain’t Markup Language” en is eigenlijk de structuur voor de metadata van het document. Het staat tussen twee regels van drie streepjes --- en wordt automatisch omgezet door RStudio. Een eenvoudig voorbeeld:
---
title: "Analyse Rapport"
Author: "Harrie Jonkman"
date: "1 Maart 2017"
output: html_document
---
Het voorbeeld boven zal een HTML document maken. Echter, de volgende opties zijn ook beschikbaar.
html_documentpdf_documentword_documentbeamer_presentation (pdf powerpoint)ioslides_presentation (HTML powerpoint)Hier ligt de nadruk op HTML files. Echter voel je vrij als je hier wat mee wilt spelen door bv. word en pdf documenten te maken. Presentatie-documenten kennen een wat andere syntax (bv. om aan te geven wanneer de ene dia eindigt en de andere begint) en dan is er nog wat markdown syntax specifiek voor presentaties maar die gaat voorbij het doel van deze workshop.
Kijk hiernaar RMarkdown Reference Guide
Haal hier ook informatie vandaan RMarkdown Cheatsheet:
Markdown Basis van RStudio’s RMarkdown Cheatsheet
Handige tips:
^ aan beide zijden plaatsen. Superscript werd gevormd door Super^script^ te typen.$ en als blok gecentreerd binnen het document door $$. Bijvoorbeeld \(E = mc^2\) staat tussen de regels terwijl het volgende geblokt wordt opgenomen: \[E = mc^2\]$\sqrt{b}$ zal \(\sqrt{b}\) maken - Breuken: $\frac{1}{2}$ = \(\frac{1}{2}\)$f(x)=\frac{P(x)}{Q(x)}$ = \(f(x)=\frac{P(x)}{Q(x)}\)$\binom{k}{n}$ = \(\binom{k}{n}\)$$\int_{a}^{b} x^2 dx$$ = \[\int_{a}^{b} x^2 dx\]
Nog wat wiskundig materiaal:
| Beschrijving | Code | Voorbeelden |
|---|---|---|
| Griekse letters | $\alpha$ $\beta$ $\gamma$ $\rho$ $\sigma$ $\delta$ $\epsilon$ $mu$ |
\(\alpha\) \(\beta\) \(\gamma\) \(\rho\) \(\sigma\) \(\delta\) \(\epsilon\) \(\mu\) |
| Binaire handelingen | $\times$ $\otimes$ $\oplus$ $\cup$ $\cap$ |
\(\times\) \(\otimes\) \(\oplus\) \(\cup\) \(\cap\) \(\times\) |
| Relationele handelingen | $< >$ $\subset$ $\supset$ $\subseteq$ $\supseteq$ |
\(< >\) \(\subset\) \(\supset\) \(\subseteq\) \(\supseteq\) |
| Verder | $\int$ $\oint$ $\sum$ $\prod$ |
\(\int\) \(\oint\) \(\sum\) \(\prod\) |
Uitdaging: Probeer eens de volgende output te maken:
Vandaag voel ik mij vet omdat ik RMarkdown leer.
honing is heel zoet.
YAS!!!!!!
R2 waarden zijn informatief!
\(R^{2}\) beschrijft de variantie verklaard door het model.
Ik kende geen RMarkdown Vandaag heb ik RMarkdown geleerd
# RMarkdown
## R
### Knitr
#### Pandoc
##### HTML
\(\sqrt{b^2 - 4ac}\)
\[\sqrt{b^2 - 4ac}\]
\(X_{i,j}\)
- Vandaag maak ik een dynamisch document!
Chocolade Chips Kook Recept
Er zijn twee manieren om een code in een RMarkdown document op te nemen.
Code in het document: Korte code als een onderdeel van het geschreven document.
Code Chunks: Delen van het document die verschillende programmeer of analyse codes omvatten. Daarmee kan een figuur of tabel worden gemaakt, statistieken worden berekend, pakketten worden geladen, etc.
Een R code kan in het document wordt gemaakt door een komma hoog achterwaarts (`) en de letter r gevolgd door nog zo’n komma.
Stel dat je een p-waarde rapporteert en je wilt niet terug om de statistische test steeds weer uit te voeren. De p-waarde was eerder 0.0045.
Dit is echt handig als de resultaten op papier moeten worden gezet. Bijvoorbeeld, je hebt een aantal statistieken uitgevoerd voor jouw wetenschappelijke vragen is dit een manier waarop R die waarde in a variabele naam bewaart. Bijvoorbeeld: Wijkt het brandstofverbruik van de automaat significant af de auto met handtransmissie significant af binnen de mtcars data set?
mpg_auto <- mtcars[mtcars$am == 0,]$mpg # automatic transmission mileage
mpg_manual <- mtcars[mtcars$am == 1,]$mpg # manual transmission mileage
transmission_ttest <- t.test(mpg_auto, mpg_manual)Om de p-waarde vast te stellen kunnen we transmission_ttest$p.value als R code in het document gebruiken.
De p-waarde is dan 0.0013736.
R code chunks (nogmaals ik gebruik maar de Engelse benaming hier, sorry)kunnen worden gebruikt om de R output in het document te krijgen of om de code als illustratie zichtbaar te maken.
De anatomie van een code chunk:
Om een R code chunk te plaatsen, kun je met de hand typen door ```{r} gevolgd door ``` op een volgende regel. Je kunt ook de Insert a new code chunk knop gebruiken of de ‘shortcut key’. Dat geeft dan de volgende code chunk:
Een code chunk invoeren
```{r}
n <- 10
seq(n)
```
Geef de code chunk een betekenisvolle naam die samenhangt met wat het doet. Hieronder heb ik code chunk 10-random-numbers genoemd:
```{r 10-random-numbers}
n <- 10
seq(n)
```
De code chunk input en output zien er dan als volgt uit:
## [1] 1 2 3 4 5 6 7 8 9 10
Knitr is een R-pakket dat werkt met
Knitr draait de code zoals die in de R console zou draaien.
Knitr werkt vooral met code chunks.
Een code chunk ziet er als volgt uit:
```r
x <- rnorm(100)
y <- 2*x + rnorm(100)
```
Goede praktijken met betrekking tot code chunks:
Chunk labels krijgen unieke IDs in een document en zijn goed voor:
.Rmd documenten.Een methode om door lange .Rmd files te navigeren
Als je de code chunk een naam geef, gebruik dan - of _ tussen woorden voor code chunks labels in plaats van ruimtes. Dat helpt jou en andere gebruikers bij het navigeren in het document.
Chunk labels moeten uniek zijn in het document - anders zal er een fout optreden!
Druk tab als tussen de haakjes code chunk opties omhoog komen.
Enkele Knitr Chunk Opties
results = "asis" staat voor “as is” en geeft de output van een niet geformateerde versie.collapse is een andere chunk optie die handig kan zijn, zeker als een code chunk veel korte R uitdrukking heeft met wat output.Er zijn teveel chunk opties om hier te behandelen. Kijk na deze workshop nog eens wat rond voor deze opties.
Een mooie website om dat op te doen is Knitr Chunk Options.
Uitdaging
Draai de code chunk hieronder en speel wat met de volgende knitr code chunk opties:
eval = TRUE/FALSE
echo = TRUE/FALSE
collapse = TRUE/FALSE
results = "asis","markupen"hide
Sla je resultaten op in markdown.
Opgelet: Wees er zeker van dat je jouw chunks een naam geeft!
Enkele voorbeelden voortbouwend op de chunk hierboven
Resultaten van results="markup", collapse = TRUE}:
1+1
## [1] 2
2*5
## [1] 10
seq(1, 21, by = 3)
## [1] 1 4 7 10 13 16 19
head(mtcars)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1Resultaten van results="asis", collapse = TRUE}:
[1] 2
[1] 10
[1] 1 4 7 10 13 16 19
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
Het kan zijn dat je dezelfde chunk settings wilt handhaven voor het gehele document. Het kan daarom handig zijn om de opties in een keer te typen in plaats van het iedere keer weer voor een chunk te moeten doen. Om dat te doen kun je de globale chunk opties bovenaan het document vaststellen.
knitr::opts_chunk$set(echo = FALSE,
eval = TRUE,
message = FALSE,
warning = FALSE,
fig.path = "Figures/",
fig.width = 12,
fig.height = 8)
Als je bijvoorbeeld met iemand samenwerkt die de code niet wil zien, kun je schrijven eval = TRUE en echo = FALSE gebruiken zodat de code wel gedraaid wordt maar niet getoond. In aanvulling wil je misschien message = FALSE en warning = FALSE gebruiken zodat jouw samenwerkingspartner geen enkele boodschap of waarschuwing van R ziet.
Als je figuren wilt opslaan en bewaren in een subdirectory binnen het project, gebruik dan fig.path = "Figures/". Hier verwijst de "Figures/" naar een folder Figures binnen de huidige directory waar de figuur die gemaakt wordt in het document wordt opgeslagen.
Opgelet: de figuren worden niet standaard opgeslagen.
Globale chunk opties zullen voor de rest van het documenten worden vastgezet. Als je wilt dat een bepaalde chunk afwijkt van de globale opties, maak dat aan het begin van die bepaalde chunk duidelijk.
Knitr maakt vrij eenvoudig figuren. Als een analyse code binnen een chunk een bepaald figuur moet produceren, dan zal hij dat in het document afdrukken.
Enkele knitr chunk opties gerelateerd aan figuren:
fig.width en fig.height
fig.width = 7, fig.height = 7fig.align: Hoe het figuur uit te lijnen
"left", "right" en "center"fig.path: Een file pad naar de directory waar knitr de grafische output moet opslaan die er met de chunk wordt gemaakt.
'figure/'fig.retina(alleen voor HTML output) voor hogere figuur resoluties met retina afdrukken.Een enkelvoudig figuur maken:
Met fig.align = "center"
ggplot(mtcars, aes(x = mpg)) + xlab("Miles per Gallon") +
geom_histogram(bins = 30, fill = "cornflowerblue", color = "black") +
geom_vline(xintercept=mean(mtcars$mpg), col="red") Met fig.align = "right"
ggplot(mtcars, aes(x = mpg)) + xlab("Miles per Gallon") +
geom_histogram(bins = 30, fill = "cornflowerblue", color = "black") +
geom_vline(xintercept=mean(mtcars$mpg), col="red") Met fig.align = "left"
ggplot(mtcars, aes(x = mpg)) + xlab("Miles per Gallon") +
geom_histogram(bins = 30, fill = "cornflowerblue", color = "black") +
geom_vline(xintercept=mean(mtcars$mpg), col="red") Met fig.width = 2, fig.height = 2
ggplot(mtcars, aes(x = mpg)) + xlab("Miles per Gallon") +
geom_histogram(bins = 30, fill = "cornflowerblue", color = "black") +
geom_vline(xintercept=mean(mtcars$mpg), col="red") Met fig.width = 10, fig.height = 10
ggplot(mtcars, aes(x = mpg)) + xlab("Miles per Gallon") +
geom_histogram(bins = 30, fill = "cornflowerblue", color = "black") +
geom_vline(xintercept=mean(mtcars$mpg), col="red") myplots <- list() # new empty list
for(i in 1:ncol(mtcars)){
col <- names(mtcars)[i]
ggp <- ggplot(mtcars, aes_string(x = col)) +
geom_histogram(bins = 30, fill = "cornflowerblue", color = "black") +
geom_vline(xintercept = mean(mtcars[[col]]), col = "red")
myplots[[i]] <- ggp # add each plot into plot list
}
multiplot(plotlist = myplots, cols = 4) # must load in multiplot function from the Rcookbook see http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/Tabellen kunnen in Markdown voor nogal wat hoofdpijn kosten. We gaan er hier verder niet op in. Als je meer wilt leren over Markdown-tabellen kijk naar documentation on tables op de RMarkdown website.
Er zijn enkele tabeltypen die handig kunnen zijn. Hier zullen we ons vorig voorbeeld gebruiken van de mtcars data
In zijn Knitr in a Knutshell introduceert Dr. Karl Broman: kable, panderen xtable en vooral die eerste twee deden mij plezier:
kable: Binnen het knitr pakket - niet veel opties maar het ziet er goed uit.pander: Binnen het pander pakket - heeft veel opties en handigheden. Makkelijk voor het vetmaken van waarden (bv. waarden onder een bepaalde waarde).kable en pander tabellen zijn mooi en handig bij het maken van niet-interactieve tabellen:
| mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Mazda RX4 | 21.0 | 6 | 160 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
| Mazda RX4 Wag | 21.0 | 6 | 160 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
| Datsun 710 | 22.8 | 4 | 108 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
| Hornet 4 Drive | 21.4 | 6 | 258 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
# Pander table
# install.packages("pander") # install pander first
library(pander)
pander(head(mtcars, n = 4))| mpg | cyl | disp | hp | drat | wt | qsec | vs | am | |
|---|---|---|---|---|---|---|---|---|---|
| Mazda RX4 | 21 | 6 | 160 | 110 | 3.9 | 2.62 | 16.46 | 0 | 1 |
| Mazda RX4 Wag | 21 | 6 | 160 | 110 | 3.9 | 2.875 | 17.02 | 0 | 1 |
| Datsun 710 | 22.8 | 4 | 108 | 93 | 3.85 | 2.32 | 18.61 | 1 | 1 |
| Hornet 4 Drive | 21.4 | 6 | 258 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 |
| gear | carb | |
|---|---|---|
| Mazda RX4 | 4 | 4 |
| Mazda RX4 Wag | 4 | 4 |
| Datsun 710 | 4 | 1 |
| Hornet 4 Drive | 3 | 1 |
Met de uitgave van de nieuwe RMarkdown v2 is het makkelijker dan ooit tevoren om HTML Widgets te gebruiken. Volg de link om uit te zoeken in welke widgets jij ge?nteresseerd bent!
Onlangs ontdekte ik bijvoorbeeld het DT pakket waarmee tabellen interactief kunnen worden gemaakt in de HTML output. Daarbij levert Plotly for R echt mooie interactieve grafieken op, welke gebaseerd zijn op Plotly.
Cool, of niet?
# DT table = interactive
# install.packages("DT") # install DT first
library(DT)
datatable(head(mtcars, n = nrow(mtcars)), options = list(pageLength = 5)) # plotly
# install.packages("plotly")
library(plotly)
mtcars$car <- row.names(mtcars)
plot_ly(mtcars, x = wt, y = mpg,
text = paste("Car: ", car),
mode = "markers", color = wt, size = wt)## Error in plot_ly(mtcars, x = wt, y = mpg, text = paste("Car: ", car), : object 'wt' not found
In de spelling kunnen natuurlijk altijd fouten zitten en daarom kan het nodig zijn dat we onze spelling in het document willen controleren. Er zijn twee manieren om de spelling te controleren:
aspell() functie van het utils pakket. Je kunt dan echter beter de code chunks overslaan. De aspell() functie kan een filter functie overnemen om bepaalde regels in de files over te slaan en kan worden gebruikt met de knit_filter() die ontworpen is om de code chunks in een file over te slaan.Het knitr-syntax-thema kan worden aangepast of helemaal naar de hand worden gezet. Als je de standaardthema’s niet wilt, gebruik dan het knit_theme om het te veranderen. Er zijn 80 thema’s opgenomen binnen knitr en we kunnen de namen ervan zien door knit_theme$get().
Wat zijn de eerste 30 knitr thema’s?
## [1] "acid" "aiseered" "andes" "anotherdark"
## [5] "autumn" "baycomb" "bclear" "biogoo"
## [9] "bipolar" "blacknblue" "bluegreen" "breeze"
## [13] "bright" "camo" "candy" "clarity"
## [17] "dante" "darkblue" "darkbone" "darkness"
## [21] "darkslategray" "darkspectrum" "default" "denim"
## [25] "dusk" "earendel" "easter" "edit-anjuta"
## [29] "edit-eclipse" "edit-emacs"
Wij kunnen knit_theme$set() gebruiken om het thema vast te zetten. Om het thema op fruit vast te zetten, kunnen we de bijvoorbeeld de volgende code gebruiken:
Hier is de link naar jouw favoriete thema 80 knitr highlight themes.
Terwijl knitr binnen een R omgeving moet draaien, ondersteunt het ook andere programmeertalen waaronder:
We moeten echter het corresponderende software pakket installeren om een taal te gebruiken.
Gebruik de engine functie in Knitr. Deze functie laat de gebruiker de taal van een chunk specificeren.
engine = "bash" zal de boel in bash laden and stelt de gebruiker in staat de scripts zo binnen de code chunk te schrijven .Een inhoudsopgave kan aan het gerenderd document worden toegevoegd door de toc optie in de YAML kop te gebruiken.
Opties hierbij:
toc: of de inhoudsopgave moeten worden meegenomen:
toc: true: hier wordt de inhoudsopgave meegenomentoc: false: Hier wordt de inhoudsopgave niet meegenomentoc_depth:: Hoeveel niveau’s moeten in de inhoudsopgave worden worden meegenomen?
doc_depth: 3 zal koppen tot en met ### meenemen.number_sections: Voegt sectienummers toe aan de koppen. Bijvoorbeeld, dit document heeft number_sections: true
number_sections: false# zal er een decimaal punt worden toegevoegd aan alle koppen.toc_float:
toc_float:
collapsed: Controleert of de inhoudsopgave alleen aan het begin verschijnt. Het zal met de cursor erover verschijnen.
collapsed: TRUEsmooth_scroll: Controleert of de pagina scrolls werken wanneer op de onderdelen van de inhoudsopgave wordt geklikt.
smooth_scroll: trueBijvoorbeeld:
output:
html_document:
toc: true
toc_depth: 2
---
Uitdaging: Maak de YAML kop voor een HTML document die het volgende inhoudt:
- Inhoudsopgave
- Laat de inhoudsopgave vloeien
- Sectie koppen met twee hashtags (
##)
- Genummerde secties
- Geen makkelijke scrolling
RMarkdown heeft verschillende opties voor de HTML documenten. Enkele mogelijkheden waaruit kan worden gekozen, hier met de Engelse termen:
De HTML output thema’s komen van Bootswatch library. Valide HTML themes omvatten de volgende:
cerulean, cosmo,flatly, journal, readable,spacelab en united.
readable.Highlight specificeert de wijze waarop de syntax stijl oplicht. Stijlen die mogelijk zijn omvatten de volgende:
default, espresso, haddock, kate, monochrome, pygments, tango, textmate en zenburn.Smart indiceert of de typografisch correcte output wordt weergegeven, zet rechte aanhalingstekens om in gekru, — rechte aanhalingstekens, – om in gekrulde aanhalingstekens en … in ellipsen. Smart is standaard ingesteld.
Bijvoorbeeld:
---
output:
html_document:
theme: slate
highlight: tango
---
Als je wilt kun je ook jouw eigen stijl-thema produceren en gebruiken. Als je dat zou doen, zou de output sectie van jouw YAML kop er z’on beetje zo uitzien:
output:
html_document:
css: styles.css
Als je nog wat verder wilt gaan en jouw eigen thema wilt schrijven in aanvulling op het oplichten, zou de YAML kop er beetje zo uitzien:
---
output:
html_document:
theme: null
highlight: null
css: styles.css
---
Hier is een link naar Pr?sance en Stijl in de HTML output.
Het is ook mogelijk om een bibliografie file in de YAML kop mee te nemen. Bibliografie formats die door Pandoc gelezen kunnen worden zijn:
| Format | File extension |
|---|---|
| MODS | .mods |
| BibLaTeX | .bib |
| BibTeX | .bibtex |
| RIS | .ris |
| EndNote | .enl |
| EndNote XML | .xml |
| ISI | .wos |
| MEDLINE | .medline |
| Copac | .copac |
| JSON citeproc | .json |
Om een bibliografie in RMarkdown te maken, zijn er twee files nodig:
Een voorbeeld YAML kop met een bibliografie en een citaat stijl taal (CSL) file is:
output: html_document
bibliography: bibliography.bib
csl: nature.csl
Bekijk de erg behulpzame webpagina van het R Core team op bibliographies and citations.
Als je R pakketten wilt citeren, heeft knitr zelfs een functie die write_bib() heet en die .bib overzicht van R pakketten kan leveren. Het wordt zelfs in een file geschreven!
write_bib(file = "r-packages.bib") # will write all packages
write_bib(c("knitr", "ggplot2"), file = "r-packages2.bib") # Only writes knitr and ggplot2 packagesDe bibliografie wordt automatisch aan het einde van het document geplaatst. Daarom moet je jouw .Rmd document met # Referenties eindigen zodat de bibliografie naar de kop voor bibliografie komt.
Citation Sylte Language (CSL) is een op XML-gebaseerde taal die het format van citaten en bibliografie?n vaststelt. Referentie management programma’s zoals Zotero, Mendeley en Papers gebruiken allemaal CSL.
Zoek jouw favoriete tijdschrift en CSL in de Zotero Style Repository, waar nu meer dan 8,152 CSLs inzitten. Is er een stijl waar je naar zoekt en die er niet in zit?
output: html_document
bibliography: bibliography.bib
csl: nature.csl
In de github repo voor deze workshop heb ik de nature.csl en the-isme-journal.csl toegevoegd om mee te spelen. Download anders een stijl van de Zotero Style Repository!
Citaten gaan tussen vierkante haakjes [ ] en worden afgescheiden door punt-komma’s’ ;. Elk citaat moet een sleutel hebben, samen de @ + de citaat identificatie van de database vormen en die optioneel a prefix, a locator en a suffix hebben. Om te controleren wat de citaatsleutel is van een referentie, werp dan een blik op de .bib file. Hier in die file, kun je de sleutel voor elke referentie veranderen. Echter, wees er wel van bewust dat elke ID uniek is!
Hier zijn wat voorbeelden met bijpassende code in het Engels:
Microbes contorl Earth's biogeochemical cycles [@Falkowski2008].I love making beautiful plots with ggplot2 [@R-ggplot2]Dr. Yuhui Xie's book about Dynamic Documents [@Xie2015] inspired me to host this workshop.A great article in *Science* regarding biogeography of microbes asks readers to imagine they are Alice in Wonderland to and shrink down to understand the microbial world [@Green2008].Het is cool dat de enige refenties die aan het document worden toegevoegd degene zijn die jijzelf citeert!
Als je een keer een mooi dynamisch document hebt gemaakt wil je dat mogelijk delen met anderen. Een mogelijkheid om het te delen met de wereld is om het te hosten op RPubs. Met RStudio kan dit heel makkelijk! Doe het volgende:
.Rmd document.Als je veranderingen in het document wilt aanbrengen is het makkelijk om de webpagina te vernieuwen. Als je een keer jouw aangepaste documentg hebt gerenderd klik je op de knop rechtsboven in de hoek van de preview scherm. Het aangepaste document zal dezelfde URL hebben als het orginele document.
{} leent zich voor het opmaken van hele verschillende wetenschappelijke producten. Van een aantal belangrijke heb ik steeds een pdf-document gemaakt. Die vind je op HH en wel in het mapje 5.{}. Voor mensen die hiermee willen werken, is er een syntax. Met behulp daarvan kun je het product makkelijk en eenvoudig maken. In deze map van HH vind je informatie.
Een ieder die wel eens een wetenschappelijk artikel heeft gemaakt, weet dat je soms tegen ingewikkelde zaken aanloopt. De consistente opbouw bijvoorbeeld, het toevoegen van een tabel of een figuur, de referenties goed plaatsen. Als je in word werkt is het soms lastig als je van volgorde verandert. Bij {} is dat geen enkel probleem omdat hij de volgorde vanzelf weer herschikt. Hier vind je informatie: url{https://verweyjonker-my.sharepoint.com/personal/hjonkman_verwey-jonker_nl/_layouts/15/onedrive.aspx?id=%2Fpersonal%2Fhjonkman%5Fverwey%2Djonker%5Fnl%2FDocuments%2FHarrie%27sHoekje%2F5%2E%20Latex%2FDiverse%20producten%2FArtikel%2FScientificarticle%2Epdf&parent=%2Fpersonal%2Fhjonkman%5Fverwey%2Djonker%5Fnl%2FDocuments%2FHarrie%27sHoekje%2F5%2E%20Latex%2FDiverse%20producten%2FArtikel} vind je informatie
Een boek bestaat uit verschillende onderdelen, bijvoorbeeld uit een voorkant, een eerste pagina, een inhoudsopgave, de hoofdstukken en de literatuur. Hier wordt een stramien voor de opbouw van een boek aangeboden dat eenvoudig is aan te passen. Hier url{https://verweyjonker-my.sharepoint.com/personal/hjonkman_verwey-jonker_nl/_layouts/15/onedrive.aspx?id=%2Fpersonal%2Fhjonkman%5Fverwey%2Djonker%5Fnl%2FDocuments%2FHarrie%27sHoekje%2F5%2E%20Latex%2FDiverse%20producten%2FBoek%2FBoekNed%2Epdf&parent=%2Fpersonal%2Fhjonkman%5Fverwey%2Djonker%5Fnl%2FDocuments%2FHarrie%27sHoekje%2F5%2E%20Latex%2FDiverse%20producten%2FBoek }
Bepaalde uitgeverijen (Springer bijvoorbeeld of Wiley) hebben een eigen specifieke opmaak. Een voorbeeld hiervan is in de map geplaatst. Hier Springer url{https://verweyjonker-my.sharepoint.com/personal/hjonkman_verwey-jonker_nl/_layouts/15/onedrive.aspx?id=%2Fpersonal%2Fhjonkman%5Fverwey%2Djonker%5Fnl%2FDocuments%2FHarrie%27sHoekje%2F5%2E%20Latex%2FDiverse%20producten%2FBoek%2FSpringer%2FspringerHarrie%2Epdf&parent=%2Fpersonal%2Fhjonkman%5Fverwey%2Djonker%5Fnl%2FDocuments%2FHarrie%27sHoekje%2F5%2E%20Latex%2FDiverse%20producten%2FBoek%2FSpringer }
{} kan ook makkelijk een eboek maken. In deze map vind je het verhaal van Hans en Grietje als eboekvoorbeeld. De typografische opmaak is in {} gezet. Hier een eboek: url{https://verweyjonker-my.sharepoint.com/personal/hjonkman_verwey-jonker_nl/_layouts/15/onedrive.aspx?id=%2Fpersonal%2Fhjonkman%5Fverwey%2Djonker%5Fnl%2FDocuments%2FHarrie%27sHoekje%2F5%2E%20Latex%2FDiverse%20producten%2FEboek%2Febook%2Epdf&parent=%2Fpersonal%2Fhjonkman%5Fverwey%2Djonker%5Fnl%2FDocuments%2FHarrie%27sHoekje%2F5%2E%20Latex%2FDiverse%20producten%2FEboek }
Vorig jaar heb ik een onderzoeksverslag in {} opgemaakt. In nauw overleg met het secretariaat heb ik voor hetzelfde lettertype en dezelfde opbouw gekozen. Als je een beetje met {} kunt werken is zo’n rapport snel te maken. In bepaald opzicht is het bijvoorbeeld preciezer (bijvoorbeeld bij tabellen en literatuurverwijzingen).
Hier een voorbeeld: url{https://verweyjonker-my.sharepoint.com/personal/hjonkman_verwey-jonker_nl/_layouts/15/onedrive.aspx?id=%2Fpersonal%2Fhjonkman%5Fverwey%2Djonker%5Fnl%2FDocuments%2FHarrie%27sHoekje%2F5%2E%20Latex%2FDiverse%20producten%2FRapport%2FHPCBeleidsnotitiearticle%2Epdf&parent=%2Fpersonal%2Fhjonkman%5Fverwey%2Djonker%5Fnl%2FDocuments%2FHarrie%27sHoekje%2F5%2E%20Latex%2FDiverse%20producten%2FRapport }.
Wij gebruiken allemaal powerpoint. Maar met {} kun je hele mooie en precieze presentaties geven. Hier vind je een voorbeeld van een presentatie die ik begin 2017 in Bombay gaf: url{https://verweyjonker-my.sharepoint.com/personal/hjonkman_verwey-jonker_nl/_layouts/15/onedrive.aspx?id=%2Fpersonal%2Fhjonkman%5Fverwey%2Djonker%5Fnl%2FDocuments%2FHarrie%27sHoekje%2F5%2E%20Latex%2FDiverse%20producten%2FPresentatie%2FBombay2017%2Epdf&parent=%2Fpersonal%2Fhjonkman%5Fverwey%2Djonker%5Fnl%2FDocuments%2FHarrie%27sHoekje%2F5%2E%20Latex%2FDiverse%20producten%2FPresentatie }
Uit eigen ervaring weet ik dat de opmaak van een proefschrift lastig kan zijn. Vaak denk je daar pas helemaal aan het einde aan en dan moet je hiervoor iemand inhuren. Voor de opmaak ben je dan al snel 1000-1500 euro kwijt. Met {} kun je het gewoon zelf. Een pdf-tekst en een syntax heb ik in het mapje 5. {} erbij geleverd.
Hier: url{https://verweyjonker-my.sharepoint.com/personal/hjonkman_verwey-jonker_nl/_layouts/15/onedrive.aspx?id=%2Fpersonal%2Fhjonkman%5Fverwey%2Djonker%5Fnl%2FDocuments%2FHarrie%27sHoekje%2F5%2E%20Latex%2FDiverse%20producten%2FProefschrift%2Fthesis%2Epdf&parent=%2Fpersonal%2Fhjonkman%5Fverwey%2Djonker%5Fnl%2FDocuments%2FHarrie%27sHoekje%2F5%2E%20Latex%2FDiverse%20producten%2FProefschrift }