Básico 2024 | Aula 08

Objetos e estruturas de dados

Encarte

Filosofia de publicação (Selo DC)

Apoio CEAC e UFSJ

Livro de Apoio

Usaremos Batista e Oliveira (2022):

Retornando a afirmação de John Chambers

Princípio do Objeto: Tudo que existe em R é um objeto

O que é um objeto?

Objeto: uma entidade no ambiente R com características internas contendo informações necessárias para interpretar sua estrutura e conteúdo

Metadado de um objeto?


  • Atributos
    • Atributos intrínsecos: modo e comprimento

Estrutura de um objeto

Estrutura de um objeto: Disposição como armazenamos um objeto na memória virtual do computador e a forma como apresentamos este objeto a nível de usuário. O primeiro é chamado de estrutura interna, e o segundo, estrutura externa.

  • Estrutura interna: tipagem
  • Estrutura externa: estrutura de dado

Estrutura de um objeto

  • Estrutura interna: tipagem
    • Existem 24 tipos de objetos em R;
    • Só podem ser criados pelos mantenedores do R (R Core Team);
    • Usamos typeof() para tipagem C; e
    • Usamos mode() para tipagem S

Estrutura de um objeto

  • Estrutura externa: estrutura de dados
    • Existem muitos tipos de estrutura de dados;
      • Exemplos: Vetor, matriz, quadro de dados (data frame), tibles, etc;
    • Podem ser criados a nível de usuário

Estrutura de um objeto

Código R 4.5 (Batista e Oliveira, 2022, p. 51)

# Criando um vetor
x <- vector()
# Verificando o tipagem C
typeof(x)
[1] "logical"
# Verificando o tipagem S
mode(x)
[1] "logical"
# Inspecionando o objeto
.Internal(inspect(x))
@5e7f7d8b8a20 10 LGLSXP g0c0 [REF(2)] (len=0, tl=0)

Associando o nome a um objeto

Exemplo:

> x <- 10L

Associando o nome a um objeto

  • Comandos de atribuição
  • Use: <-, isto é, “<” + “-
  • Evite: =, use apenas para definir argumentos em uma função

Precedência superior de “<-” sobre “=

x <- y = 6
Error in x <- y = 6: não foi possível encontrar a função "<-<-"
x = y <- 6; x; y
[1] 6
[1] 6
  • Nomes sintáticos e nomes não sintáticos;

Nomes sintáticos e não sintáticos

  • Deve consistir em letras, dígitos, . e _;
  • Os nomes devem ser iniciado por uma letra ou um ponto não seguido de um número, isto é, Ex.: .123, 1n, dentre outros;
  • As letras maiúsculas se distinguem das letras minúsculas;

Nomes sintáticos e não sintáticos

  • Não pode inicia por _ ou dígito, é retornado um erro no console caso isso ocorra;
  • Não pode usar qualquer uma das palavras reservadas pela linguagem, isto é, TRUE, FALSE, if, for, dentre outras, que pode ser consultado usando o comando ?Reserved().

Nomes sintáticos e não sintáticos

# Nome nao sintatico
.123 <- 50
## Error in 0.123 <- 50 : lado esquerdo da atribuicao inválida (do_set)

# Qual a sugestao de nome sintatico para '.123'?
make.names(.123)
[1] "X0.123"

Associando um nome ao objeto

> x <- 10 # Ou 10 -> x
> lobstr::obj_addr(x)
> # [1] "0xf8a104fc20"

Associando um nome ao objeto

> y <- x
> lobstr::obj_addr(y)
> # [1] "0xf8a104fc20"

Associando um nome ao objeto e ambiente global

Associando um nome ao objeto

> lobstr::obj_addr(x)
> # [1] "0xf8a104fc20"
> x <- 30
> lobstr::obj_addr(x)
> # [1] "0x42db6dbb50"

Atributos e Classes

  • atributos intrínsecos:
    • modo:
      • mode() baseado na linguagem S e
      • typeof() baseado na linguagem C
    • comprimento: length()
  • Demais atributos: attributes()
  • Classe: class() e sloop::s3_class() e atributo classe por attributes()

Atributo intrínseco de modo (Vetores)

> # Objeto modo caractere
> x <- "Ben"; mode(x)
[1] "character"
> # Objeto modo logico
> z <- TRUE; mode(z)
[1] "logical"
> # Objeto modo complexo
> w <- 1i; mode(w)
[1] "complex"

Atributo intrínseco de modo (Vetores)

> # Objeto modo numerico
> y <- 10L; mode(y); y2 <- 10; mode(y2)
[1] "numeric"
[1] "numeric"
> # y eh igual a y2? # y eh identico y2?
> y == y2; identical(y, y2)
[1] TRUE
[1] FALSE

Atributo intrínseco de modo (Vetores)

> # Objeto modo caractere
> x <- "Ben"; typeof(x)
[1] "character"
> # Objeto modo logico
> z <- TRUE; typeof(z)
[1] "logical"
> # Objeto modo complexo
> w <- 1i; typeof(w)
[1] "complex"

Atributo intrínseco de modo (Vetores)

> # Objeto modo numerico
> y <- 10L; typeof(y); y2 <- 10; typeof(y2)
[1] "integer"
[1] "double"
> # y eh igual a y2? # y eh identico y2?
> y == y2; identical(y, y2)
[1] TRUE
[1] FALSE

Resumo do modo em vetores atômicos

typeof mode
logical logical
integer numeric
double numeric
complex complex
character character
raw raw

Comprimento

> # Vetor de comprimento 5
> v1 <- 1:5
> # Vetor de comprimento 3
> v2 <- c("Ben", "Maria", "Lana")
> # Vetor de comprimento quatro
> v3 <- c(TRUE, FALSE, TRUE, TRUE)
> # Vejamos o comprimento dos vetores
> length(v1); length(v2); length(v3)
[1] 5
[1] 3
[1] 4

Comprimento

Resumo

Um resumo as funções mencionadas podem ser refletidas com as seguintes indagações:

  • base::class() e loop::c3_class(): Qual o tipo de objeto?
  • base::mode(): Qual o tipo de dados baseados na linguagem S?
  • base::typeof(): Qual o tipo de dados baseados na linguagem C?

Resumo

Um resumo as funções mencionadas podem ser refletidas com as seguintes indagações:

  • base::attributes(): O objeto tem atributos?
  • base::length(): Qual o comprimento do objeto? Sintaxe: pacote::nome_função()

Classes

  • Mecanismo da POO (Exemplos de tipos de classes)
  • numeric
  • logical
  • character
  • list
  • matrix
  • array
  • factor
  • data.frame

Classes e objetos

  • Nem tudo em R é orientado a objetos!
  • Nem todo resultado da função class() retorna diretamente uma classe relacionada ao paradigma POO

Coersão do R

> # Criando um objeto x e imprimindo o seu resultado
> x <- c("Nome", 3, 4, 5);x
[1] "Nome" "3"    "4"    "5"   

Coersão imposta pelo usuário

> # Objeto de modo numerico
> minha_idade <- 35; mode(minha_idade)
[1] "numeric"
> # Coersão do objeto para modo caractere (`string`)
> minha_idade <- as.character(minha_idade) 
> mode(minha_idade)
[1] "character"
> # Verificando se o objeto tem modo 'character'
> is.character(minha_idade)
[1] TRUE

Estrutura de dados

  • Vetores atômicos:
    • Lógicos, Numéricos e Caracteres;
    • Matrizes unidimensionais (Matrix) e multidimensionais (Arrays);
  • Vetores em listas:
    • Listas (Lists);
    • Quadro de dados (Data frames);

Existem outros, mas para esse módulo, exploraremos estes nas seções seguintes

Estrutura de dados

Estrutura de dado Classe ou classe implícita Modo São possíveis vários modos no mesmo objeto?
Vetor numeric (integer ou double), character, complex, logical, raw numeric (integer ou double), character, complex, logical, raw Não
Matriz matrix numeric (integer ou double), character, complex, logical, raw Não
Array array numeric (integer ou double), character, complex, logical, raw Não
lista list numeric (integer ou double), character, complex, logical, raw, expression, function Sim
Quadro de dados data.frame numeric (integer ou double), character, complex, logical, raw Sim

Obrigado

Sugestões, perguntas, críticas…

Referências

BATISTA, B. D. O.; OLIVEIRA, D. A. B. J. R básico. Ouro Branco, MG, Brasil: [s.n.], 2022.