---
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 `