3.1 Proměnné

Koncept proměnné znáte z matematiky. Tam je proměnná “krycí název” pro nějakou hodnotu, např. pro číslo 5. Krása proměnných spočívá v tom, že vám umožňují počítat zcela obecně. Pokud např. označíte délku trasy v kilometrech písmenem \(s\) a rychlost jízdy v kilometrech za hodinu písmenem \(v\), pak víte, že vzdálenost \(s\) ujedete za \(s/v\) hodin. Tento výsledek platí bez ohledu na to, zda daleko a jak rychle jedete. Jak už naznačuje název proměnná, můžete hodnotu proměnné měnit, a výraz \(s/v\) vyhodnotit pokaždé znovu. Pro jednoduchý vypočet, který jsme právě uvažovali, nemusí být takové zobecnění příliš užitečné, ale při složitých výpočtech nad velkými daty je zavedení proměnných velká pomoc. V počítači plní proměnné stejnou úlohu jako v matematice: uchovávají nějakou hodnotu. Můžete počítači říct, co má s touto hodnotou dělat, bez toho, abyste přesně věděli, jaká tato hodnota je.

I když to technicky není přesné, můžete si proměnnou představit jako krabičku, do které vložíte nějakou hodnotu. Každá proměnná může v každém okamžiku obsahovat vždy jen jednu hodnotu. Pokud uložíme do proměnné novou hodnotu, stará hodnota se ztratí. Slovo “hodnota” je však třeba brát volně: “hodnota” může být stejně dobře jedno číslo i složitá struktura složená z čísel, textů a jiných objektů. Technicky přesnější je říct, že proměnná jméno, které se odkazuje na nějakou oblast v paměti počítače, kde jsou uložena vaše data. Aby počítač věděl, jak s daným kusem paměti zacházet, musí vědět, jakého typu jsou uložená data (např. zda se jedná o celá čísla) a v jaké datové struktuře jsou data uložena (např. ve vektoru). R je volně typovaný jazyk. To znamená, že typ proměnné nemusíte nijak deklarovat. Do stejné proměnné můžete v jedné chvíli uložit číslo a později toto číslo nahradit třeba kusem textu. R si s tím poradí. (Proměnná bude prostě nejdříve odkazovat na jedno místo v paměti, a pak na jiné. Nepoužívanou oblast paměti uvolní garbage collector.)

3.1.1 Jména proměnných

Jména proměnných musí splňovat určité nároky. Jméno proměnné se může skládat jen z písmen, číslic, teček a podtržítek a musí začínat písmenem nebo tečkou, za kterou nenásleduje číslice. Jména a, myNumber nebo my_number jsou přípustná; jména jako .2way nejsou povolená. Stejně tak nejsou povolená rezervovaná slova: if, else, repeat, while, function, for, in, next, break, TRUE, FALSE, NULL, Inf, NaN, NA, NA_integer_, NA_real_, NA_complex_ a NA_character_. Ve jménech proměnných záleží na velkých a malých písmenech, tj. proměnné x a X jsou dvě různé proměnné.

Jméno proměnné by ideálně mělo být stručné a mělo by výstižně popisovat, jaké hodnoty proměnná obsahuje. Pokud se jméno skládá z více slov, slova se historicky oddělovala tečkami (např. pv.of.bond). V současné době se to nedoporučuje, protože tečky se používají i k oddělení generické a specifické části jmen objektových metod, viz kapitola 6. Místo toho se doporučuje používat podtržítka (pv_of_bond). Někteří lidé doporučuji tzv. “Camel Case” standard (pvOfBond), v R to však není běžné.

Pokud si nejste jistí, jak jméno proměnné sestavit, mohou vám pomoci dvě následující funkce: Funkce make.names() převede řetězec na syntakticky platné jméno proměnné, ovšem bohužel s tečkami. Funkce make_names() z balíku lettercase dělá totéž, ale s podtržítky.

make.names("pv of bond")
## [1] "pv.of.bond"
lettercase::make_names("pv of bond")
## [1] "pv_of_bond"

Někdy je potřeba pracovat s proměnnou, jejíž jméno není v R povoleno (taková situace nejčastěji vznikne při importu dat z jiného softwaru). Proměnnou s nelegálním jménem můžete použít, pokud její jméno uzavřete mezi dva zpětné apostrofy (“backticks”):

`ahoj lidičky!` <- 5
2 * `ahoj lidičky!`
## [1] 10

3.1.2 Přiřazení hodnoty do proměnné

Hodnoty se do proměnných přiřazují pomocí “šipky” <-, kde šipka vždy ukazuje ke jménu proměnné, zatímco na druhé straně je výraz, který má R vyhodnotit. V RStudiu lze šipku vložit pomocí klávesové zkratky Alt-. (Funguje i šipka -> otočená opačným směrem. Tuto kuriozitu však používá jen p. Mikula a není obecně doporučeníhodná, protože až na konci možná velmi dlouhé konstrukce zjistíte, co se vlastně s hodnotou vašeho výpočtu stane.) Někteří lidé používají k přiřazení do proměnné i symbol rovnítka (=). To nedoporučuji. Rovnítko v některých kontextech funguje jako synonymum šipky, zatímco v jiných ne (tam rovnítko znamená něco jiného). Detaily najdete zde: https://goo.gl/Tnu8Q5.

Příklad:

x <- 1  # x má nyní hodnotu 1
x  # jak se vzápětí přesvědčíme
## [1] 1

3.1.3 Vypsání hodnoty proměnné do konzoly

Při přiřazení hodnoty do proměnné se výsledek nevypíše. Pokud jej chcete vypsat, musíte o to R požádat. To můžete udělat třemi způsoby: 1) explicitně vypsat obsah proměnné pomocí funkce print(), 2) implicitně vypsat obsah proměnné tak, že napíšete její jméno (R volá implicitně funkci print() za vás) nebo 3) tak, že celý výraz přiřazení zabalíte do závorek.

x <- "This is some text."  # hodnota se přiřadí, nic se nevypíše
x         # implicitní vypsání hodnoty proměnné x
## [1] "This is some text."
print(x)  # explicitní vypsání hodnoty proměnné x
## [1] "This is some text."
(y <- 2)  # výraz se vyhodnotí a hodnota implicitně vypíše 
## [1] 2

Implicitní forma vypsání obsahu proměnné je vhodná pro interaktivní práci v konzoli, nemusí však fungovat uvnitř funkcí a skriptů, protože ve skutečnosti funguje tak, že požádá R o vrácení hodnoty proměnné – a podle kontextu může být vrácená proměnná využita různě. V konzoli se využije tak, že konzola na hodnotu zavolá funkci print(). Uvnitř funkce však může být vrácená hodnota použitá funkcí jinak. Uvnitř funkcí a podobných struktur je tedy třeba obsah proměnné vypsat explicitně pomocí funkce print().

To, co R vypíše do konzoly, se liší od skutečných hodnot proměnných. R totiž pro různé objekty volá různé varianty funkce print() přizpůsobené těmto objektům a může vypsat více nebo méně informací, než je jich obsaženo v dané proměnné.

Někdy proměnná obsahuje mnoho hodnot (dlouhý vektor, tabulku s mnoha řádku apod.) a my ji nechceme vypsat celou, nýbrž z ní chceme získat jen nějakou ukázku, typicky několik prvních nebo posledních hodnot. Několik prvních hodnot vrací funkce head(), posledních hodnot funkce tail(). Obě vrací implicitně 6 hodnot (prvků vektoru, řádků matice apod.); tento počet lze změnit nastavením parametru n:

x <- matrix(1:1200, ncol = 3)  # vytvoří matici se 400 řádky
head(x)                        # vypíše 6 prvních řádků matice
##      [,1] [,2] [,3]
## [1,]    1  401  801
## [2,]    2  402  802
## [3,]    3  403  803
## [4,]    4  404  804
## [5,]    5  405  805
## [6,]    6  406  806
head(x, n = 3)                 # vypíše 3 první řádky matice
##      [,1] [,2] [,3]
## [1,]    1  401  801
## [2,]    2  402  802
## [3,]    3  403  803
tail(x)                        # vypíše 6 posledních řádků matice
##        [,1] [,2] [,3]
## [395,]  395  795 1195
## [396,]  396  796 1196
## [397,]  397  797 1197
## [398,]  398  798 1198
## [399,]  399  799 1199
## [400,]  400  800 1200

Pokud pracujete v RStudiu, můžete použít k zobrazení obsahu proměnné i funkci View(). Tato funkce otevře novou záložku a zobrazí obsah proměnné ve formě interaktivní tabulky, která umožňuje i hodnoty třídit a filtrovat. Použití funkce je však omezené jen proměnné, které mají v principu charakter tabulky, tj. na vektory, datasety a matice. Funkci View() je možné vyvolat i pomocí myši. V záložce Environment stačí kliknout na ikonku tabulky vedle jména proměnné. Ve stejném místě je možné zobrazit i netabulární data. K tomu stačí kliknout na ikonku trojúhelníčku v kolečku.

3.1.4 Smazání proměnné

Ke smazání proměnné z aktuálního prostředí slouží funkce rm():

rm(x)  # smaže proměnnou x
rm(x, y, z)  # smaže proměnné x, y a z
rm(list = ls())  # smaže všechny proměnné z aktuálního prostředí

Proměnné je možné smazat i přímo v RStudiu. V záložce Environment k tomu slouží ikonka koštěte. Pokud máte proměnné zobrazené v režimu Grid, můžete vybrat, které proměnné budou smazány. V režimu List budou smazány všechny proměnné.

Někdy je však potřeba vyčistit paměť R důkladněji. Smazání všech proměnných totiž stále zanechá v R mnoho změn: načtené balíky, změněné cesty apod. Nejdůkladnější vyčištění pracovního prostředí přestavuje restart R. V RStudiu je to možné udělat v menu Session \(\rightarrow\) Restart R nebo pomocí klávesové zkratky Ctrl-Shift-F10. Pokud si chcete ověřit, že váš skript běží spolehlivě, vždy byste jej měli vyzkoušet v čistém prostředí R, tj. po jeho restartu.