Métodos show
Parte da seção Programação Orientada a Objetos do Journey de R da Coddy. Lição 25 de 57.
Quando um objeto S4 é impresso, R chama a função show(). Sem um método para a classe, ele lista cada slot, o que está correto, mas é longo:
setClass("Point", slots = c(x = "numeric", y = "numeric"))
p <- new("Point", x = 1, y = 2)
pSaída:
An object of class "Point"
Slot "x":
[1] 1
Slot "y":
[1] 2setMethod("show", "Point", function(object) ...) dá à classe sua própria impressão. O método imprime com cat() e é usado tanto quando um objeto é impresso no nível superior quanto por print():
setClass("Point", slots = c(x = "numeric", y = "numeric"))
setMethod("show", "Point", function(object) {
cat("Point(", object@x, ", ", object@y, ")\n", sep = "")
})
p <- new("Point", x = 1, y = 2)
p
print(p)Saída:
Point(1, 2)
Point(1, 2)Um slot pode conter outro objeto S4: declare seu tipo como o nome da classe. O método show() externo pode imprimir o objeto interno chamando show() nele:
setClass("Point", slots = c(x = "numeric", y = "numeric"))
setMethod("show", "Point", function(object) cat("(", object@x, ", ", object@y, ")", sep = ""))
setClass("Line", slots = c(from = "Point", to = "Point"))
setMethod("show", "Line", function(object) {
cat("line ")
show(object@from)
cat(" -> ")
show(object@to)
cat("\n")
})
new("Line", from = new("Point", x = 0, y = 0), to = new("Point", x = 3, y = 4))Saída:
line (0, 0) -> (3, 4)Uma classe virtual, declarada com representation("VIRTUAL"), não pode ser criada com new(). Ela existe para ser uma classe-pai comum para outras classes, conforme desenvolvido no capítulo sobre herança S4. isVirtualClass() distingue os dois tipos:
setClass("Shape", representation("VIRTUAL"))
setClass("Point", slots = c(x = "numeric"))
cat(isVirtualClass("Shape"), isVirtualClass("Point"), "\n")
msg <- tryCatch(new("Shape"), error = function(e) "cannot create a Shape")
cat(msg, "\n")Saída:
TRUE FALSE
cannot create a Shape Desafio
FácilPontos e segmentos são duas classes S4 em dois arquivos. As classes estão declaradas. Adicione seus métodos show():
- Em
Point.R: um ponto é impresso comoPoint(1, 2), seguido por uma nova linha. - Em
Segment.R: um segmento é impresso comoSegment Point(1, 2) to Point(4, 6), length 5, seguido por uma nova linha, com o comprimento arredondado para duas casas decimais. Construa o texto do ponto por conta própria ou com um auxiliar; o método do ponto imprime sua própria nova linha, portanto não o chame no meio da linha do segmento.
O código fornecido lê linhas 1,2 4,6, imprime o primeiro ponto e, em seguida, o segmento, ambos por meio de seus métodos show().
Seu código deve estar em Point.R e Segment.R. main.R contém o código de entrada/saída fornecido e não pode ser editado.
Experimente você mesmo
source("Point.R")
source("Segment.R")
# Código de entrada/saída fornecido: mantenha-o como está
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
n <- as.numeric(strsplit(line, "[ ,]")[[1]])
a <- new("Point", x = n[1], y = n[2])
b <- new("Point", x = n[3], y = n[4])
print(a)
print(new("Segment", from = a, to = b))
}
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