28 agosto, 2021
## Primeiro argumento do generico x <- 1:10 ## Ideia sobre os potenciais metodos (UseMethod) paste0("generic", ".", c(class(x), "default"))
## [1] "generic.integer" "generic.default"
# Instalar o pacote 'sloop', se nao tiver! # Objeto de classe 'data.frame' x <- data.frame() # Despacho (envio) do generico 'print' sloop::s3_dispatch(print(x))
## => print.data.frame ## * print.default
O resultado da chamada sloop::s3_dispatch()
pode apresentar três símbolos antes dos potenciais nomes de métodos:
=>
: este símbolo indica que a função genérica despachou no referido método;*
: este símbolo indica que este método existe, mas a função genérica não despachou nele;->
: indica o método herdado;# Funcao generica quem_sou_eu <- function(x, ...) UseMethod("quem_sou_eu") # Metodo numero natural quem_sou_eu.numero_natural <- function(x, ...){ message("Eu sou um numero natural") NextMethod("quem_sou_eu") } # Metodo numerico quem_sou_eu.numerico <- function(x, ...) message("Eu sou numerico") # Objeto x <- 1:10 # Classe class(x) <- c("numero_complexo","numero_natural","numerico") # Despacho sloop::s3_dispatch(quem_sou_eu(x))
## quem_sou_eu.numero_complexo ## => quem_sou_eu.numero_natural ## -> quem_sou_eu.numerico ## quem_sou_eu.default
# Eh primitiva generica? sloop::is_s3_generic("cbind")
## [1] TRUE
# Onde ocorre o despacho? sloop::s3_dispatch(cbind(1:10))
## cbind.integer ## cbind.numeric ## cbind.default ## => cbind (internal)
# Objeto de classe factor x <- factor(1:5) # Verificando o despacho de sqrt() do grupo 'Math' sloop::s3_dispatch(sqrt(x))
## sqrt.factor ## sqrt.default ## => Math.factor ## Math.default ## * sqrt (internal)
# Verificando o metodo Math.factor() Math.factor
## function (x, ...) ## stop(gettextf("%s not meaningful for factors", sQuote(.Generic))) ## <bytecode: 0x0000000006b11328> ## <environment: namespace:base>