--- title: "R Markdown" author: "Karel Rečka" date: "`r format(Sys.time(), '%d. %m. %Y')`" knit: (function(inputFile, encoding) { out_dir <- 'tutorials'; rmarkdown::render(inputFile, encoding=encoding, output_file=file.path(dirname(inputFile), out_dir, '07_rmarkdown.html')) }) output: html_document: toc: yes toc_float: yes toc_depth: 2 number_sections: yes theme: readable highlight: zenburn bibliography: library.bib csl: apa.csl params: class: 1 --- ```{css, echo=FALSE} .output-background { background-color: #F6F6F6; } ``` ```{r setup, include = FALSE} options(width = 90) knitr::opts_chunk$set( cache = TRUE, fig.path = "figures/", comment = "###", collapse = TRUE, class.output = "output-background" ) knitr::opts_template$set( fullwidth = list( fig.width = 10, fig.height = 6, out.width = '100%' ) ) fnum <- function(x, digits = 2) { format(round(x, digits), nsmall = digits, big.mark = " ", decimal.mark = ",") } ``` # Použité balíčky ```{r packages, cache=FALSE, message=FALSE, warning=FALSE} # Načtení potřebných balíčků library(haven) library(tidyverse) library(DT) ``` # Import a příprava dat ```{r data-import, cache.extra = file.info("https://is.muni.cz/el/fss/podzim2022/PSYn5320/um/datasets/titanic.sav")} # Import dat o pasažérech titanicu titanic <- haven::read_spss( "https://is.muni.cz/el/fss/podzim2022/PSYn5320/um/datasets/titanic.sav") ``` ```{r data-preparation, dependson = "data-import"} # Tranformace vybraných proměnných na faktory titanic <- titanic %>% mutate( survived = factor(survived, levels = 0:1, labels = c("Died", "Survived")), class = factor(class), sex = factor(sex, levels = c("male", "female"), labels = c("Male", "Female")) ) # Přehled výsledného datasetu glimpse(titanic) head(titanic) ```
# Úvod ke kapitole, která je tak trochu jiná Rmarkdown je způsob, jak zkombinovat analýzu a zprávu o analýze do jednoho dokumentu. Jde vlastně o obyčejný textový soubor, který obsahuje formátovací značky (podobně jako třeba obyčejné html), a vedle toho obsahuje také kousky Rkového kódu. Když v RStudiu takový soubor "spustíme" (knit), text se podle formátovacích značek zformátuje, Rkový kód se vykoná a jeho výsledky se zakomponují do textu. Výsledek může mít podobu webové stránky nebo třeba pdf dokumentu. Tímto způsobem vznikla celá cvičebnice, se kterou právě pracujete. Nyní čtete výslednou pdf podobu. Zdrojový Rmarkdownový kód, který ji vytvořil, najdete na adrese https://is.muni.cz/el/fss/podzim2023/PSYb5320/um/6_RMarkdown2.Rmd . Stáhněte si ji, zkuste číst přímo kód a sem se dívejte jen, když si nebudete umět představit, co je výsledkem kódu. Rmarkdown je v základu velmi jednoduchý a intuitivní; pokročilejší prvky můžete do svého repertoáru zařazovat postupně. # Formátování textu ## Odstavce a řádky Ostavce oddělujte prázdnými řádky; pouhé "odentrování" nevytvoří nový odstavec, ale vše bude ve výsledném dokumentu v jednom odstavci textu. Odstavec 1 Odstavec 2 Odstavec 3 atd. Řádek můžete ukončit tím, že na jeho konci použijete dvakrát mezerník (pouhé "odentrování" řádek ve výsledném dokumentu neukončí) Tohle bude na samostatných řádcích. Pro zvětšení mezery mezi odstavci použijte buďto `\` nebo `
` na samostatném řádku, který nad sebou i pod sebou prázdný řádek. Můžeme použít např. pro pro větší oddělení nadpisů na první úrovni. Pokud používáte jako výstupní formát .doc, .pdf nebo .odt, můžete pomocí `\newpage` vložit konec stránky (page break). U HTML to nemá moc smysl, protože celý dokument je jeden spojitý celek, jedině kdybyste chtěli stránku tisknout. \newpage Odsazení textu můžeme zvětšit následovně: | Malé odsazení textu | Větší odsazení | Ještě větší odsazení ## Zdůraznění textu Když chcete něco napsat kurzivou, ohraničte to hvězdičkami nebo podtržítko (underscore) *toto bude kurzivou* a _toto bude také kurzivou_ Když chcete něco napsat tučně, použijte dvojité hvězdičky nebo podtržítko (underscore) **toto bude tučně** a __toto bude také tučně__ Kdybyste něco chtěli napsat kurzivou a zároveň tučně, použitje hvězdičky nebo uderscore třikrát ***toto bude tučně + kurzivou*** a ___toto bude také tučně + kurzivou___ když chcete zdůraznit, že hovoříte o nějakém datovém objektu nebo kódu, použijte zpětný apostrof: `data` `x <- c(0, 1, 2)` horní a dolní index vytvoříte pomocí ^ a ~ SD^2^ H~2~0 ## Nadpisy Nadpisy můžete tvořit hashtagem # # První úroveň nadpisu{-} ## Druhá úroveň nadpisu{-} ### Třetí úroveň nadpisu{-} #### Čtvrtá úroveň nadpisu{-} ##### Pátá úroveň nadpisu{-} ###### Šestá úroveň nadpisu{-} ## Seznamy a odrážky Nečíslované odrážky vytvoříte pomocí *, - nebo + (nezapomeňte oddělit seznam prázdnými řákdy z obou stran) * Položka 1 * Položka 2 - Položka 2A + Položka 2A I + Položka 2A II - Položka 2B Číslované odrážky vytvoříte takto, pokud vám stačí jedna úroveň 1. Položka 1 1. Položka 2 1. Položka 3 Nebo takto pro víceúrovňový číslovaný seznam 1. Položka 1: 1. Položka 1.1. (je nutné použít tabulátor dvakrát) 1. Položka 1.1.1. (je nutné použít tabulátor čtyřikrát) 1. Položka 1.2. 1. Položka 2
# Vkládání odkazů a obrázků ```{r download-image, include=FALSE} download.file("https://is.muni.cz/el/fss/podzim2022/PSYn5320/um/rmeme.png", "data/rmeme.png", method = "curl") ``` Webové odkazy a obrázky můžete vložit takto * Vložením holého URL: https://google.com. * Vložením URL s labelem [Google](https://www.google.com/). Obrázky lze vložit podobně – pomocí URL odkazu nebo odkazu na lokální uložiště. Velikost obrázku lze zmenšit např. přidáním `{width=50%}` ![Programming meme](data/rmeme.png){width=50%} Větší flexibilitu v úpravě obrázku umožňuje funkce `knitr::include_graphics()` v rámci bloku s kódem. ```{r datacamp-logo, opts.label='fullwidth'} knitr::include_graphics("data/rmeme.png") ```
# Bloky kódu a jejich nastavení ```{r } ``` Vložit blok kódu lze pomocí tlačítka v RStudiu (Insert code chunk) nebo pomocí klávesové zkratky Ctrl + I. Bloky kódu lze pojmenovat, což má několik výhod: * Lepší navigaci pomocí osnovy vlevo dole. * Vytvořené grafy budou mít srozumitelnější pojmenování. * Lépe se lze odkazovat na jiné bloky kódu, např. v případě cachingu (uložení výpočetně náročnějších operací, resp. jejich výstupů, do paměti). První blok kódu by měl být vždy pojmenován `setup` a obsahovat globální nastavení pomocí `knitr::opts_chunk$set()`. Tato nastevení převezmou všechny bloky, ale lze jej přepsat, protože prioritu má lokální nastavení konkrétního bloku. Bloky kódu mají spoustu nastavení, nejčastěji měníme následující: * `eval = FALSE` ukáže kód, ale nespustí jej, což se hodí, když chceme ukázat pouze příklad kódu. * `include = FALSE` spustí kód, ale skryje kód i jakýkoli výstup ve finálním dokumentu. Hodí se, pokud obojí není pro analýzu relevantní (`setup`) * `echo = FALSE` zobrazí pouze výstup, ale nikoli samotný kód. Hodí se, pokud píšeme zprávu pro někoho, kdo se v R nevyzná, takže by mu R-kód stejně nic neříkal. * `message = FALSE` zakáže zobrazování (nevarovných) hlášení a `warning = FALSE` zakáže zobrazování hvarovných hlášení ve finálním reportu. * `results = "hide"` zakáže zobrahení konzolového výstupu a `fig.show = "hide"` zakáže zobrazení grafického výstupu. `results = "hold"` umístí konzolový výstup až za všechen R-kód v daném bloku a `fig.show = "hold"` udělá totéž pro graficý výstup. * `cached = TRUE` uloží výsledky daného bloku kódu do zvláštního souboru na disk. Hodí se pro uložení výsledků výpočetně náročných operací. Pokud nedojde k žádné změně v daném boku kódu, operace v něm definované se nemusí spouštět znovu, ale její výsledky se načtou z disku. * `dependson = "predchozi-blok-kodu"` řeší to, že výsledky bloku kódu mohou záviset na předchozích blocích, ale kdybychom použili pouze `cached = TRUE`, kontrolují se pouze změny v daném bloku kódu. Když použijeme `dependson` s názvem vybraného předchozího bloku kódu, pak se `cached = TRUE` kontroluje i změny jiném uvedeném bloku kódu. * `cache.extra = file.info("externi_dataset.csv")` hlídá změny určeného externího datového souboru. Přehled nastavení můžete nalézt [zde](https://yihui.org/knitr/options/#chunk-options). Zkuste změnit některá z těchto nastavení v následujícím bloku kódu ```{r survival-and-age, } titanic %>% group_by(class, sex) %>% summarise( prop_survived = mean(survived == "Survived") ) titanic %>% ggplot(aes(age)) + geom_histogram() ``` Pokud chcete změnit defaultní (globální) nastavení pro bloky kódu, použijte funkci `knitr::opts_chunk$set()` v rámci bloku `setup`. Pokud často přepisujete více globálních nastavení, můžete si pomocí `knitr::opts_template$set` připravit jejich set a pak jej vložit pomocí argumentu `opts.label='set_nastaveni'`v záhlaví bloku kódu.
# Tabulky Defaultní formát tabulek vypadá tak, jak jsme na něj zvyklí z R konzole. Pro pěknější formát tabulek můžeme použít funkci `knitr::kable()`. Interaktivní tabulky můžeme získat s využitím balíčku `DT` a funkce `DT::datatable()` ```{r data-table} # Defaultní tabulka head(titanic) # Tabulka s použitím funkce knitr::kable() knitr::kable( head(titanic), caption = "Údaje o pasažérech Titaniku (kable)", digits = 2 ) # Tabulka s použitím funkce DT::datatable() DT::datatable( titanic %>% select(id:age), caption = "Údaje o pasažérech Titaniku (datatable)", filter = list(position = 'top'), options = list(pageLength = 5), rownames = FALSE ) ``` Tabulky lze vytvořit i ručně takto. Nadpis 1 | Nadpis 2 | Nadpis 3 ----------|-----------|---------- a1 | a2 | a3 b1 | b2 | b3 Pravidla jsou tato: * Tabulka musí mít záhlaví, které je odděleno např. pomocí "--------". * Buňky musí být odděleny pomocí svislice "|". * Použití "|" před prvním sloupcem a za posledním sloupcem není nutné. * Není nutné dodržet vizuální zarovnání buněk. Zarovnání lze měnit takto: | nalevo | na střed | napravo | |:-------|:--------:| -------:| | 1 | 2 | 3 |
# Použití kódu přímo v textu Dalším způsobem, jak vložit R kód, je použití `r `, viz následující příklad. Máme údaje o `r nrow(titanic)` pasažérech Titanicu, ale pouze u `r sum(!is.na(titanic$age))` pasažérů známe jejich věk. Průměrný věk pasažérů Titanicu byl `r mean(titanic$age, na.rm = TRUE)` (*SD* = `r sd(titanic$age, na.rm = TRUE)`) let. Průměrný věk pasažérů Titanicu byl `r mean(titanic$age, na.rm = TRUE) %>% fnum()` (*SD* = `r sd(titanic$age, na.rm = TRUE) %>% fnum()`) let.
# Grafy a parametry Pomocí parametrů můžeme definovat klíčové vstupní hodnoty pro generování výsledků (outputu). Parametry definujeme v záhlavní a pak je můžeme používat jako argumenty různých funkcí. ```{r counts} sex_count <- titanic %>% filter(class == params$class) %>% count(sex) males <- sex_count %>% filter(sex == "Male") %>% pull(n) females <- sex_count %>% filter(sex == "Female") %>% pull(n) ``` V `r params$class`. třídě cestovalo `r males` mužů a `r females` žen. Graf podílu přeživších je zobrazen níže. ```{r survival-plot1} p <- titanic %>% filter(class == params$class) %>% group_by(sex) %>% summarise(prop_survived = mean(survived == "Survived")) %>% ggplot(aes(sex, prop_survived)) + geom_col() + expand_limits(y = 1) p ``` Rozměry grafů lze měnit pomocí argumentů `fig.width`, `fig.height`, `fig.asp`, `out.width` a `out.height`. Argumenty začínající na `fig.` mění velikost grafu vytvořeného v R, zatímco argumenty začínající na `out.` mění velikost místa, do kterého bude graf vložen. Aby měly grafy konzistentní šířku, stačí nastavit pro všechny stejnou `fig.width` (šířka grafu) a měnit podle potřeby `fig.asp` (poměr stran); `fig.height` se tak nastaví automaticky jako `fig.width * fig.asp`. Často je rozumné nastavení `fig.width = 6` (tj. 6 palců) a `fig.asp = 0.618` (zlatý řez) společně s `out.width = "70%"` (tj. 70 % šířky odstavců) a `fig.align = "center"` (zarovnání na střed). Pro umístění více grafů na jeden řádek můžete např. nastavit `out.width = "50%"`, pokud se jedná o dva grafy; pokud máte tři grafy, můžete nastavit `out.width = "33%"`; pokud máte čtyři `out.width = "25%"`, ale nechat `fig.align = "default"`. Mezi další důležitá nastavení patří: * `fig.show = "hold"`: ukáže graf(y) až nakonec za celým blokem kódu. * `fig.cap = "Popisek grafu"`: přidá ke grafu popisek `fig.cap="Podíl přeživších"` ``` {r plot2, fig.width=2, fig.asp= 1, out.width="100%", fig.align='center', fig.cap="Podíl přeživších"} p ```
# Citace R Markdown umí používat různé formáty k tvorbě bibliografie, včetně BiBLatex, BibTeX, endnote nebo medline. Pokud chcete generovat citace balíčků v BibTeXu, můžete použít funkci `knitr::write_bib(c("vektor", "s", "názvy", "balíčků), width = 60)`. Zkuste takto vytvořit BibTex soubor pro balíčky, které jsme doposud používali, např. ggplot2, dlyr nebo skimr. Soubor se seznamem literatury v BibTexu se uvádí v záhlaví, např. `bibliography: library.bib`. Stejně tak je nutné v se v záhlavní odkázat na soubor `.csl` (citation style language), který definuje citační styl, např. `csl: apa.csl`, defaultní je totiž styl *Chicago*. Pro vložení citace použijte "@" společně s identifikátorem citace, např. @r4ds nebo [@r4ds]. Citace lze upravovat např. takto: * Pro vložení více citací za sebou použijte středník, např. takto: Lidé začínající programovat v R mohou využít několik publikací [@r4ds; @hopr; @tidyverse]. * Do hranatých závorek lze doplnit libovolné komentáře [@r4ds, pp. 20–30; @hopr, kapitola 2]. * Bez použití hranatých závorek se vytvoří citace přímo v textu, tj. jméno autora nebo autorů bude před závorkouk a závorce bude uveden rok publikace, viz např. @r4ds i @hopr představují dobré učebnice pro začátečníky v R. * potlačit jméno autor lze pomocí "-": viz např. Garrett Grolemund [-@hopr] je autorem knihy *Hands-On Programming with R*. Seznam literatury se automaticky vloží na konec dokumentu, můžete ho vložit i na jiné místo, pokud např. máte několik příloh, které chcete uvést až za seznamem literatury. Stačí použít tento tag `
` a dát jej na místo, kam seznam literatury chcete vložit.
# R Notebook Další možností, jak pracovat s R Markdownem, je použít R Notebook. R Notebook je specifický způsob kompilace R Markdown souborů. Vytvoříte jej pomocí `File -> New File -> Notebook` nebo volbou `output: html_notebook` v záhlaví. Hlavní rozdíly oproti standardnímu R Markdownu jsou následující: * R Notebook funguje v rámci téže R session, zatímco při kompilaci R Markdown souboru se automaticky spustí vždy nová, "čistá" R session. * R Notebook spouští kód postupně, po částech, takže i když nějaký řádek kódu ústí v error, nevede to k tomu, že nedostanete žádný výstup. * Místo tlačítka **Knit** se objeví tlačítko **Preview**. Když na něj kliknete, vytvoří se HTML dokument, ale ten bude obsahovat output pouze těch bloků kódu, které jste sami předtím spustili. To znamená, že **Preview** žádný blok kódu nespouští. Oproti tomu tlačítko **Knit** vytvoří novou R session a kompiluje najednou celý dokument včetně všech bloků kódu, což obvykle trvá déle. Jinými slovy **Preview** tedy vlastně nic nového nevytváří, pouze zobrazí text, který jste napsali v R Notebooku, a output těch bloků kódu, který jste již spustili * R Notebook umožňuje jen jeden typ outputu `output: html_notebook`, zatímco R Markdown může kompilovat html, .doc, .pdf a další typy dokumentů. Protože lze snadno změnti R Notebook v R Markdown (stačí místo `output: html_notebook` v záhlavní uvést např. `output: html_document`) a protože práce s R Notebook je obvykle o něco rychlejší, můžete klidně nejprve pracovat s R Notebookem a až poté, ve konečné fázi psaní reportu, s R Markdownem.
# Nastavení v záhlaví Většina výstupních formátů podporuje číslování nadpisů/sekcí. Stačí do záhlaví dolnit `number_sections: true`. Pokud nechcete vypnout číslování u některých nadpisů, doplňte za ně `{-}`. Součástí záhlaví může být i r kód, můžete například nechat generovat datum automaticky na základě systémového času pomocí `r format(Sys.time(), '%d. %m. %Y')`. Pomocí `toc: true` zapnete zobrazení obsahu (table of content); u HTML dokumentů funguje `toc_float: true`, pokud chcete interaktní (plovoucí) obsah. Pomocí `toc_depth: ` pak lze nastavit, kolik úrovní nadpisů se má v obsahu zobrazovat. Pomocí `code_folding: hide` můžete defaultně skýr R kód; pro jeho zobrazení je pak nutné si jej "rozkliknout"; a pomocí `code_folding: show` naopka umožníte skrýt (defaultně viditelný) R kód. R Markdown nabízí mnoho předdefinovaných themes, např. `theme: readable`. Podívejte se [zde](https://www.datadreaming.org/post/r-markdown-theme-gallery/), jak vypadají, a vyberte si nějaké, které se vám zdá atraktivní.
# Zdroje