2.7 Skripty

Konzola slouží k experimentování a ladění kódu. Ke skutečné práci však slouží skripty, které vám umožní spouštět kód opakovaně a při tom jej měnit a ladit. Za výsledek své práce byste nikdy neměli považovat výsledky interaktivního hraní v konzoli, ať už ve formě spočítaných výsledků nebo vykreslených grafů, ale právě funkční skript. Pokud se ke své práci po čase vrátíte, nedokážete z “výsledků” nijak zjistit, jak jste k nim dospěli (a jestli jste v průběhu neudělali chybu), ani něco v již proběhlém výpočtu změnit. Naproti tomu skript jasně říká, co jste udělali, umožňuje, abyste svůj výpočet upravili a samozřejmě umožňuje i znovu získat jakékoli výsledky, ke kterým jste dospěli. Měli byste si tedy zvyknout pracovat primárně v editoru a konzoli používat jen k testování dílčích kusů kódu.

R skript je obyčejný textový soubor, do kterého napíšete R-kové výrazy jeden za druhý – každý nový výraz na nový řádek. Když pak skript spustíte, tyto řádky se provedou úplně stejně, jako byste je napsali přímo do konzoly. Jedinou výjimkou je část řádku za znakem křížku (#), která se považuje za komentář – R tuto část řádku ignoruje.

Skripty je zvykem ukládat do souborů s koncovkou .R. Soubor se skriptem můžete vytvořit v jakémkoli textovém editoru, který k textu nepřidává žádné značky, tj. např. ne v MS Wordu. RStudio však poskytuje velmi dobrý editor, který umí barevně zvýraznit syntaxi, odhalit některé chyby, napovědět vám, jak se funkce jmenuje a jaké má parametry atd. Nový skript vytvoříte v RStudiu klávesovou zkratkou Ctrl-Shift-N nebo v menu File\(\rightarrow\)New File\(\rightarrow\)R Script.

Kvůli ladění chyb i kvůli čitelnosti kódu je dobré skripty pěkně formátovat. Doporučuji dodržovat některý z následujících stylů:

RStudio vás dokáže upozornit na špatný styl, pokud si tuto volbu zapnete, a umí i částečně váš skript přeformátovat do pěknějšího (v menu Code\(\rightarrow\)Reformat code); pomáhá také možnost automaticky odsadit řádky kódu (v menu Code\(\rightarrow\)Reindent lines) a pěkně zarovnat komentáře (v menu Code\(\rightarrow\)Reflow comments).

Jednou napsaný skript můžete spouštět znovu a znovu. Skript je možné spustit třemi způsoby. V RStudiu k tomu slouží klikátko Source v pravém horním rohu editoru a klávesová zkratka Ctrl-Shift-S. Skript jde samozřejmě spustit i z konzoly nebo jiného skriptu pomocí funkce source():

 # jméno souboru do uvozovek
 source("jmeno_skriptu_a_cesta_k_němu")

Funkce source() má mnoho dalších parametrů, viz dokumentace. Užitečný je zejména logický parametr echo, který ovlivňuje, zda se při spuštění skriptu vypisují do konzoly výrazy, které se právě vyhodnocují. Klikátko Source v RStudiu má podobnou volbu.

Někdy nechceme spustit celý skript naráz, ale chcete spouštět jen jednotlivé řádky kódu. Aktuální řádek nebo skupinu vybraných řádků spustíte klávesovou zkratkou Ctrl+Enter. Další možnosti spuštění skupin řádků a jejich klávesové zkratky najdete v menu Code.

I když skript může obsahovat všechny platné výrazy jazyka R, některé z nich není vhodné do skriptu umisťovat. Mezi takové výrazy patří zejména funkce, které mění vnější prostředí R. Ve skriptu zejména nikdy neinstalujte balíky pomocí funkce install.packages() a raději ani neměňte pracovní adresář pomocí funkce setwd(). Je bezohledné, pokud s někým sdílíte svůj skript a v něm voláte takové funkce, protože tím měníte nastavení cizího počítače.

Naproti tomu nesmíte zapomenout ve skriptu načíst balíky, které používáte, pomocí funkce library(). Je rozumné, abyste balíky načetli vždy na začátku skriptu. Díky domu snadno dohledáte, které balíky skutečně voláte (a které tedy musíte mít nainstalované).

Pokud jste nastavili RStudio tak, jak jsme uvedli v oddile 2.2, pak vám RStudio bude poskytovat velmi užitečné diagnostické rady pomocí ikonek zobrazených vlevo od čísel řádků kódu. Pokud na ikonku “najedete myší”, zobrazí se diagnostická rada. Pro větší přehlednost RStudio vlnovkou podtrhne vyhodnocovaný kus kódu. Červená barva signalizuje chybu, žlutá varování a modrá upozornění na porušení stylistických konvencí, které sice nezabrání běhu vašeho kódu, ale znesnadňují jeho čtení.

Ukažme si použití skriptu na příkladů převzatém z knihy Radové a Dvořáka: Finanční matematika pro každého, Grada, 1993, s. 92–95. Neděste se, že zatím nebudete rozumět všemu, co kód dělá – postupně se všechno potřebné dozvíte v této knize. Předkládejme, že musíme splácet dluh ve výši \(D=\textrm{40 000}\) pomocí \(n=6\) stejných ročních splátek, tj. anuit. Úroková sazba je \(i=12\) %. Kniha nám říká, že výši anuity \(A\), úrokové platby \(U\) a úmoru \(M\) (anuita je úroková platba plus úmor) můžeme spočítat podle následujících vztahů, kde \(t\) je čas:

\[\begin{align} v &= 1 / (1 + i), \tag{2.1}\\ a &= D i / (1 - v^n), \tag{2.2}\\ U_{t + 1} &= a (1 - v^{n - t}), \tag{2.3}\\ M_{t + 1} &= a (1 - v^{n - t}), \tag{2.4}\\ D_{t} &= D - \sum_{i < t} M_i. \tag{2.5} \end{align}\]

Spočítat výši anuity a vývoj úrokové platby, úmoru a zbývajícího dluhu znamená jen přepsat matematické výrazy do R kódu. Zkuste nejprve následující kód zapsat přímo do konzoly. Zjistíte, že to není právě pohodlné. Pokud uděláte chybu, nemusíte přesně vědět, odkud začít: pokud např. na řádku Dz <- D - cumsum(M) napíšete omylem D místo Dz, přepíšete si původní hodnotu. A pokud se nakonec rozhodnete změnit výši dluhu např. na 1 milion, budete muset všechny řádky spustit ručně znovu. Pokud však kód napíšete do skriptu, můžete kdykoli cokoli opravit, a to včetně výše dluhu, úrokové sazby nebo počtu období (vyzkoušejte si to).

# vyčisti pracovní prostředí
rm(list = ls())
# načti potřebné balíky
library(ggplot2)
library(tidyr)
# zadej konstanty
D <- 40000  # výše dluhu
i <- 12 / 100  # úroková sazba
n <- 6  # počet období
# vlastní výpočet
t <- 1:n  # vektor času
v <- 1 / (1 + i)  # diskontní faktor
a <- D * i / (1 - v ^ n)  # anuita
U <- a * (1 - v ^ (n - t + 1))  # vektor úrokových plateb v čase t
M <- a * v ^ (n - t + 1)  # vektor úmorů v čase t
Dz <- D - cumsum(M)  # vektor zbývajícího dluhu v čase t
df <- round(data.frame(t = t, U = U, M = M, D = Dz), 2)
# výpis výsledku v tabulce
print(df)
##   t       U       M        D
## 1 1 4800.00 4929.03 35070.97
## 2 2 4208.52 5520.51 29550.46
## 3 3 3546.06 6182.97 23367.49
## 4 4 2804.10 6924.93 16442.55
## 5 5 1973.11 7755.92  8686.63
## 6 6 1042.40 8686.63     0.00
# vykreslení vývoje veličin do grafu
ggplot(gather(df, proměnná, hodnota, -t),
       aes(x = t, y = hodnota, color = proměnná)) +
    geom_line() +
    xlab("čas")

Všimněte si, že ve skriptu načítáme všechny potřebné balíky, ale neinstalujeme je!