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
::otype(eva) # funkce z balíku pryr pryr
## [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"
$height eva
## [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í):
# dokumentace k metodě pro tisk summary(m), kde m je objekt vráceny z\ lineární regrese ?print.summary.lm