6.3 Práce s objekty

Ve většině případů nebudete vytvářet vlastní objekty – stačí, když budete schopní zacházet s objekty, které vrátí funkce, které budete používat.

6.3.1 Jak poznat objekt S3

Poznat, že je něco objekt v systému S3 není úplně snadné. Jsou tři možnosti:

is.object(eva) & !isS4(eva)
## [1] TRUE
pryr::otype(eva)  # funkce z balíku pryr
## [1] "S3"

Nebo se samozřejmě podíváte do dokumentace funkce, kterou používáte.

6.3.2 Struktura objektu

Většina objektů systému S3 je postavená nad seznamy, takže jejich strukturu zjistíte funkcí str() a složky získáte pomocí $:

str(eva)
## List of 4
##  $ name  : chr "Eve"
##  $ height: num 169
##  $ weight: num 52
##  $ rank  : chr "CEO"
##  - attr(*, "class")= chr [1:2] "manager" "human"
eva$height
## [1] 169

6.3.3 Které metody jsou k dispozici

Metody, které patří dané generické funkci vrátí funkce methods():

head(methods("print"))  # jen prvních 6 metod (zajistí funkce head())
## [1] "print.acf"     "print.AES"     "print.anova"   "print.aov"    
## [5] "print.aovlist" "print.ar"

Metody, které jsou k dispozici pro nějakou třídu:

methods(class = "human")
## [1] bmi   print
## see '?methods' for accessing help and source code

Jména konkrétních metod lze zjistit také pomocí funkce apropos(), když se požádá, aby hledala regulární výraz pro cokoli, co končí “.třída_objektu”:

apropos(".*\\.human")
## [1] "bmi.human"   "print.human"

6.3.4 Nápověda k metodám

Když hledáte nápovědu ke generické funkci, nemusíte se dozvědět vše, co potřebujete. Pokud chcete nápovědu k tomu, jak se generická funkce chová pro daný objekt, hledejte dokumentaci k jeho metodě.

Později se budeme bavit o tom, jak dělat ekonometrii v R. Výsledkem odhadu lineárního modelu je objekt třídy “lm”. Pro tento objekt existuje mnoho generických funkcí jako je print(), summary() a plot(). Pokud tento objekt vytisknete pomocí funkce plot(), vykreslí několik diagnostických grafů. Metoda má mnoho parametrů, které však nezjistíte z dokumentace generické funkce plot(), nýbrž z dokumentace metody plot.lm().