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] TRUEAo contrário de S3, R verifica os slots. Um slot desconhecido ou um valor do tipo incorreto interrompe new() com um erro, portanto um objeto S4 sempre tem a estrutura que sua classe declara:
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 recebe um valor ganha um valor vazio de seu tipo, como character(0). prototype define valores padrão reais. Códigos mais antigos declaram os slots com representation(), o 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 estar 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