2014-08-18 4 views
0

В объектах R S3 возникает интересная ситуация, поскольку они не наследуют классы.Наследование классов или умножение классов в R?

Видно, что agnes.object (результат функции agnes{cluster}) имеет 2 разных класса.

library(cluster) 
example(agnes) 
class(agn1) 
[1] "agnes" "twins" 

Но то время, когда вы читаете agnes.objectdocumentation есть раздел Наследование и там есть фраза: "Класс„Агнес“наследует от„близнецов“.

Что вы думаете об этом? Это действительно наследование или просто умножение классов :)?

ответ

1

S3 допускает линейную иерархию классов. Так

> class(agn1) 
[1] "agnes" "twins" 

говорит, что agn1 является экземпляром класса agnes, который расширяет (наследует) близнецов. Здесь мы определяем общие методы и методы

## S3 generics 
foo <- function(x) UseMethod("foo") 
bar <- function(x) UseMethod("bar") 
baz <- function(x) UseMethod("baz") 

## S3 methods -- append '.' and class name 
foo.twins = function(x) "twins" 
foo.agnes = function(x) "agnes" 
bar.twins = function(x) "twins" 
baz.agnes = function(x) "agnes" 

и иллюстрируем наследование при отправке (выбор метода).

> foo(agn1) 
[1] "agnes" 
> bar(agn1) 
[1] "twins" 
> baz(agn1) 
[1] "agnes" 

Система класса S3 в R основана на экземпляре, формального определения класса нет. Наследование класса подразумевается символьным вектором. Таким образом, объект с классом "agnes" не имеет родительского класса, тогда как класс c("agnes", "twins") определяет иерархию линейных классов с родителем "twins" (даже если объект отсутствует в любом месте с классом "twins"). Потому что нет никакого формального определения класса, два объекта, объявляющих себя одного и того же класса может иметь совершенно другую структуру, например,

structure(list(), class="A") 
structure(list(x=1, y=2, z=3), class="A") 

оба может законно претендовать на класс «А»!

+0

Но если функция перегружена только для класса близнецов, и есть какой-то объект с одним классом «agnes», то эта функция не будет работать на этом объекте. Таким образом, похоже, что «agnes» действительно не наследуется после близнецов. Мой вопрос только показал, что если есть объект с 2 классами, то функция принимает один или другой класс в линейном порядке. –

+0

Наследование подразумевается символьным вектором; если вектор имеет длину один, а одно значение - «agnes», то это говорит о том, что этот экземпляр не имеет отношения наследования. S3 основан на экземпляре - наследование подразумевается вектором класса, а не некоторым определением класса. –

+0

Так значит ли это ошибка в agnes.object manual :)? Должно быть написано, что agnes.object имеет 2 классности :)? –

Смежные вопросы