18 agosto, 2021

Selo DC

Revisando

A ideia de classe em POO no R (Sistema S3)

  • Os usários de outras linguagens (Java, C++, Python) podem ficar confusos com a ideia de classe no sistema S3
  • Simplesmente, sua definição é o atributo class em um objeto. Pronto, criado a instância dessa classe

Criando o atributo class aos objetos

# Objeto
(x <- 1:10)
##  [1]  1  2  3  4  5  6  7  8  9 10
# Inserindo atributos em um objeto (1ª Forma)
attr(x,"dim") <- c(2, 5) # 1º Atributo 'dim'
attr(x,"class") <- "ben" # 2º Atributo 'ben'
attr(x,"nada") <- "1"  # 3º Atributo 'nada'

# Visualizar os atributos em x
attributes(x)
## $dim
## [1] 2 5
## 
## $class
## [1] "ben"
## 
## $nada
## [1] "1"

Criando o atributo class aos objetos

# Eliminando um determinado atributo ('nada')
attr(x,"nada") <- NULL # Remove atribuindo 'NULL'

# Visualizar os atributos em x, sem o atributo 'nada'
attributes(x)
## $dim
## [1] 2 5
## 
## $class
## [1] "ben"
# Eliminar todos os atributos
attributes(x) <- NULL

# Visualizando x sem atributos
attributes(x)
## NULL

Criando o atributo class aos objetos

# Inserindo os atributos todos de uma vez
mostattributes(x) <- list(dim = c(2, 5), class = "ben", nada = "1")

# Verificando se um objeto apresenta determinado atributo, por exemplo, class='nada'
inherits(x, "nada")
## [1] FALSE
# Outra forma de inserir mais de um atributo
(x <- structure(1:10, dim = c(2, 5), class = "ben", nada = "1"))
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8   10
## attr(,"class")
## [1] "ben"
## attr(,"nada")
## [1] "1"

Criando o atributo class aos objetos

# Casos especificos, podem ter funcoes proprias
# para inserir atributos, por exemplo, 'class'
attr(x,"class") <- NULL; attributes(x) # removendo o atributo 'class'
## $dim
## [1] 2 5
## 
## $nada
## [1] "1"
class(x) <- "ben"; attributes(x)
## $dim
## [1] 2 5
## 
## $nada
## [1] "1"
## 
## $class
## [1] "ben"

Nomes para as classes

  • Evitar ponto (“.”) no nome das classes
  • Em pacotes, usem a classe como o nome do pacote
  • seguir as regras básicas de nomes no R (Módulo Básico)

Características do atributo Class

  • Pode ser um vetor de caracteres
# Objeto e sua classe
x <- ordered(1:5)
class(x)
## [1] "ordered" "factor"
# Observando os atributos do objeto
attributes(x)
## $levels
## [1] "1" "2" "3" "4" "5"
## 
## $class
## [1] "ordered" "factor"
  • responsável pelo mecanismos de herança

A função class() não é a melhor escolha

  • Uso da função class()
# Objeto e sua classe
y <- array(1:3, c(2,4))
class(y)
## [1] "matrix" "array"
# Observando os atributos do objeto
attributes(y)
## $dim
## [1] 2 4

OBS.: Observe que não há o atributo class no objeto y.

IMPORTANTE!

Dizemos que esses objetos apresentam classes implícitas!

Melhor escolha para verificar as classes e classes implícitas

  • usando sloop::s3_class() e .class2()
y <- array(1:3, c(2,4))
sloop::s3_class(y)
## [1] "matrix"  "integer" "numeric"
.class2(y)
## [1] "matrix"  "array"   "integer" "numeric"

Classes implícitas

Segundo Wickham (2019), a classe implícita, obtida de objetos base, apresenta um vetor de três conjuntos de caracteres (strings):

  • array ou matrix, se o objeto tiver dimensão;
  • resultado de typeof, com algumas variações;
  • numeric, se os valores forem integer (inteiro) ou double (real).

IMPORTANTE!

A importância disso é o despacho de método!

Entendimento básico sobre o despacho ou envio de método

y <- array(1:3, c(2,4))
# Imprimindo o despacho do objeto associado a 'y'
sloop::s3_dispatch(print(y))
##    print.matrix
##    print.integer
##    print.numeric
## => print.default

A função class pode enganar o despacho

# Objeto com classe implícita (sem atributo 'class')
w <- 1
# Imprimindo class
class(w)
## [1] "numeric"
# Verificando o despacho em 'print'
sloop::s3_dispatch(print(w))
##    print.double
##    print.numeric
## => print.default

Pseudoclasse generic.default

# Imprimindo o despacho do objeto associado a 'y'
sloop::s3_dispatch(print(y))
##    print.matrix
##    print.integer
##    print.numeric
## => print.default

Bons estudos!

Referências