## ----setup, echo=FALSE--------------------------------------------------- #opts_chunk$set(comment='') ## ----plot---------------------------------------------------------------- plot(rivers) plot(iris[, -5], col=c('red', 'green', 'blue')[unclass(iris$Species)]) plot(Titanic) ## ----summary------------------------------------------------------------- summary(rivers) summary(iris) summary(Titanic) ## ----class--------------------------------------------------------------- class(rivers) class(iris) class(Titanic) ## ----data.frame---------------------------------------------------------- n <- 10 p <- 5 set.seed(13) dad <- data.frame(Y1=floor(runif(n, 1, 10)), # Renda (s. mínimo) Y2=rnorm(n, 1.7, .2), # Altura Y3=rnorm(n, 60, .3), # Peso Y4=rnorm(n, 30, .4), # Idade Y5=sample(c('M', 'F'), n, rep=T)) # Sexo rownames(dad) <- paste('id', 1:nrow(dad), sep='-') dad ## ----dad----------------------------------------------------------------- attributes(dad) ## ----methods------------------------------------------------------------- methods(summary) methods(plot) methods(mean) ## ----plot.dad------------------------------------------------------------ summary(dad) plot(dad[-5]) ## ----default------------------------------------------------------------- str(summary.default) str(plot.default) str(mean.default) ## ------------------------------------------------------------------------ class(dad) ## ----grep---------------------------------------------------------------- grep('data.frame', methods(summary), value=TRUE) ## ------------------------------------------------------------------------ summary(dad) ## ----attributes---------------------------------------------------------- attributes(dad) ## ------------------------------------------------------------------------ old.class <- class(dad) # Armazenando a classe original class(dad) <- 'test' # Atribuindo uma nova classe attributes(dad) summary(dad) # Observar a diferença em relação ao 'summary' anterior grep('^summary.list', methods(summary), value=TRUE) # Observar que não existe o método 'summary.list'. ## ------------------------------------------------------------------------ class(dad) <- old.class class(dad) summary(dad) # Novamente foi executado o método 'summary.data.frame' ## ------------------------------------------------------------------------ class(dad) <- c('test', 'jcfaria', 'data.frame') attributes(dad) # OPA...o objeto pertence a mais de uma classe? ## ----OO1----------------------------------------------------------------- summary.jcfaria <- function(object, clm=1, ...) summary(object[, clm], ...) methods(summary) # Observe a presença de 'summary.jcfaria'. grep('summary.jcf', # (se acha difícil localizar a função 'grep' pode ajudar) methods(summary), value=TRUE) summary(dad) summary(dad, clm=2) summary(dad, clm=3, digits=2) ## ----OO2----------------------------------------------------------------- plot.jcfaria <- function(x, ...) boxplot(x, ...) methods(plot) # Observe a presença de 'plot.jcfaria' grep('plot.jcf', methods(plot), value=TRUE) plot(dad[3]) plot(dad[3], ylim=c(59.5, 60.6), xlab='Peso', col='red', main='plot.jcfaria') ## ------------------------------------------------------------------------ fruta <- function(x, ...) UseMethod('fruta') ## ------------------------------------------------------------------------ fruta.default <- function(x, ...) print('Não sei qual fruta!') fruta.Abacaxi <- function(x, ...) print('Abacaxi!') fruta.Carambola <- function(x, ...) print('Carambola!') fruta.Pitanga <- function(x, ...) print(paste(x, '-', 'Pitanga!')) ## ----add_summary--------------------------------------------------------- summary.Frutas <- function(object, ...) paste('Você gosta de ', tolower(class(object)), '?', sep='', ...) summary.Abacaxi <- function(object, ...) paste(class(object), ' deve ser servido em rodelas!', sep='', ...) ## ----add_plot------------------------------------------------------------ plot.Frutas <- function(x, ...) { plot(1, type='n', ...) text(x=1, y=1, paste(class(x), 'não são para se plotar, \n mas para comer!', sep=' ', ...), col='red', ...) } plot.Abacaxi <- function(x, ...) { plot(1, type='n', ...) text(x=1, y=1, paste(class(x), 'não é para se plotar, \n mas para comer', '\n (servido em rodelas)!', sep=' ', ...), col='red', ...) } ## ----fruta--------------------------------------------------------------- a <- 1:3 class(a) fruta(a) # 'fruta.default' class(a) <- 'Carambola' a fruta(a) # 'a' pertence a classe 'Carambola'! class(a) <- c('Jaboticaba', 'Maçã', 'Abacaxi') # 'a' irá pertencer a mais de uma classe! a fruta(a) # Busca no vetor classe para dispatch -> 'Abacaxi' class(a) <- c('Mamão', 'Pitanga', 'Abacaxi') a fruta(a) # Busca no vetor classe para dispatch -> 'Pitanga' class(a) <- 'Framboesa' fruta(a) # Irá usar o método fruta.default summary(a) # Usa o método 'summary.default' plot(a, pch=19, cex=2) ## ----frutas-------------------------------------------------------------- class(a) <- 'Frutas' summary(a) # Usa o método 'summary.Frutas' plot(a) # Idem class(a) <- 'Abacaxi' summary(a) # Usa o método 'summary.Abacaxi' plot(a) # Idem a <- unclass(a) attributes(a) summary(a) # Usa o método 'summary.default' plot(a) # Usa o método 'plot.default' vogais <- letters[c(1, 5, 9, 15, 21)] b <- paste('a', vogais[1:4], sep='') b class(b) ## ------------------------------------------------------------------------ attr(b, 'dim') <- c(2, 2) b class(b) attributes(b) fruta(b) ## ----attr---------------------------------------------------------------- attr(b, 'JCFaria') <- 'Professor da UESC/Ilhéus/Bahia' attributes(b) attributes(b)$JCFaria fruta(b) # Usa o método 'fruta.default' summary(b) # Usa o método 'summary.matrix' class(b) <- 'teste' b rownames(b) <- paste('l', 1:2, sep='') colnames(b) <- paste('c', 1:2, sep='') ## ------------------------------------------------------------------------ summary.teste <- function(object, ...) { print(object[,]) cat('\n') cat(attributes(object)$JCFaria) cat('\n') } summary(b) ## ------------------------------------------------------------------------ methods(summary) methods(summary) ## ---- error=TRUE--------------------------------------------------------- summary.aovlist # Pacote 'stats' summary.prcomp # Pacote 'stats' ## ou plot.data.frame # Pacote 'graphics' plot.prcomp # Pacote 'stats' ## ------------------------------------------------------------------------ stats:::summary.prcomp # Pacote 'stats' graphics:::plot.data.frame # Pacote 'graphics' stats:::plot.prcomp # Pacote 'stats'