Menu
Coddy logo textTech

Listas com uma Classe

Parte da seção Programação Orientada a Objetos do Journey de R da Coddy. Lição 2 de 57.

S3 é o sistema de objetos mais antigo e mais utilizado do R. Um objeto S3 é uma lista comum com um atributo class, um rótulo que indica que tipo de objeto ele é. class(x) <- "dog" define o rótulo:

rex <- list(name = "Rex", age = 3)
class(rex) <- "dog"
print(class(rex))
cat(rex$name, "is", rex$age)

Saída:

[1] "dog"
Rex is 3

structure() constrói o valor e define seus atributos em uma única chamada, que é a maneira usual de criar um objeto S3. Os campos são acessados com $, como em qualquer lista:

rex <- structure(list(name = "Rex", age = 3), class = "dog")
print(class(rex))
print(is.list(rex))
print(rex$age)

Saída:

[1] "dog"
[1] TRUE
[1] 3

A classe é apenas um rótulo: R não verifica quais campos um objeto possui, portanto qualquer lista pode ser chamada de dog. unclass() remove o rótulo e devolve a lista simples:

p <- structure(list(x = 1, y = 2), class = "point")
print(unclass(p))

Saída:

$x
[1] 1

$y
[1] 2

Os objetos S3 são valores. Uma função que altera um objeto altera sua própria cópia, portanto retorna a nova versão e o chamador a atribui. O original permanece como estava:

birthday <- function(d) {
  d$age <- d$age + 1
  d
}
rex <- structure(list(name = "Rex", age = 3), class = "dog")
older <- birthday(rex)
cat(rex$age, older$age)

Saída:

3 4
challenge icon

Desafio

Fácil

Complete make_pet(name, species, age) em Pet.R. Ele retorna uma lista com os campos name, species e age, nessa ordem, e a classe pet. Em seguida, complete describe_pet(p), que retorna uma frase: um animal de estimação chamado Rex, da espécie dog, com idade 3 fornece Rex is a 3 year old dog.

O código fornecido lê o nome, a espécie e a idade, cria o animal de estimação e imprime sua classe, seus nomes de campos e a frase.

Seu código deve ficar em Pet.R. main.R contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

source("Pet.R")

# Código de entrada/saída fornecido: mantenha-o como está
input <- suppressWarnings(readLines(file("stdin")))
p <- make_pet(input[1], input[2], as.numeric(input[3]))
cat("class: ", class(p), "\n", sep = "")
cat("fields: ", paste(names(p), collapse = ", "), "\n", sep = "")
cat(describe_pet(p), "\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