class
Objektové třídy
class {base} | Dokumentace R v češtině |
Popis
R má jednoduchý mechanismus generických funkcí, který lze použít pro objektově orientovaný styl programování. Metoda odeslání probíhá na základě třídy prvního argumentu generické funkce.
Použití
class(x)
class(x) <- value
unclass(x)
inherits(x, what, which = FALSE)
oldClass(x)
oldClass(x) <- value
Argumenty
x |
objekt R |
what, value |
znakový vektor jmenující třídy. |
which |
proměnná typu logical, která ovlivňuje návratovou hodnotu: viz ‘Detaily’. |
Detaily
Zde popisujeme tzv. “S3” třídy (a metody). Pro “S4” třídy (a metody), viz ‘Formální třídy’ níže.
Mnoho objektů R má atribut třída
, znakový vektor, který udává názvy tříd, ze kterých objekt dědí. (Funkce oldClass
a oldClass<-
získají a nastaví atribut, co lze také provést přímo.)
Pokud objekt nemá atribut třída, má implicitní třídu, zejména "matice"
, "pole"
, "funkce"
nebo "numeric"
nebo výsledek typeof(x)
(který je podobný mode(x)
), ale ne pro typ "jazyk"
a "volání"
mode
, kde existují následující další třídy pro odpovídající volání
funkcí: if
, while
, for
, =
, <-
, (
, {
, call
.
Všimněte si, že objekty NULL
nemohou mít atributy (tedy ne třídy) a pokus o přiřazení třídy je chyba.
Když se na objekt s atributem třídy c("first", "second")
použije obecná funkce fun
, systém vyhledá funkci nazvanou fun.first
a pokud ji najde, použije ji na objekt. Pokud není nalezena žádná taková funkce, vyzkouší se funkce nazvaná fun.second
. Pokud žádný název třídy nevytváří vhodnou funkci, použije se funkce fun.default
(pokud existuje). Pokud neexistuje atribut třída, je zkoušena implicitní třída, pak výchozí metoda.
Funkce class
vytiskne vektor názvů tříd, ze kterých objekt dědí. Podobně, class<-
nastavuje třídy, ze kterých dědí objekt. Přiřazení NULL
odebere atribut třída.
unclass
vrací (kopie) svého argumentu s odebraným atributem třída. (Není dovoleno pro objekty, které nelze kopírovat, tzn. prostředí a externí ukazatele.)
inherits
označuje, zda svůj první argument zdědí z kterékoliv třídy specifikované v argumentu what
. Pokud je which
TRUE
pak je vrácen vektor typu integer stejné délky jako what
. Každý prvek označuje polohu v class(x)
, která odpovídá prvku what
; nula označuje žádnou shodu. Pokud je which
FALSE
, pak je pomocí inherits
vrácena TRUE
, jestliže některý z názvů what
odpovídá kterékoli class
.
Všechny až na inherits
jsou primitivní funkce.
Formální třídy
Další mechanismus formálních formálních tříd, přezdívaný “S4”, je dostupný v balíčku methods který je standardně připojen. Pro objekty, které mají formální třídu, je její název vrácen pomocí class
jako znakový vektor délky jedna a odeslání metody se může odehrat na několika argumentech namísto pouze prvního. Výběr metody S3 se však pokouší zacházet s objekty ze třídy S4, jako by měli odpovídající atribut třídy S3, jak to dělá inherits
. Proto lze pro třídy S4 definovat metody S3. Podívejte se na stránky nápovědy ‘Introduction’ a ‘Methods_for_S3’ pro základní informace o metodách S4 a o vztahu mezi nimi a metodami S3.
Náhradní verze funkce nastavuje třídu na poskytnutou hodnotu. Pro třídy, které mají formální definici a přímo nahrazují tuto třídu, je silně zastaralá. Výraz as(object, value)
je způsob, jak konvertovat objekt na určitou třídu.
Analog inherits
pro formální třídy je is
. Dvě funkce se chovají konzistentně s jednou výjimkou: třídy S4 mohou mít podmíněnou dědičnost s explicitním testem. V tomto případě is
otestuje podmínku, ale inherits
ignoruje všechny podmíněné nadtřídy.
Poznámka
Funkce oldClass
a oldClass<-
se chovají stejným způsobem jako funkce těchto jmen v S-PLUS 5/6, ale v R UseMethod
odesílá třídy jako vrácené pomocí class
(s některými interpolovanými třídami: viz odkaz) spíše než oldClass
. Avšak, skupinové generika odesílají oldClass
pro efektivitu, a vnitřní generika pouze odesílají na objekty, pro které je is.object
true.
Ve starších verzích R, přiřazení vektoru s nulovou délkou s class
odstranilo třídu: nyní je to chyba (zatímco stále funguje pro oldClass
). Je jasnější vždy přiřadit NULL
k odstranění třídy.
Viz také
UseMethod
, NextMethod
, ‘group generic’, ‘internal generic’
Příklady
x <- 10
class(x) # "numeric"
oldClass(x) # NULL
inherits(x, "a") #FALSE
class(x) <- c("a", "b")
inherits(x,"a") #TRUE
inherits(x, "a", TRUE) # 1
inherits(x, c("a", "b", "c"), TRUE) # 1 2 0
class( quote(pi) ) # "name"
## běžné volání
class( quote(sin(pi*x)) ) # "class"
## speciální volání
class( quote(x <- 1) ) # "<-"
class( quote((1 < 2)) ) # "("
class( quote( if(8<3) pi ) ) # "if"