Métodos padrão
Parte da seção Programação Orientada a Objetos do Journey de R da Coddy. Lição 8 de 57.
Quando nenhum método corresponde à classe, UseMethod() procura o método padrão, name.default. Ele é o fallback para todas as classes que o genérico não conhece:
describe <- function(x) UseMethod("describe")
describe.dog <- function(x) paste("a dog called", x$name)
describe.default <- function(x) "something I do not know"
rex <- structure(list(name = "Rex"), class = "dog")
car <- structure(list(), class = "car")
print(describe(rex))
print(describe(car))Saída:
[1] "a dog called Rex"
[1] "something I do not know"Sem um método padrão, chamar o genérico em uma classe desconhecida termina com um erro:
describe <- function(x) UseMethod("describe")
describe.dog <- function(x) paste("a dog called", x$name)
car <- structure(list(), class = "car")
describe(car)Saída:
Error in UseMethod("describe") :
no applicable method for 'describe' applied to an object of class "car"
Calls: describe
Execution haltedValores simples também fazem despacho. Um número sem um atributo de classe tem a classe implícita numeric, texto tem character, e TRUE tem logical, portanto métodos com esses nomes funcionam em vetores comuns:
describe <- function(x) UseMethod("describe")
describe.numeric <- function(x) paste("numbers adding up to", sum(x))
describe.character <- function(x) paste("words:", paste(x, collapse = " "))
describe.default <- function(x) "something else"
print(describe(c(1, 2, 3)))
print(describe(c("a", "b")))
print(describe(TRUE))Saída:
[1] "numbers adding up to 6"
[1] "words: a b"
[1] "something else"Um método padrão também pode recusar educadamente: stop() com uma mensagem que nomeia a classe, para que quem chamou saiba o que deu errado. class(x)[1] é a primeira classe do objeto:
area <- function(shape) UseMethod("area")
area.square <- function(shape) shape$side^2
area.default <- function(shape) {
stop("cannot compute the area of a ", class(shape)[1], call. = FALSE)
}
for (s in list(structure(list(side = 2), class = "square"), structure(list(), class = "blob"))) {
cat(tryCatch(area(s), error = function(e) conditionMessage(e)), "\n")
}Saída:
4
cannot compute the area of a blob Desafio
FácilComplete a função genérica describe(x) em Describe.R e seus métodos para vetores simples:
describe.numeric()retorna3 numbers, sum 6.describe.character()retorna2 words, longest: apple(a primeira das palavras mais longas em caso de empate).describe.logical()retorna2 of 3 are TRUE.describe.default()retornasomething else.
O código fornecido lê linhas num 1,2,3, chr apple,kiwi, lgl TRUE,FALSE,TRUE ou qualquer outra palavra com valores, que ele transforma em uma lista. Ele imprime describe() para cada uma.
Seu código deve ficar em Describe.R. main.R contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
source("Describe.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]]
values <- strsplit(p[2], ",")[[1]]
x <- switch(p[1],
num = as.numeric(values),
chr = values,
lgl = as.logical(values),
list(values))
cat(describe(x), "\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