Albart Coster
John Bastiaansen
Hiervoor hebben we de volgende onderwerpen behandeld:
Het is vaak belangrijk om automatisch rapporten te maken van grote hoeveelheden gegevens. Dat gaan we hier doen met het pakket knitr, voor een uitgebreide beschrijving zie yihui.name/knitr/. Met dit pakket is het mogelijk om R-code in een document uit te voeren en R de resultaten terug te laten schrijven naar het document en het hele document om te zetten naar een webpagina in html-formaat.
Het document moet in Markdown formaat worden geschreven, http://daringfireball.net/projects/markdown/. De R-code kan op een speciale manier aan het document worden toegevoegd. Vervolgens worden het gehele document door functie knit behandeld en weggeschreven als html document.
Documenten die op deze manier worden geschreven worden gewoonlijk opgeslagen in Rmd (R markdown) formaat. In Rstudio is het mogelijk om direct Rmd bestanden te maken.

Maak een nieuw Rmd bestand
Vervolgens kan in Rstudio het Rmd bestand ook direct worden omgezet naar een html bestand met de knop Knit HTML in Rstudio. Probeer dit eens met het voorbeeld Rmd bestand dat Rstudio weergeeft als je een nieuw Rmd bestand wilt maken.
Hier maken we een rapport van de gegevens uit het Winpulsa.mdb bestand dat we eerder hebben gezien. We nemen de volgende stappen:
Opzetten van het Rmd document
Inlezen van de gegevens uit het Winpulsa.mdb bestand
Maak een snelzichttabel (aantal koeien, aantal dagen in laktatie, gemiddeld laktatienummer, gemiddelde productie)
Maak een tabel van de melkproductie per groep
Maak een tabel van de melkproductie per laktatiestadium
Maak een grafiek van de gemiddelde productie per groep
We moeten het document een titel gegeven, vertellen op welke datum het is gemaakt. Verder moeten we de juiste pakketten laden:
## % Rapport van melkproductie op `r format(Sys.time(),"%Y-%m-%d %H:%M:%S")`
##
## Rapport van dagproducties uit `Winpulsa.mdb` database, laatst veranderd op `r as.character(file.info("../bestanden/Winpulsa.mdb")$ctime)`.
##
## ```{r inlezengegevens, echo = FALSE,results= 'hide'}
## ## RODBC pakket om een verbinding met de database te maken
## require(RODBC)
## ## ggplot2 pakket om mooie grafieken te maken
## require(ggplot2)
## ## xtable pakket om tabellen in html-formaat te maken
## require(xtable)
## ## pakket reshape om tabellen te veranderen
## require(reshape)
##
##
## ## maken hier de verbinding met de database
## ## in mijn geval staat dit in de map ../bestanden
## conA <- odbcConnectAccess(file.path("../bestanden","Winpulsa.mdb"))
## ## maken nu de query om de gegevens uit de database te halen
## query <- paste("SELECT a.herdbuch_no AS DIER,m.group_no AS GROEP,a.calving AS KALF_DATUM,\n",
## "a.lactation AS NLACT,\n m.day AS DATUM,DateDiff('d',a.calving,m.day) AS DIL,\n",
## "m.amount AS KG_MELK,m.aver7_amount AS KG_MELK_GEMM\n",
## "FROM animals AS a\n",
## "INNER JOIN milkings AS m ON a.herdbuch_no = m.herdbuch_no\n",
## "WHERE m.amount IS NOT NULL AND m.amount > 0\n",
## "AND m.amount1 IS NOT NULL AND m.amount2 IS NOT NULL\n")
## prod <- sqlQuery(conA,query)
## odbcClose(conA)
## rm(conA)
## ```
##
## Hier moet de inhoud van het rapport komen ...
knit2html("voorbeeld_rapport_1.Rmd")
##
##
## processing file: voorbeeld_rapport_1.Rmd
## output file:
## C:\Users\Eigenaar\Dropbox\Rworkshop_maart_2013\rapporten\voorbeeld_rapport_1.md
Hier is het Rmd bestand: voorbeeld_rapport_1.Rmd. Het resultaat ziet er nu zo uit: voorbeeld_rapport_1.html.
We willen nu een tabel maken om een snel overzicht van de situatie te krijgen, in de tabel moet per dag het aantal koeien, de gemiddelde dagen in laktatie, het gemiddelde laktatienummer en de gemiddelde melkproductie staan.
## ```{r snelzicht,echo = FALSE,results = 'asis'}
## ## we maken even tabellen van het aantal dieren, het aantal dagen in laktatie, het gemiddelde laktatienummer en de gemiddelde productie:
## ## moeten ook afronden om de getallen mooi te krijgen
## tND <- with(prod,tapply(DIER,DATUM,length))
## tDIL <- round(with(prod,tapply(DIL,DATUM,mean,na.rm = TRUE)),0)
## tNLACT <- round(with(prod,tapply(NLACT,DATUM,mean,na.rm = TRUE)),2)
## tPROD <- round(with(prod,tapply(KG_MELK,DATUM,mean,na.rm = TRUE)),2)
##
## ## en zetten die tabellen bij elkaar in een data.frame
## tab <- data.frame(DATUM = names(tND),N_DIEREN = tND,DIL = tDIL,NLACT = tNLACT,PROD = tPROD)
##
## ## deze tabel is nu goed, nu zetten we hem in ons rapport
## ## we gebruiken nu functie xtable om er een goede html tabel van te maken, anders ziet het er niet uit
## print(xtable(tab,caption = 'Snelzicht van de het bedrijf.'),type = 'html',caption.placement = 'top',include.rownames = FALSE)
## ```
knit2html("voorbeeld_rapport_2.Rmd")
##
##
## processing file: voorbeeld_rapport_2.Rmd
## output file:
## C:\Users\Eigenaar\Dropbox\Rworkshop_maart_2013\rapporten\voorbeeld_rapport_2.md
Hier is het Rmd bestand: voorbeeld_rapport_2.Rmd. Het resultaat ziet er nu zo uit: voorbeeld_rapport_2.html.
De tabel ziet er niet geweldig uit, dit komt doordat er geen enkele opmaak bij zit. We kunnen dit aanpassen met een CSS-stijl. We een extra argument aan functie knit2html meegeven: stylesheet = 'custom_table.css':
knit2html(input = "voorbeeld_rapport_2.Rmd", output = "voorbeeld_rapport_2a.html",
stylesheet = "custom_table.css")
##
##
## processing file: voorbeeld_rapport_2.Rmd
## output file:
## C:\Users\Eigenaar\Dropbox\Rworkshop_maart_2013\rapporten\voorbeeld_rapport_2.md
Het resultaat ziet er nu zo uit: voorbeeld_rapport_2a.html.
De tabel milkings in de database bevat de groep waarin de koe was op elke datum, in de query in voorbeeld_rapport_1.Rmd kun je zien dat we m.group_no ophalen, zodat we op elke datum de juiste groep hebben. We gaan deze gegevens nu samenvatten per datum:
## ```{r overzichtgroepen,echo = FALSE,results = 'asis'}
## tGP <- round(with(prod,tapply(KG_MELK,list(DATUM,GROEP),mean,na.rm = TRUE)),2)
## print(xtable(tGP,caption = 'Gemiddelde melkproductie per groep en per datum.'),type = 'html',caption.placement = 'top',include.rownames = TRUE)
## ```
knit2html("voorbeeld_rapport_3.Rmd", stylesheet = "custom_table.css")
##
##
## processing file: voorbeeld_rapport_3.Rmd
## output file:
## C:\Users\Eigenaar\Dropbox\Rworkshop_maart_2013\rapporten\voorbeeld_rapport_3.md
Hier is het Rmd bestand: voorbeeld_rapport_3.Rmd. Het resultaat ziet er nu zo uit: voorbeeld_rapport_3.html.
Het is niet helemaal duidelijk dat de nummers boven de kolommen groepen aanduiden, we lossen dit eenvoudig op door de groepen te hernoemen:
## ```{r overzichtgroepen,echo = FALSE,results = 'asis'}
## ## we hernoemen de groepen, plakken er gewoon 'GROEP' voor zodat de kolommen meer ruimte innemen
## prod$GROEP <- paste('GROEP',prod$GROEP)
## tGP <- round(with(prod,tapply(KG_MELK,list(DATUM,GROEP),mean,na.rm = TRUE)),2)
## print(xtable(tGP,caption = 'Gemiddelde melkproductie per groep en per datum.'),type = 'html',caption.placement = 'top',include.rownames = TRUE)
## ```
knit2html("voorbeeld_rapport_3a.Rmd", stylesheet = "custom_table.css")
##
##
## processing file: voorbeeld_rapport_3a.Rmd
## output file:
## C:\Users\Eigenaar\Dropbox\Rworkshop_maart_2013\rapporten\voorbeeld_rapport_3a.md
Hier is het Rmd bestand: voorbeeld_rapport_3a.Rmd. Het resultaat ziet er nu zo uit: voorbeeld_rapport_3a.html.
Nu willen we nog een overzicht van de melkproducties per laktatienummer maken, we moeten de laktatienummers eerst maken met functie cut.
## ```{r laktatienummers,echo = FALSE,results = 'asis'}
## prod$NLACTcat <- cut(prod$NLACT,breaks = c(0,1,2,20),labels = c('1 lakt.','2 lakts.','3+ lakts.'))
## tNL <- with(prod,tapply(KG_MELK,list(DATUM,NLACTcat),mean,na.rm = TRUE))
## print(xtable(tNL,caption = 'Gemiddelde melkproductie per laktatienummer en per datum.'),type = 'html',caption.placement = 'top',include.rownames = TRUE)
## ```
knit2html("voorbeeld_rapport_4.Rmd", stylesheet = "custom_table.css")
##
##
## processing file: voorbeeld_rapport_4.Rmd
## output file:
## C:\Users\Eigenaar\Dropbox\Rworkshop_maart_2013\rapporten\voorbeeld_rapport_4.md
Hier is het Rmd bestand: voorbeeld_rapport_4.Rmd. Het resultaat ziet er nu zo uit: voorbeeld_rapport_4.html.
We maken nu een grafiek van de dagproducties, gegroepeerd per laktatienummer:
## ```{r grafiekgroepen,echo = FALSE,fig.cap = "Gemiddelde dagelijkse melkproductie per laktatienummer"}
## tabMN <- melt(with(prod,tapply(KG_MELK,list(DATUM,NLACTcat),mean)))
## colnames(tabMN) <- c('DATUM','NLACTcat','value')
## tabMN$DATUM <- as.Date(tabMN$DATUM)
## pp <- ggplot(data = tabMN,aes(x = DATUM,y = value,colour = NLACTcat)) + geom_line()
## pp
## ```
knit2html("voorbeeld_rapport_5.Rmd")
##
##
## processing file: voorbeeld_rapport_5.Rmd
## output file:
## C:\Users\Eigenaar\Dropbox\Rworkshop_maart_2013\rapporten\voorbeeld_rapport_5.md
Hier is het Rmd bestand: voorbeeld_rapport_5.Rmd. Het resultaat ziet er nu zo uit: voorbeeld_rapport_5.html.
We kunnen de verschillende onderdelen nu samenvoegen in een groot .Rmd bestand, voorbeeld_rapport.Rmd dat de verschillende onderdelen bevat:
knit2html("voorbeeld_rapport.Rmd", stylesheet = "custom_table.css")
##
##
## processing file: voorbeeld_rapport.Rmd
## output file:
## C:\Users\Eigenaar\Dropbox\Rworkshop_maart_2013\rapporten\voorbeeld_rapport.md
Het resultaat staat hier
In dit onderdeel van de workshop hebben we het volgende behandeld: