Definindo classes S4
Parte da seção Programação Orientada a Objetos do Journey de R da Coddy. Lição 22 de 57.
S4 é o sistema formal de objetos do R. setClass() declara uma classe com slots nomeados e o tipo de cada um, e new() cria um objeto. O operador @ lê um slot:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
cat(ada@name, "is", ada@age)Saída:
Ada is 36setClass() também retorna uma função geradora. Atribua-a a um nome, geralmente o nome da classe, e chame-a como um construtor:
Person <- setClass("Person", slots = c(name = "character", age = "numeric"))
bo <- Person(name = "Bo", age = 7)
print(bo@age + 1)
print(is(bo, "Person"))Saída:
[1] 8
[1] TRUEDiferentemente de S3, R verifica os slots. Um slot desconhecido ou um valor do tipo errado faz com que new() pare com um erro, então um objeto S4 sempre tem a estrutura declarada por sua classe:
setClass("Person", slots = c(name = "character", age = "numeric"))
p <- new("Person", name = "Cy", age = "ten")Saída:
Error in validObject(.Object) :
invalid class “Person” object: invalid object for slot "age" in class "Person": got class "character", should be or extend class "numeric"
Calls: new -> initialize -> initialize -> validObject
Execution haltedUm slot que não é informado recebe um valor vazio de seu tipo, como character(0). prototype define valores padrão reais. O código mais antigo declara os slots com representation(), que significa o mesmo que slots:
setClass("Task", slots = c(title = "character", done = "logical"),
prototype = list(done = FALSE))
setClass("Note", representation(text = "character"))
t <- new("Task", title = "Write report")
print(t@done)
print(length(new("Note")@text))Saída:
[1] FALSE
[1] 0Desafio
FácilDeclare a classe S4 Book em Book.R com três slots: title e author do tipo character e pages do tipo numeric. Em seguida, complete book_label(b), que lê os slots com @ e retorna Dune by Frank Herbert (412 pages).
O código fornecido lê linhas title;author;pages, cria cada livro com new("Book", ...), imprime seu rótulo e, por fim, os nomes dos slots da classe.
Seu código deve ficar em Book.R. main.R contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
source("Book.R")
# Código de entrada/saída fornecido: mantenha-o como está
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, ";")[[1]]
b <- new("Book", title = p[1], author = p[2], pages = as.numeric(p[3]))
cat(book_label(b), "\n", sep = "")
}
cat("slots: ", paste(slotNames("Book"), collapse = ", "), "\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