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.