18 agosto, 2021
Java
, C++
, Python
) podem ficar confusos com a ideia de classe no sistema S3class
em um objeto. Pronto, criado a instância dessa classe# 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"
# 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
# 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"
# 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"
# 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"
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!
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"
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;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!
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
# 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
# Imprimindo o despacho do objeto associado a 'y' sloop::s3_dispatch(print(y))
## print.matrix ## print.integer ## print.numeric ## => print.default
Wickham, Hadley. 2019. Advanced R. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. https://adv-r.hadley.nz/.