2015-01-20 2 views
1

Это общий вопрос, мотивированный определенным событием.Используйте один класс объекта с несколькими

Когда объект содержит несколько классов, каждый из которых имеет разные общие действия, как я могу указать использование класса «this», а не класса «this»?

Пример кода приведен в комплекте с geepack.

library(stargazer) 
library(geepack) 

data(dietox) 
dietox$Cu <- as.factor(dietox$Cu) 
mf <- formula(Weight~Cu*(Time+I(Time^2)+I(Time^3))) 

gee0 <- glm(mf, data = dietox, family = poisson("identity")) # a wrong model 
gee1 <- geeglm(mf, data=dietox, id=Pig, family=poisson("identity"),corstr="ar1") 

class(gee0) 
class(gee1) 

summary(gee0) 
summary(gee1) 

stargazer(gee0, type = "text") 
stargazer(gee1, type = "text") 

Я хотел бы работать с объектом класса «glm», а не с объектом класса «geeglm».

@Richard Scriven: Я просто хотел бы вывести результаты в отчет о звездном (...) отчете. Спасибо за уточняющий вопрос.

+1

Какое конкретное действие вы пытаетесь выполнить, используя класс 'glm'? –

+1

Вы можете сделать 'class (gee1) <-" glm "'. – agstudy

+1

[stargazer pdf] (http://cran.r-project.org/web/packages/stargazer/stargazer.pdf) говорит, что поддерживаются как 'gee', так и' glm', поэтому есть, вероятно, методы для обоих, I предположим (никогда не использовал этот пакет). –

ответ

2

Система класса, которая использует атрибут class(foo), не сильно типизирована. Вектор класса используется R, чтобы определить, какие методы использовать, когда этот объект передается в общий тип, например print. Например, если вы должны были позвонить print(gee1), R сначала будет искать функцию с именем print.geeglm, которая в этом случае будет найдена в пакете geepack, а R вызывает эту функцию с аргументами, указанными в print().

Если R не нашел функцию с именем print.geeglm, он будет затем искать print.gee, то print.glm, то print.default.

Итак, gee1 не содержит 3 объекта с разными классами, это один объект с вектором класса, который информирует R, где искать общие методы.

Чтобы сделать вещи несколько более запутанными, R имеет несколько типов систем, а класс vetcor используется системой типа S3. Поиск Google для «R s3 class» даст вам больше информации о системе класса R.

+0

Да, извините за недосмотр. Исправлено первое предложение. – Jthorpe

+0

Благодаря как @Jthorpe, так и @agstudy. Выяснилось, что в этом случае он не удерживает 'foo' как класс как таковой, но дает путь поиска для операций. – alex

+2

Это хорошее знание, но я действительно не вижу, как это отвечает на вопрос. Это просто общие знания о методах диспетчеризации –

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