
R jako programovací jazyk
R vznikl jako programovací jazyk pro analýzu dat a je směsí různých typů programovacích jazyků:
- imperativních - obsahuje iterativní konstrukce (for, if, ...) - podobně jako C, Pascal...
- funkcionálních - obsahuje lambda funkce a správu listů - LISP
- objektově orientovaných - obsahuje koncept objektu, metody, polymorfizmy - Python, C++...
To, že je R objektově orientovaný jazyk znamená, že pracuje s konceptem objektu a jeho třídy (object class) a s konceptem metod.
Zjednodušeně řečeno: R vytváří a manipuluje objekty (datové struktury - proměnné, číselné pole, znakové řetězce; funkce; komplexnější struktury ...)
Třída (class) je definice objektu. Obsahuje několik slotů, které obsahují informace specifické pro danou třídu. Každý objekt v R patří do nějaké třídy.
Výpočty jsou prováděny pomocí metod - to jsou specializované funkce, do kterých objekt vstupuje jako argument a které jsou určené pro práci se specifickými třídami objektů. Která metoda má být použita závisí na typu třídy objektu a toto rozhodování mají na starosti tzv. generické funkce. Generické funkce na základě třídy objektu přiřadí a aplikují správnou metodu, aniž by to koncový uživatel musel řešit. Mají tedy stejný název, ale v závislosti na typu objektu provedou různé úkony.
Generickými funkcemi jsou mnohé grafické funkce, například plot(), ale také sumarizační funkce summary(), str()... a mnohé jiné.
Fungování generických funkcí si ukážeme na příkladu funkce plot(), kterou aplikujeme na numerický vektor, tabulku a matici.
Vytvoříme vektor o délce 1000 z náhodného rozložení:
> set.seed(10) # tenhle příkaz zaručí, že výběr z rozložení v našem příkladu i ve Vašem počítači bude stejný.
> a = rnorm(1000)
> class(a)
[1] "numeric"
Vytvoříme tabulku
> b = as.table(UCBAdmissions[,,1])
Použili jsme první z kontingenčních tabulek v datovém souboru UCBAdmissions, který je součástí instalace R, není proto potřeba jej speciálně načítat.
> b
Gender
Admit Male Female
Admitted 512 89
Rejected 313 19
> class(b)
[1] "table"
Použijeme-li funkci plot() pro objekt a, který je numerickým vektorem, dostaneme x-y bodový graf, ve kterém osa x zobrazuje pořadí hodnot ve vektoru a osa y zase hodnoty vektoru a.
> plot(a)
Použijeme-li funkci plot() pro objekt b, který je třídy tabulka, dostaneme mozaikový graf, který vizualizuje poměry jednotlivých kategorií tabulky.
> plot(b)
Je důležité si uvědomit, že pouhým pohledem na strukturu objektu nelze vždy spolehlivě určit jeho třídu. Například kdybychom nepoužili funkci as.table(), první z kontingenčních tabulek datového souboru UCBAdmissions by zůstala maticí, i když vypadá jako tabulka:
> d = UCBAdmissions[,,1]
> d
Gender
Admit Male Female
Admitted 512 89
Rejected 313 19
> class(d)
[1] "matrix"
V případě vykreslení objektu d pomocí funkce plot() je výsledkem bodový graf, ve kterém osa x představuje první sloupec a osa y druhý sloupec matice.
> plot(d)
Většina metod je napsána přímo v R, ale je možné začlenit procedury napsané v C, C+, Python, Fortran, Perl, Java...