3 První kroky v R a RStudiu
Nebudu vám tajit, že se způsob práce v R od Excelu na první pohled dost liší. Excel vám naservíruje připravený rastr buněk, do kterých můžete rovnou psát hodnoty a vzorce. V R naopak začínáte s prázdnou plochou, a co si sami neuděláte, to nemáte.
3.1 Excel vs. R
Když chcete v Excelu sečíst dvě čísla ve dvou různých buňkách, nejprve je do těch buněk napíšete. Např. číslo 10 do buňky A1 a číslo 20 do buňky B1. Do buňky C1 pak můžete dát vzorec =A1+B1, který čísla sečte.
V R to uděláte podobně jen musíte napsat kód, který „buňky" (v R se jim říká objekty) založí a pak sečte. Ten kód může vypadat třeba takhle:
prvni_cislo <- 10
druhe_cislo <- 20
prvni_cislo + druhe_cislo## [1] 30
Případně můžete, stejně jako v Excelu, dvě čísla rovnou sečíst:
10 + 20## [1] 30
A nebo výsledek uložit do jiné „buňky" (objektu):
prvni_cislo <- 10
druhe_cislo <- 20
vysledek <- prvni_cislo + druhe_cisloa tu si pak zobrazit:
vysledek## [1] 30
Ve skutečnosti je to o dost pestřejší. Můžete jedním „vzorcem" (v R se tomu říká výraz nebo příkaz) zpracovat celou řadu nebo tabulku různých hodnot a výsledek zobrazit mnoha způsoby – jako tabulku, formátovaný text, graf. To vše se v této knížce naučíte.
3.2 Tři způsoby práce s R
S R jde pracovat více různými způsoby. Já nejčastěji používám tři:
- Interaktivní práce v konzoli.
- Polointeraktivní práce se skriptem.
- Interaktivní, poloautomatická či zcela automatická tvorba dokumentu v R Markdownu.
Všechny tři ukážu na jednoduchém příkladu: představte si, že jste dnes ve svém obchodě vydali 100 účtenek. Teď se chcete rychle dozvědět, kolik dělá celková tržba a jaká byla typická útrata jednoho zákazníka.
3.3 Interaktivní práce s konzolí
Vaše RStudio vypadá nějak takhle a konzole je ta velká plocha vlevo. Psát budete za zobáček úplně vlevo (jinam ani nejde umístit kursor), každý řádek vždy odentrujete a konzole vám většinou nějak odpoví.

Nejprve si vygenerujte účtenky. Budou sice trochu falešné, ale to nevadí. Do konzole napište:
cena <- round(rnorm(n = 100, mean = 1000, sd = 200), digits = 2)Odentrujte a nic se nestane. Vlastně stane. Pokud se podíváte doprava na záložku Environment, uvidíte tam tohle:

Příkazem jste totiž vytvořili v prostředí R (environment) nový objekt cena a uložili jste do něj sto (skoro) náhodných čísel. Na všechny se můžete podívat příkazem:
cena## [1] 1239.31 1266.84 1191.97 1274.27 1127.21 1014.99 998.29 776.95 1096.38
## [10] 1075.64 896.18 1368.37 975.05 1098.43 1112.29 1395.84 662.73 959.34
## [19] 919.91 1386.32 630.80 1122.25 1024.88 1151.69 701.04 861.63 1107.25
## [28] 901.18 1078.30 741.86 1028.21 1339.58 1081.39 1244.47 853.30 1183.85
## [37] 1045.43 1145.55 788.07 879.57 1008.77 1159.16 801.05 1025.00 1095.06
## [46] 1214.84 1075.35 1144.89 1069.41 1014.75 1172.26 1186.07 1098.66 738.63
## [55] 591.21 807.90 996.19 683.87 976.16 1366.79 1105.61 672.16 733.30
## [64] 1187.42 1110.30 1324.93 959.97 1026.89 918.17 847.18 952.72 910.23
## [73] 883.24 855.36 995.24 787.25 1235.31 600.64 1096.83 780.42 1144.38
## [82] 1014.12 721.06 1020.61 1107.63 931.51 1210.68 728.93 1208.44 818.08
## [91] 1284.66 1106.24 1320.46 1336.84 682.28 1317.25 955.23 1234.54 860.97
## [100] 1411.76
což pak na konzoli vypadá nějak takhle (čísla jsou náhodná, takže nesedí s předešlým výsledkem):

Teď vám to ale musím vysvětlit trochu podrobněji.
3.3.1 Objekty (proměnné)
Objekt jazyka R se chová podobně jako proměnná v jiných programovacích jazycích. Je to vlastně takový šuplík, do kterého si můžete ukládat nejrůznější hodnoty: čísla, textové řetězce, logické hodnoty (TRUE a FALSE čili pravda a nepravda) apod.
Oproti jiným programovacím jazykům je tu pár zvláštností:
- Do objektů se hodnoty přiřazují operátorem
<-. Ten můžete vložit i klávesovou zkratkou Alt+- (Alt pomlčka). - Běžné objekty R jsou ve skutečnosti vektory. V jiných programovacích jazycích tomu obvykle odpovídá jednorozměrné pole. V praxi to znamená, že v číselném objektu nemusí být jen jedno číslo, ale může jich tam být moc. V našem příkladu jich je sto.
- R s vektory automaticky i počítá. K vektoru pěti čísel tedy můžete přičíst jedno číslo (ve skutečnosti vektor s jedním číslem) a ono se automaticky přičte ke všem pěti. Později na to ukážu další příklady.
Kde se vám tam těch sto čísel vzalo? Získali jste je funkcemi rnorm a round.
3.3.2 Funkce
Poučka praví: když to existuje, je to objekt, a když to něco dělá, je to funkce. Můžete to brát i tak, že funkce je všechno, co má za svým jménem kulaté závorky. V závorkách mohou být tzv. parametry (někdy se jim říká argumenty; je to totéž), čili vstupní data, která chcete funkci předat. Funkce tyto parametry zpracuje a vrátí výsledek. Vlastně úplně stejně, jako funkce v Excelu.
U názvů objektů i funkcí záleží na velikosti písmen. Cena je něco jiného než cena, tak pozor na to.
rnorm je funkce, která vrací (skoro) náhodná čísla. Skoro jsem dal do závorky, protože vrácená čísla jsou náhodná v rámci normálního rozdělení (to je ta slavná Gaussova křivka), jehož podobu určíte parametry mean (průměr) a sd (směrodatná odchylka neboli standard deviation). Parametrem n navíc musíte určit, kolik těch čísel vlastně chcete.
Následující příkaz tedy vrátí vektor sta náhodných čísel z normální rozdělení s průměrem 1000 a směrodatnou odchylkou 200.
rnorm(n = 100, mean = 1000, sd = 200)## [1] 909.1434 890.0451 974.6006 1231.7046 909.2660 1138.1659 1153.9782
## [8] 918.0514 1094.7529 1048.2780 1330.8159 1241.5500 1278.9101 867.8736
## [15] 726.1279 1366.2103 907.1882 864.7661 1257.8359 667.4297 819.2745
## [22] 753.5340 938.9616 882.3901 1106.5000 929.6607 995.1292 983.8704
## [29] 1332.0322 1162.0321 1254.2200 828.0030 787.4491 984.2852 960.6062
## [36] 1092.1243 770.0150 1225.4347 1007.7385 807.1331 1445.2737 1194.9800
## [43] 1197.1358 1335.8005 1334.0482 628.4970 1180.2140 964.4305 1059.8414
## [50] 1196.4914 1113.7743 802.1997 836.2924 990.2959 972.1000 865.9738
## [57] 547.3280 1057.8411 1100.0308 1274.6802 1069.1393 1088.2410 1038.2238
## [64] 1322.2967 1129.4611 904.9532 1010.6262 921.6413 817.3809 1194.8500
## [71] 1093.9204 942.1813 986.7207 873.6372 950.6691 910.6246 892.0747
## [78] 1116.9015 1046.3173 1241.5313 1389.6883 642.7597 647.9661 707.3055
## [85] 878.6477 891.1307 975.6938 906.7344 757.1774 662.3011 955.3331
## [92] 924.4538 1027.7298 1225.7654 815.1516 753.6022 926.3888 1256.1001
## [99] 1315.1818 854.0904
Klidně si ho zadejte párkrát do konzole s různými parametry, abyste viděli, jak se mění výsledek.
round je funkce, která zaokrouhluje. První parametr je číselný vektor, který se má zaokrouhlit, a druhý parametr digits určuje, na kolik desetinných míst se má zaokrouhlit. Následující příkaz tedy zaokrouhlí číslo 1.145 na dvě desetinná místa:
round(1.145, digits = 2)## [1] 1.15
První parametr funkce round se jmenuje x, ale první parametr funkce se často píše bez jména, protože jeho pořadí nejde poplést. Každopádně ale může napsat volání funkce i takto a výsledek bude stejný:
round(x = 1.145, digits = 2)## [1] 1.15
A teď už asi chápete – funkce rnorm vrátí sto čísel s hodně desetinnými čísly, a proto jste její výsledek ještě poslali funkci round, která celý vektor (tj. všech sto čísel) zaokrouhlila na dvě desetinná místa. V jiném programovacím jazyce byste na to potřebovali dost složité výpočty v cyklech, v R stačí tohle:
round(rnorm(n = 100, mean = 1000, sd = 200), digits = 2)## [1] 883.95 814.92 936.47 1205.64 927.45 837.03 511.04 1038.08 881.30
## [10] 1166.68 1067.08 902.29 1185.60 1032.26 772.27 1185.80 927.40 589.34
## [19] 1105.48 862.92 1186.52 1006.75 1018.34 1438.13 989.14 1097.41 749.19
## [28] 885.98 1137.54 877.39 1011.25 1071.58 1043.04 881.49 936.43 1172.51
## [37] 1018.06 1117.41 951.41 933.39 1444.45 790.97 1183.44 1162.77 1114.17
## [46] 1075.67 953.74 1251.14 1025.99 1020.22 994.59 957.56 926.91 918.35
## [55] 842.03 1154.36 1219.46 1193.34 641.45 1135.89 1165.24 1091.03 739.91
## [64] 1100.86 1329.05 513.20 1138.81 949.67 1311.42 1133.79 940.30 1251.53
## [73] 807.60 945.69 799.95 740.92 1118.10 937.65 1154.24 1275.08 1046.93
## [82] 1027.01 1102.55 1147.01 1046.72 1089.85 1319.42 826.70 1001.32 987.20
## [91] 975.57 973.06 1079.42 825.79 895.35 824.95 1350.53 854.65 1032.25
## [100] 760.49
Mimochodem, všimli jste si v předešlých příkladech těch čísel v hranatých závorkách? Protože se v příkladech vypisují jako výsledky vektory (všechny základní, tzv. atomické typy jsou v R vektory), R vám těmi čísly v hranatých závorkách říká, na jaké pozici ve vektoru daná hodnota je.
A hranaté závorky jdou i použít pro adresování konkrétního prvku vektoru. Třeba tohle zobrazí z vytvořeného vektoru cena jenom pátý prvek:
cena[5]## [1] 1127.21
a tohle pátý až desátý:
cena[5:10]## [1] 1127.21 1014.99 998.29 776.95 1096.38 1075.64
Chtěli jsme ještě účtenky sečíst, že? Je to hračka:
sum(cena)## [1] 102371.5
Zajímá vás, kolik dělá celková tržba bez DPH?
sum(cena / 121 * 100)## [1] 84604.52
případně:
sum(cena) / 121 * 100## [1] 84604.52
Obojí by vám mělo dát stejný výsledek. V prvním případě se ale nejprve vydělí každý jednotlivý prvek vektoru a pak se celý vektor sečte, kdežto v druhém případě se celý vektor nejprve sečte a pak teprve vydělí.
Zajímá vás rozložení ceny zobrazené v histogramu?
hist(cena)
Zobrazí se vám na panelu Plot vpravo (váš bude vypadat trochu jinak).
Tím jste poznali další dvě funkce (sum a hist). Za chvíli vám ukážu, jak totéž udělat skriptem a v R Markdownu, ale nejdřív pár slov k nápovědě.
3.3.3 Integrovaná nápověda
R má přímo v sobě zabudovanou nápovědu ke každé funkci. Ta se projevuje jednak tím, že když začnete psát název funkce, po pár znacích se začnou nabízet funkce, jejichž název těmi znaky začíná a v bublině se objeví stručný popis. Tuto nápovědu lze případně vynutit klávesovou kombinací Ctrl+Space.

Pokud máte funkci napsanou i se závorkami, Ctrl+Space vám napoví možné parametry.

Můžete též na konzoli zadat příkaz tvořený otazníkem a názvem funkce, např. ?rnorm, a pak se vám otevře kompletní nápověda na panelu Help vpravo.

A konečně můžete s kurzorem na názvu funkce stisknout F1 a dostanete opět kompletní nápovědu v panelu Help.
Při práci s R tedy nemusíte skoro googlit. Stačí si pamatovat alespoň přibližné názvy funkcí.
3.4 Práce se skripty
Práce v konzoli je sice flexibilní, ale na víc než pár příkazů dost nepraktická. Když uděláte chybu, můžete se sice šipkami nahoru a dolů pohybovat po historii příkazů a opravovat je, ale není to ono. Chyby se mnohem lépe opravují ve skriptech.
Z menu File → New File vyberte R Script a vlevo nahoře se vám otevře editor skriptů. Do něj si vložte všechny příkazy, které jste předtím zadali postupně do konzole. Nemusíte to ale dělat ručně – podívejte se vpravo na záložku History a vida, jsou tam, že? Vyberte ty správné a tlačítkem To Source je přesuňte do skriptu. Okno RStudia by pak mělo vypadat nějak takto:

Když nyní na kterémkoli řádku stisknete Ctrl+Enter, celý řádek se vykoná stejně, jako kdybyste ho zadali na konzoli. Můžete i klávesou Shift vybrat víc řádků a pak se po Ctrl+Enter vykonají všechny. A konečně můžete tlačítkem Source z toolbaru nad editorem vykonat celý skript. Po vykonání celého skriptu by mělo okno RStudia vypadat nějak takto:

Nezapomeňte si ale celý skript uložit pod nějakým vhodným jménem (třeba prvni-skript). Měl by se vám uložit do složky projektu a ke jménu se automaticky připojí přípona R.
3.4.1 Úprava skriptu
Hlavní výhoda skriptu spočívá v tom, že jde snadno upravit a pak celý znovu spustit. Vyzkoušejte si to. Hned v prvním řádku změňte rnorm za runif a odstraňte této funkci parametry mean a sd, takže zbude jen:.
cena <- round(runif(n = 100), digits = 2)Když teď celý skript znovu spustíte příkazem Source (nebo klávesovou zkratkou Ctrl+Shift+S), poznáte, co se změnilo?
hist(cena)
Ano, změnil se histogram.
Funkce rnorm totiž vybírá náhodná čísla z normálního rozložení (random normal distribution) a histogram má proto tvar známe gaussovy křivky – čísla blíže průměru se vyskytnou pravděpodobněji než čísla dál od průměru. Funkce runif (random uniform distribution) naproti tomu vybírá náhodná čísla z rovnoměrného rozdělení, takže pravděpodobnost zastoupení všech čísel mezi nulou a jednou je stejná.
3.5 R Markdown
Skripty jsou praktické, ale mají dvě nevýhody:
- Když nechcete provést celý skript najednou, špatně se v nich hledá část, kterou chcete spustit.
- Výstup není moc přehledný a je rozdělený na víc míst: textový výstup se ne moc hezky zobrazí v konzoli a grafy na panelu Plots.
Obě tyto nevýhody odstraňuje R Markdown.
3.5.1 Co je R Markdown
3.5.1.1 Základní Markdown
Samotný Markdown možná znáte. Je to jednoduchý značkovací jazyk, kterým jdou v čistě textovém formátu vyznačit základní strukturální a formátovací prvky – nadpisy, odstavce, odrážky, odkazy, tučný text apod. Z toho pak jde vygenerovat výstupy v různých formátech: nejčastěji v HTML, ale klidně i PDF, Word atd.
Text v Markdownu vypadá např. takto:
# Tohle je nadpis 1. úrovně
Tohle je běžný odstavec. Víc odstavců je od sebe odděleno dvěma Entry čili prázdným řádkem.
## Tohle je nadpis 2. úrovně
Tohle je příklad [odkazu v textu](https://example.com). A tohle je příklad odrážek:
- první odrážka,
- druhá odrážka,
- třetí odrážka.
Jdou udělat i číslované body, které se automaticky očíslují podle pořadí:
1. První bod.
1. Druhý bod.
1. Poslední bod.Jak vidíte, docela dobře se píše a dobře se i čte, i když není převedený (vyrenderovaný) do HTML. Ale když se převede, je výsledek docela hezký:

3.5.1.2 R Markdown
R Mardown je Markdown, do kterého jsou zamíchané kusy eRkového kódu. Vypadá nějak takhle:

Vyzkoušejte si nyní R Markdown sami. Nejprve si založte nový soubor: Z menu File → New File vyberte R Notebook. Objeví se vám editor s předvyplněným vzorovým obsahem. Ten celý zrušte (Ctrl+A, Del) a zkopírujte do něj tohle:
---
title: "Můj první R Notebook"
output: html_notebook
---
Toto je příklad [R Markdown](http://rmarkdown.rstudio.com) zápisníku (notebook). Začíná nahoře metadaty, které zde udávají jen titulek a formát výstupu. Metadata jsou ohraničena řádky tvořenými třemi pomlčkami. Pak následuje normální Markdown.
Za tímto odstavcem je blok eRkového kódu, kterému se říká *chunk* a já mu budu říkat *blok*.
```{r}
cena <- round(rnorm(n = 100, mean = 1000, sd = 200), digits = 2)
sum(cena)
```
Pokud blok spustíte zelenou šipečkou na jeho pravém horním okraji nebo klávesovou zkratkou Ctrl+Shift+Enter, provede se a zobrazí výstup přímo pod sebou.Výsledek bude vypadat jako na předešlém obrázku. Nyní můžete podle instrukcí vykonat jediný blok kódu, který tam zatím máte, a pod blokem se vám zobrazí součet ceny.
A můžete i celý soubor převést do HTML a prohlédnout si ho v celé kráse. Uděláte to příkazem Preview z toolbaru nad editorem, ale před tím ještě musíte soubor uložit, třeba pod jménem prvni-notebook. Ke jménu se automaticky připojí přípona Rmd.
Celý výsledek se zobrazí v panelu Viewer vpravo:

Už jste pochopili, v čem jsem napsal tuhle knížku? Ano, v RStudiu v R Markdownu :-)
Ze všech tří způsobů používání R (konzole, skripty, R Markdown) používám R Markdown pro běžné analýzy nejčastěji. Píšu si v něm postup, eRkový kód i poučení z výsledků. Když se pak později k analýze vrátím, třeba proto, že chci pro jiného klienta udělat podobnou, krásně vidím, jak jsem postupoval a co a proč jsem udělal. Už tohle je pro mě obrovská výhoda oproti excelové tabulce, ve které se už po pár týdnech nevyznám a musím znovu pracně zkoumat, co tam je, proč to tam a jak to vlastně funguje.
A totéž doporučuji i vám: klidně pro teď zapomeňte, že konzole a skripty vůbec existují, a používejte na všechno R Markdown.
3.6 Z téhle kapitoly si pamatujte
3.6.1 R Markdown
Zvykněte si na R Markdown jako základní způsob práce s R. Konzole se hodí pro pár pomocných příkazů, nebo abyste si vyzkoušeli, jak která funkce funguje. Skripty se hodí pro dávkové zpracování bez interaktivity, když přesně víte, co a jak chcete udělat. Také se jimi definují nové funkce a píšou balíčky. Pro všechno ostatní je tu R Markdown. Když si budete cokoli z této knihy zkoušet, založte si na to R Notebook nebo R Markdown Document – ono je to skoro totéž.
Bude se vám hodit pár klávesových zkratek:
| Akce | Windows & Linux | Mac |
|---|---|---|
| Vlož blok kódu (chunk) | Ctrl+Alt+I | Command+Option+I |
| Vlož přiřazení (znaky <-) | Alt+- | Option+- |
| Proveď řádek kódu s kurzorem | Ctrl+Enter | Command+Enter |
| Proveď blok kódu s kurzorem | Ctrl+Shift+Enter | Command+Shift+Enter |
| Proveď všechny bloky v souboru | Ctrl+Alt+R | Command+Option+R |
| Proveď všechny bloky nad kurzorem | Ctrl+Alt+P | Command+Option+P |
| Zobraz celý dokument v HTML | Ctrl+Shift+K | Command+Shift+K |
| Jdi na další blok nebo titulek | Ctrl+PgDown | Command+PgDown |
| Jdi na předchozí blok nebo titulek | Ctrl+PgUp | Command+PgUp |
| Nápověda k funkci s kurzorem | F1 | F1 |
Pokud si je nechcete pamatovat, všechny mají i své tlačítko buď na toolbaru nad editorem, nebo přímo v pravém horním rohu každého bloku kódu. Funkce tlačítek se vám zobrazí po najetí myši.
3.6.2 Vektory
Zatímco v Excelu máte v jedné buňce jedno číslo (nebo jeden text, jedno datum apod.), objekt základního typu (číslo, text, logická hodnota) v R je vždy vektor. To znamená, že obsahuje uspořádanou řadu hodnot daného typu. Vektor může mít délku 1, pak obsahuje jen jednu hodnotu, ale taky třeba milion, a pak obsahuje milion hodnot.
S vektory počítají i běžné operace. Když k vektoru s deseti čísly přičtete jiný vektor s deseti čísly, bude výsledek opět vektor s deseti čísly, ve kterém se sečte první s prvním, druhé s druhým atd. Pokud ale k vektoru s deseti čísly přičtete vektor s jedním číslem, dojde k tzv. recyklaci druhého vektoru, což znamená, že se číslo z druhého vektoru postupně přičte ke všem číslům prvního vektoru.
Ukážu to raději na příkladu (funkce c tvoří vektory):
c(10, 20, 30) + c(1, 2, 3)## [1] 11 22 33
c(10, 20, 30) + 1## [1] 11 21 31
c(10, 20, 30) + c(1, 2)## Warning in c(10, 20, 30) + c(1, 2): longer object length is not a multiple of
## shorter object length
## [1] 11 22 31
Vidíte, že poslední příklad sice upozorní na možnou chybu, ale provede se podle pravidla recyklace.
c(10, 20, 30, 40) + c(1, 2)## [1] 11 22 31 42
Zde na chybu neupozorní, protože se druhý vektor zrecykluje přesně dvakrát.
3.6.3 Funkce
Funkce fungují úplně stejně jako v Excelu. Nějak se jmenují a v závorce mají parametry. Když žádné parametry nemají, musí za nimi být prázdná závorka. Funkce stejně jako v Excelu vrátí nějakou hodnotu a nikdy nezmění hodnotu parametrů. Pár rozdílů tu ale přeci jenom je:
- V názvech funkcí záleží na velikosti písmen.
Viewaviewjsou dvě různé funkce. - Parametry jsou pojmenované, takže jdou zapisovat způsobem
round(x = 1.145, digits = 2). Pokud ale dodržím závazné pořadí parametrů, mohu napsat iround(1.145, 2)a dostanu stejný výsledek. - Funkce umí pracovat s vektory. To znamená, že např. funkce
roundumí zaokrouhlit mnoho různých čísel naráz.