9.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.

Nejdříve ze všeho potřebujete poznat, zda je nějaká proměnná objekt v systému S3. Jsou tři možnosti, jak to můžete udělat: 1) můžete se podívat, zda je proměnná objekt pomocí funkce is.object(), a že se nejedná o objekt v systému S4, 2) můžete použít funkci otype() z balíku pryr nebo 3) se samozřejmě můžete podívat do dokumentace:

is.object(eva) & !isS4(eva)
## [1] TRUE
pryr::otype(eva)  # funkce z balíku pryr
## Registered S3 method overwritten by 'pryr':
##   method      from
##   print.bytes Rcpp
## [1] "S3"

Často potřebujete zjistit, jak se jmenují jednotlivé položky objektu. Pokud je objekt v systému S3 postaven nad seznamem, což je nejčastější případ, můžete to udělat pomocí funkce str(). Když znáte jméno dané položky, můžete získat její obsah pomocí operátoru $:

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

Někdy se hodí zjistit, jaké metody má daná třída k dispozici. K tomu slouží funkce methods(). Můžete ji použít dvě různými způsoby: 1) ke zjištění metod, které patří dané generické funkci, a 2) ke zjištění metod, které jsou k dispozici pro danou třídu:

head(methods("print"))  # metody generické funkce print() -- jen prvních 6 metod
## [1] "print.acf"     "print.AES"     "print.anova"   "print.aov"    
## [5] "print.aovlist" "print.ar"
methods(class = "human")  # metody dostupné pro třídu human
## [1] bmi   print
## see '?methods' for accessing help and source code

Jmena konkretnich metod lze zjistit take pomoci funkce apropos(), kdyz se pozada, aby hledala regularni vyraz pro cokoli, co konci ".trida_objektu" (s regularnimi vyrazy se seznamite v kapitole 13):

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

Důležité je také najít dokumentaci k dané metodě. Z dokumentace ke generické funkci se totiž 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ě (bohužel ne všechny balíky dokumentují všechny metody, které implementují):

?print.summary.lm  # dokumentace k metodě pro tisk summary(m), kde m je objekt vráceny z\ lineární regrese