Menu
CoddyTech

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 36

setClass() 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] TRUE

Diferentemente 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 halted

Um 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] 0
challenge icon

Desafio

Fácil

Declare 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 = "")
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de R online