Métodos para Objetos Integrados
Parte da seção Programação Orientada a Objetos do Journey de R da Coddy. Lição 28 de 57.
setMethod() também adiciona métodos S4 a funções base, como length() e summary(). A função base continua funcionando para todo o resto, e sua classe obtém seu próprio comportamento:
setClass("Playlist", slots = c(name = "character", songs = "character"))
setMethod("length", "Playlist", function(x) length(x@songs))
pl <- new("Playlist", name = "gym", songs = c("a", "b", "c"))
print(length(pl))
print(length(c(1, 2)))Saída:
[1] 3
[1] 2Os operadores também são genéricos. Um método para + nomeia as classes de ambos os lados em uma signature(). Os dois argumentos são chamados de e1 e e2:
setClass("Money", slots = c(amount = "numeric"))
setMethod("show", "Money", function(object) cat(sprintf("%.2f", object@amount), "\n"))
setMethod("+", signature("Money", "Money"), function(e1, e2) {
new("Money", amount = e1@amount + e2@amount)
})
new("Money", amount = 2.5) + new("Money", amount = 4)Saída:
6.50 O genérico de grupo Arith representa +, -, *, /, ^ e todos os demais de uma só vez. Dentro de seu método, callGeneric() repete qualquer operador usado, nos valores que você passar:
setClass("Money", slots = c(amount = "numeric"))
setMethod("Arith", signature("Money", "numeric"), function(e1, e2) {
new("Money", amount = callGeneric(e1@amount, e2))
})
m <- new("Money", amount = 10)
cat((m * 3)@amount, (m / 4)@amount, (m - 1)@amount)Saída:
30 2.5 9O genérico de grupo Compare abrange ==, <, > e os demais. Seu método retorna o que callGeneric() retorna para os slots, um valor lógico:
setClass("Money", slots = c(amount = "numeric"))
setMethod("Compare", signature("Money", "Money"), function(e1, e2) {
callGeneric(e1@amount, e2@amount)
})
a <- new("Money", amount = 5)
b <- new("Money", amount = 8)
cat(a < b, a == b, a >= b)Saída:
TRUE FALSE FALSEDesafio
FácilA classe Money em Money.R tem os slots amount (numérico) e currency (caractere). Adicione quatro métodos:
show()imprime12.50 EURe uma nova linha;+para dois objetosMoneyretorna a soma deles ou interrompe comcannot add EUR and USD(usecall. = FALSE) quando as moedas forem diferentes;*paraMoneye um número retorna o valor escalado;==para dois objetosMoneyéTRUEquando amount e currency forem ambos iguais.
O código fornecido lê linhas como 10:EUR + 2.5:EUR, 4:USD * 3 ou 1:EUR == 1:EUR e imprime o resultado ou error: e a mensagem.
Seu código deve ficar em Money.R. main.R contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
source("Money.R")
# Código de entrada/saída fornecido: mantenha-o como está
input <- suppressWarnings(readLines(file("stdin")))
parse_money <- function(t) {
p <- strsplit(t, ":")[[1]]
new("Money", amount = as.numeric(p[1]), currency = p[2])
}
for (line in input) {
p <- strsplit(line, " ")[[1]]
a <- parse_money(p[1])
tryCatch({
if (p[2] == "+") print(a + parse_money(p[3]))
if (p[2] == "*") print(a * as.numeric(p[3]))
if (p[2] == "==") cat(a == parse_money(p[3]), "\n", sep = "")
}, error = function(e) cat("error: ", conditionMessage(e), "\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 Livros3Herança S3
Vetores de classeOrdem de busca de métodosEstendendo com NextMethodVerificando com inherits()Revisão - Folha de pagamento da equipe6S4 Genéricos e Métodos
Criando GenéricosMétodos para Objetos IntegradosDespacho em Dois ArgumentossetValidity e validObjectRevisão - Dinheiro e MoedaPratique por conta própria: Compilador de R online