19 agosto, 2021
closure
generic.class()
generic
: nome da função genéricaclass
: nome da classe# Funcao generica (ou generico) quem <- function(x) UseMethod("quem") # Objeto pessoa <- "ben" # Atribuindo classe ao objeto 'pessoa' class(pessoa) <- "eh" ## Metodo quem.eh <- function(x) print("Sou eu!")
'...'
;# Objeto pessoa <- "ben" # Atribuindo classe ao objeto 'pessoa' class(pessoa) <- "eh" ## Metodo 'eh' quem.eh <- function(x) print("Sou eu!") ## Metodo 'padrao' quem.default <- function(x, y) print("??") #----------------------------------------- # Aplicacao: pessoa <- "ben" # objeto sem atributo 'class' # Usando a funcao generica quem(pessoa) # Aplicando o metodo padrao
## [1] "??"
#-------- class(pessoa) <- "eh" quem(pessoa) # Aplicando o metodo eh
## [1] "Sou eu!"
UseMethod
: argumento object
e omissão do método padrão# Funcao generica quem <- function(y) UseMethod("quem", x) # Metodos quem.eh <- function(y) print("Sou eu!") quem.outro <- function(y) print("Outro!") quem.default <- function(y) print("Qualquer um!") # Objeto em UseMethod sem o atributo 'class' x <- "ben" # Objeto no primeiro argument de fgenerica y <- "ninguem" class(y) <- "outro" # O despacho ocorre em quem.default quem(y)
## [1] "Qualquer um!"
UseMethod
: argumento object
e omissão do método padrão# Funcao generica quem <- function(y) UseMethod("quem", x) # Metodos quem.eh <- function(y) print("Sou eu!") quem.outro <- function(y) print("Outro!") quem.default <- function(y) print("Qualquer um!") # Objeto em UseMethod sem o atributo 'class' x <- "ben" # Objeto no primeiro argument de fgenerica y <- "ninguem" class(y) <- "outro" # Removendo quem.defaul, a fgenerica retorna erro rm("quem.default"); quem(y)
## Error in UseMethod("quem", x): método não aplicável para 'quem' aplicado a um objeto de classe "character"
UseMethod()
foge do padrão das chamadas de função no R# Funcao (Primeiro caso) h <- function(x, y) { x <- 10 y <- 10 c(x = x, y = y) } x <- 1 y <- 1 h(x, y)
## x y ## 10 10
UseMethod()
foge do padrão das chamadas de função no R# Funcao generica e metodo (Segundo caso) g <- function(x, y) { x <- 10 y <- 10 UseMethod("g") } # metodo padrao g.default <- function(x, y) c(x = x, y = y) # Avaliacao x <- 1 y <- 1 g(x, y)
## x y ## 1 1
UseMethod()
foge do padrão das chamadas de função no R# Funcao generica e metodo (Terceiro caso) g <- function(x) { x <- 10 y <- 10 UseMethod("g") } # metodo padrao g.default <- function(x) c(x = x, y = y) # Avaliacao x <- 1 y <- 1 g(x)
## x y ## 1 10
UseMethod()
foge do padrão das chamadas de função no R# Funcao generica e metodo (Quarto caso) g.default <- function(x) c(x = x, y = y) # Avaliacao x <- 1 y <- 1 g.default(x)
## x y ## 1 1
print
como exemplo# Objeto classe 'comp' x <- 1:10; class(x) <- "comp" # Metodo 'comp' print.comp <- function(x) { x <- unclass(x) cat("O comprimento de ", x, " eh ", length(x)) } # Aplicacao print(x) # Metodo 'comp'
## O comprimento de 1 2 3 4 5 6 7 8 9 10 eh 10
print(unclass(x)) # Metodo 'defaut'
## [1] 1 2 3 4 5 6 7 8 9 10
utils::methods()
sloop::s3_methods_generic()
sloop::s3_methods_class()
# Usando o nome da funcao generica # utils::methods(print) ## [1] print.acf* ## [2] print.AES* ## [3] print.all_vars* ## [4] print.anova* ## [5] print.ansi_string* ## [6] print.ansi_style* ## ... # Usando agora a funcao s3_methods_generic sloop::s3_methods_generic("print")[1:6,]
## # A tibble: 6 x 4 ## generic class visible source ## <chr> <chr> <lgl> <chr> ## 1 print acf FALSE registered S3method ## 2 print AES FALSE registered S3method ## 3 print anova FALSE registered S3method ## 4 print aov FALSE registered S3method ## 5 print aovlist FALSE registered S3method ## 6 print ar FALSE registered S3method
# Usando o nome da funcao generica utils::methods(class = factor) # Imprimindo os primeiros metodos para a classe 'factor'
## [1] [ [[ [[<- [<- all.equal ## [6] as.character as.data.frame as.Date as.list as.logical ## [11] as.POSIXlt as.vector c coerce droplevels ## [16] format initialize is.na<- length<- levels<- ## [21] Math Ops plot print relevel ## [26] relist rep show slotsFromS3 summary ## [31] Summary xtfrm ## see '?methods' for accessing help and source code
# Usando agora a funcao s3_methods_generic sloop::s3_methods_class("factor")
## # A tibble: 28 x 4 ## generic class visible source ## <chr> <chr> <lgl> <chr> ## 1 [ factor TRUE base ## 2 [[ factor TRUE base ## 3 [[<- factor TRUE base ## 4 [<- factor TRUE base ## 5 all.equal factor TRUE base ## 6 as.character factor TRUE base ## 7 as.data.frame factor TRUE base ## 8 as.Date factor TRUE base ## 9 as.list factor TRUE base ## 10 as.logical factor TRUE base ## # ... with 18 more rows