Métodos para genéricos base
Parte da seção Programação Orientada a Objetos do Journey de R da Coddy. Lição 9 de 57.
Muitas funções da base R são genéricas S3: print(), format(), summary(), toString(), length(), as.character() e outras. Adicionar um método faz com que sua classe funcione com uma função que todo usuário de R já conhece. summary.gradebook() gera um relatório sobre um objeto inteiro:
summary.gradebook <- function(object, ...) {
paste0(length(object$marks), " marks, average ", mean(object$marks))
}
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
cat(summary(g), "\n")Saída:
3 marks, average 82 Verifique os parâmetros do genérico antes de escrever o método: summary() chama seu primeiro argumento de object, enquanto toString() e format() o chamam de x. toString() deve retornar uma única string:
toString.gradebook <- function(x, ...) paste(x$marks, collapse = " / ")
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
print(toString(g))Saída:
[1] "70 / 85 / 91"Um método length() altera o significado de length() para a classe. Uma fila que armazena seus itens em um campo pode informar quantos itens contém, em vez do número de campos na lista:
q <- structure(list(items = c("a", "b", "c"), name = "jobs"), class = "queue")
print(length(q))
length.queue <- function(x) length(x$items)
print(length(q))Saída:
[1] 2
[1] 3Os operadores também são genéricos. Um método chamado "+.money", escrito entre aspas por causa do símbolo, é executado quando qualquer um dos lados de + é um objeto money. Ele recebe os dois lados como e1 e e2:
new_money <- function(amount) structure(list(amount = amount), class = "money")
"+.money" <- function(e1, e2) new_money(e1$amount + e2$amount)
"==.money" <- function(e1, e2) e1$amount == e2$amount
a <- new_money(5)
b <- new_money(7)
print((a + b)$amount)
print(a == b)Saída:
[1] 12
[1] FALSEDesafio
FácilUma pilha mantém seus itens no campo items, com o topo da pilha por último. new_stack(), push() e pop() em Stack.R são fornecidos. Adicione três métodos:
length.stack()retorna o número de itens.toString.stack()retorna os itens do topo para a base, unidos por|, ouempty.summary.stack()retornastack of 3, top: c, oustack of 0quando está vazia.
O código fornecido lê os comandos push <item> e pop e, em seguida, imprime o tamanho, toString() e summary().
Seu código deve ficar em Stack.R. main.R contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
source("Stack.R")
# Código de entrada/saída fornecido: mantenha-o como está
input <- suppressWarnings(readLines(file("stdin")))
s <- new_stack()
for (cmd in input) {
if (cmd == "pop") s <- pop(s) else s <- push(s, substring(cmd, 6))
}
cat("length: ", length(s), "\n", sep = "")
cat("items: ", toString(s), "\n", sep = "")
cat(summary(s), "\n", sep = "")
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos do S3
Trabalhando com ArquivosListas com uma ClasseFunções ConstrutorasMétodos de Impressão e FormataçãoValidadores e AuxiliaresRevisão - Temperaturas4Encapsulamento em R
Closures como ObjetosAmbientes como ObjetosFunções de AcessoProtegendo o EstadoRecapitulação - Parquímetro2Genéricos e Métodos S3
Genéricos e UseMethodMétodos padrãoMétodos para genéricos baseFundamentos de NextMethodRevisão - Áreas de formas5Classes S4
Definindo classes S4Slots e acessoVerificações de validadeMétodos showRevisão - Catálogo de produtos8Classes de Referência
Definindo Classes de ReferênciaMétodos e Atualizações de CamposSemântica de CópiaHerança e callSuperRecapitulação — Fila de Tarefas11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Compilador de R online