Les 7

Leeruitkomsten

  • De student kan uitkomsten inline rapporteren in een RMarkdown bestand.
  • De student kan tabellen weergeven in de html output van een RMarkdown bestand.
  • De student kan de output van de code chunks in een RMarkdown bestand aanpassen.

Voorbereiding

Opdracht 7

Maak een nieuw R project aan voor les 7.

NB: In de vorige les heb je geleerd dat je voor elk data analyseproject een folder aanmaakt, met daarin het R project. Voor de lesopdrachten (kleine opdrachten) volstaat het om één R project aan te maken in de map met de lesbestanden. Voor de opdracht in het werkcollege is het wel de bedoeling dat je de folderstructuur aanhoudt zoals beschreven in de vorige les.

Rapporten maken met RMarkdown (deel 2)

Tekst opmaken

Naast R code bevat een RMarkdown bestand ook tekst. Net als in een Word document kun je deze tekst opmaken. Hier een aantal voorbeelden:

  • Je kunt de tekst cursief maken door de tekst te omringen met enkele asterisk symbolen. Bijvoorbeeld: *cursief* wordt cursief.
  • Je kunt de tekst dikgedrukt maken door de tekst te omringen met dubbele asterisk symbolen. Bijvoorbeeld: **dikgedrukt** wordt dikgedrukt.
  • Je kunt cijfers of letters in superscript schrijven door ze te omringen met ^ symbolen. Bijvoorbeeld: 10^2^ wordt 102.
  • Je kunt cijfers of letters in subscript schrijven door ze te omringen met ~ symbolen. Bijvoorbeeld: H~2~O wordt H2O.
  • Het is ook mogelijk om kopjes en subkopjes aan je tekst toe te voegen. Hiervoor plaats je één of meerdere # symbolen voor je tekst.

Er zijn nog meer opties om de RMarkdown tekst van opmaak te voorzien. Je kunt hiervoor spiekbriefjes raadplegen in RStudio. De eenvoudigste spiekbrief is te vinden in het Help menu (in de menubalk helemaal bovenin RStudio) als Markdown Quick Reference. Een wat uitgebreidere spiekbrief vind je ook in het Help menu onder het submenu Cheatsheets als R markdown Reference Guide.

Inline code

Naast R code in de code chunks kun je ook in de tekst R code toevoegen. Dit is handig als je de getallen die R voor je berekend heeft (zoals een correlatiecoëfficiënt) in de tekst wilt weergeven. Natuurlijk kun je de uitkomst van de berekeningen ook overtypen. Het nadeel daarvan is dat als er iets in de data of de analyse verandert, de getallen in de tekst niet automatisch aangepast worden. Overtypen van de uitkomsten is daarom foutgevoeliger dan gebruik maken van zogenaamde inline code.

In de onderstaande video wordt getoond hoe je inline code kunt toevoegen aan een document:

Opdracht 7

Maak een nieuw RMarkdown bestand aan en sla dit bestand op in de map van het huidige R project (dus in de map van les 7). Verwerk in het RMarkdown bestand de volgende onderdelen:

  • Lees het bestand iris.txt in in R.
  • Schrijf een stukje tekst waarin je de minimale en maximale kroonbladlengte (Petal.Length) vermeldt van de irissoort versicolor. De getallen (het minimum en het maximum) moeten inline code zijn.

Hint: omdat bij inline code alle code kort en bondig geschreven moet worden, is het handig om de data vooraf te analyseren in een code chunk. De resultaten van de analyse (in dit geval het minimum en maximum) kun je opslaan in variabelen. Deze variabelen kun je dan gebruiken in de inline code.

  • Zorg ervoor dat de soortnaam Iris versicolor schuingedrukt in de tekst wordt weergegeven.
Klik hier voor het antwoord
---
title: "Analyse van de iris dataset"
author: "Bas van Gestel"
date: "2024-06-04"
output: html_document
---

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

Als eerste lezen we de data in in R. In dit geval is het een TSV bestand, dus we lezen de data in met de read_tsv functie.

```{r}
library(tidyverse)
irisdata <- read_tsv("iris.txt")
```

In deze rmarkdown willen we enkel kijken naar de data voor de soort *Iris versicolor*, dus we filteren de data:

```{r}
versicolor <- irisdata |> filter(Species == 'versicolor')
```

Vervolgens bepalen we de minimum en maximum voor de kroonbladlengte:

```{r}
min_kblengte <- min(versicolor$Petal.Length)
max_kblengte <- max(versicolor$Petal.Length)
```

De kroonbladlengte van de soort *Iris versicolor* varieert van `r min_kblengte` cm tot `r max_kblengte` cm.

De inhoud van het html bestand aanpassen met code chunk opties

In de normale situatie wordt tijdens het knitten van de RMarkdown alle R code uitgevoerd. Het output (html) bestand bevat de tekst, de R code en de output van die code (bijv. grafieken). Je kunt de inhoud van het output bestand wijzigen door middel van code chunk opties. Stel bijvoorbeeld dat je in het html bestand wel de output van de code weer wilt geven, maar niet de code zelf (bijvoorbeeld omdat de beoogde lezer geen R code begrijpt). In dat geval kunnen we dit op twee manieren bereiken:

Optie 1: we wijzigen de output voor alle code chunks

In het hierboven beschreven scenario willen we het gedrag van alle code chunks aanpassen. Dit is wat je meestal wilt. Om dit te doen maken we gebruik van de regel in het RMarkdown bestand die we tijdens het maken van het RMarkdown bestand hadden laten staan:

In de functie opts_chunk$set van het knitr package kun je alle code chunk opties opnemen die je wilt gebruiken. Standaard is hier de optie echo = TRUE opgenomen, wat betekent dat de R code zichtbaar is in het bestand. We kunnen dit aanpassen naar echo = FALSE:

Optie 2: we wijzigen de output voor een specifieke code chunk

In sommige gevallen wil je enkel de output van specifieke code chunks wijzigen. In die gevallen kun je de code chunk opties toevoegen aan de code chunk zelf, tussen de accolades na de letter r:

Op deze manier kun je ook uitzonderingen maken op de regel die je hebt gemaakt met de opts_chunk$set functie; de opties die je bij de code chunk vermeldt overschrijven de algemene code chunk opties zoals vermeldt in de opts_chunk$set.

Met code chunk opties kun je bepaalde onderdelen van de RMarkdown output in het html bestand weglaten. Echter, de normale tekst (dus alle tekst buiten de code chunks) wordt altijd weergegeven in het html bestand.

In het bovenstaande voorbeeld hebben we gekeken naar de echo optie. Er zijn nog veel meer code chunk opties die je kunt gebruiken. In de onderstaande tabel vind je een overzicht.

Optie Interpreteer code Code zichtbaar Output zichtbaar Grafieken zichtbaar Messages zichtbaar Warnings zichtbaar
eval=FALSE nee ja nee nee nee nee
include=FALSE ja nee nee nee nee nee
echo=FALSE ja nee ja ja ja ja
results=“hide” ja ja nee ja ja ja
fig.show=“hide” ja ja ja nee ja ja
message=FALSE ja ja ja ja nee ja
warning=FALSE ja ja ja ja ja nee
Opdracht 7

In de map van deze les vindt je het RMarkdown bestand IrisAnalyse.Rmd. In dit bestand wordt een grafiek gemaakt van data uit het bestand iris.txt (zie opdracht 6.2 in de vorige les). Pas het bestand aan met code chunk opties zodat:

  1. alleen de figuren zichtbaar zijn (dus geen code en eventuele andere output);
  2. alleen de code zichtbaar is (en niet de output van de code).
Klik hier voor het antwoord

Onderdeel a:

Onderdeel b:

Tabellen weergeven met de kable functie

Als je een dataframe of een tibble weergeeft in de html file dan ziet dat er hetzelfde uit als in R. Om de tabellen wat netter weer te geven in de html file, kun je gebruik maken van de kable functie uit het knitr package.

Als voorbeeld kijken we naar de data in het bestand penguins.txt (zie les 2). We gebruiken de onderstaande code chunk in de RMarkdown om de data in te lezen en om de eerste 5 regels van de tabel weer te geven in de html:

```{r}
library(tidyverse)
library(knitr)
penguins <- read_tsv("penguins.txt")
kable(head(penguins, 5))
```

De tabel ziet er dan als volgt uit in het html bestand:

species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex year
Adelie Torgersen 39.1 18.7 181 3750 male 2007
Adelie Torgersen 39.5 17.4 186 3800 female 2007
Adelie Torgersen 40.3 18.0 195 3250 female 2007
Adelie Torgersen NA NA NA NA NA 2007
Adelie Torgersen 36.7 19.3 193 3450 female 2007

Omdat de tabel eigenlijk te breed is om weer te geven, is het beter om aan te geven welke kolommen je wilt weergeven met de select functie. In dit voorbeeld laten we alleen de soort pinguïn, het lichaamsgewicht en het geslacht zien:

```{r}
library(tidyverse)
library(knitr)
penguins <- read_tsv("penguins.txt")
penguins_select <- penguins |> select(species, body_mass_g, sex)
kable(head(penguins_select, 5))
```

De tabel ziet er dan als volgt uit in het html bestand:

species body_mass_g sex
Adelie 3750 male
Adelie 3800 female
Adelie 3250 female
Adelie NA NA
Adelie 3450 female

Het is ook mogelijk om de inhoud van de tabel te sorteren op basis van een kolom met de arrange functie. In dit geval sorteren we de data op basis van het lichaamsgewicht (van zwaar naar licht):

```{r}
library(tidyverse)
library(knitr)
penguins <- read_tsv("penguins.txt")
penguins_select_sort <- penguins |> select(species, body_mass_g, sex) |>
    arrange(desc(body_mass_g))
kable(head(penguins_select_sort, 5))
```

De tabel ziet er dan als volgt uit in het html bestand:

species body_mass_g sex
Gentoo 6300 male
Gentoo 6050 male
Gentoo 6000 male
Gentoo 6000 male
Gentoo 5950 male
Opdracht 7

Maak een nieuw RMarkdown bestand aan en sla dit bestand op in de map van het huidige R project (dus in de map van les 7). Verwerk in het RMarkdown bestand de volgende onderdelen:

  • Lees het bestand lifeexpectancy.csv in in R.
  • Laat in het html bestand de eerste 10 regels zien van de data. Zorg ervoor dat de tabel gesorteerd is op levensverwachting (life_expectancy), van klein naar groot. Zorg er ook voor dat de tabel in het html bestand netjes wordt weergegeven.
  • Laat in het html ook een tabel zien met daarin voor elk jaar het land met de hoogste levensverwachting. Zorg er opnieuw voor dat de tabel in het html bestand netjes wordt weergegeven.
  • Zorg ervoor dat messages en warnings niet worden weergegeven in het html bestand.
Klik hier voor het antwoord
---
title: "Life expectancy data"
author: "Bas van Gestel"
date: "2024-06-04"
output: html_document
---

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

We lezen de data in in R:

```{r}
library(tidyverse)
lifeExp <- read_csv("lifeexpectancy.csv")
```

Hieronder zie je tien datapunten met de laagste levensverwachting:

```{r}
lifeExp_sort <- lifeExp |> arrange(life_expectancy)
knitr::kable(head(lifeExp_sort, 10))
```

We bepalen nu voor elk jaar het land met de hoogste levensverwachting. De resultaten geven we weer in een tabel:

```{r}
lifeExp_max <- lifeExp |> group_by(year) |> 
  filter(life_expectancy == max(life_expectancy, na.rm = TRUE))
knitr::kable(lifeExp_max)
```

Werkcollege

Casus Les 7

Werk de casus van les 4 uit in een RMarkdown document. Zorg ervoor dat het document voldoet aan het volgende:

  • Alle R code is opgenomen in het RMarkdown document als code chunks.
  • De conclusies en toelichtingen op de analyse zijn uitgewerkt in de tekst. De tekst bevat kopjes die duidelijk maken uit welke stappen de analyse bestaat.
  • De grafieken zijn voorzien van bijschriften.
  • In het html bestand worden de R code en messages/warnings niet weergegeven. De output van de code wordt wel weergegeven.
  • In de tekst wordt de gevonden determinatiecoëfficiënt met inline code gerapporteerd.
  • In het html bestand worden de oorspronkelijke tabellen op een nette manier weergegeven (voor het inspecteren van de data op uitschieters).
  • De data management voor de analyse voldoet aan de in les 6 beschreven eisen.