1  Entendendo a coleção Estudando o ambiente R

Todos os exercícios resolvidos desse material se baseiam no livro R Básico (Batista e Oliveira, 2022).

1.1 Descrição sobre os exercícios

A ideia dos exercícios deste capíyoututulo foi nortear o leitor aos problemas que podem ser deparados quando se estuda o . Desse modo, para leitores que conseguem resolver todos os exercícios deste capítulo, entendendo a profundidade do problema, poderá avançar na leitura dos próximos volumes da coleção Estudando o Ambiente R.

1.2 Objetivo

Foram realizados exercícios envolvendo todos os temas dos 11 capítulos. O objetivo é fazer com que o leitor realize os exercícios e veja se domina os temas abordados no livro. Caso a resolução seja realizada com facilidade, não será necessário fazer toda a leitura do livro, para que haja uma melhor otimização de estudo a coleção Estudando o Ambiente R.

1.3 Assuntos abordados

Os principais assuntos abordados deste capítulo são:

  • Princípios do R: (Exercício 1.6)
    • Objeto
    • Função
    • Interface (Exercícios 1.19, 1.20)
  • Pacotes:
    • anexar pacotes (Exercícios 1.1, 1.4)
    • carregar pacotes (Exercício 1.1)
    • NAMESPACE (Exercício 1.3)
    • funções internas de um pacote (Exercício 1.4)
  • Ambientes:
    • superatribuição (Exercícios 1.2, 1.6)
    • caminho de busca (Exercício 1.4)
    • ambiente envolvente (Exercícios 1.9,1.10)
    • ambiente de chamada (Exercícios 1.9, 1.10)
    • ambiente de execução (Exercícios 1.10)
  • Objetos: (Exercício 2.5)
    • atribuição (Exercícios 1.5, 1.15)
    • lista (Exercício 1.17)
    • ambiente (Exercício 2.3)
    • atributos (Exercício 2.1)
      • intrínseco (Exercício 2.1)
      • class (Exercício 2.1)
  • Estrutura de dados: (Exercício 2.5)
    • vetor (Exercício 1.15)
    • matriz (Exercício 1.15)
    • array (Exercício 1.15)
    • quadro de dados (data frame) (Exercício 1.17)
  • Funções:
    • anônima (Exercício 1.8)
    • chamada de função (Exercício 1.15)
    • escopo (Exercício 2.3)
      • léxico (Exercício 1.16)
    • função print()(Exercício 2.4)
  • Como R trabalha:
    • script (Exercícios 1.7, 1.16)
    • linhas de comando (Exercícios 1.5, 1.11, 2.4)
    • comentar um código (Exercício 1.13)
    • RStudio (Exercício 1.14)
    • arquivos .Rhistory e .RData (Exercício 2.2)
    • console (Exercício 2.4)

1.4 Abordagem didática

Os exercícios foram criados sem ordenarmos os assuntos de acordo com os capítulos, para que houvesse conexão de tópicos diferentes na sequência dos exercícios.

Daremos algumas estratégias para um estudo aprofundado:

  1. Estudar profundamente o assunto abordado em Batista e Oliveira (2022);
  2. Crie um resumo do assunto (Sugestão):
    1. Mapa mental;
    2. Resumo de Cornell;
  3. Criar estratégias de solução simples;
  4. Aprofundar estratégias mais elaboradas, sempre que possível;
  5. Procurar escrever as soluções por meio do código R, sempre que possível;
  6. Comentar o código.

1.5 Exercícios

Exercício 1.1
Qual a diferença entre anexar e carregar um pacote?

Solução do exercício

I) Complemento de leitura:

Como sugestão, recomendamos a leitura do Capítulo 8 (Batista e Oliveira, 2022), R CORE TEAM (2022) e Wickham (2015).

II) Discussão:

Dois termos muito confundidos no R são: carregar e anexar um pacote. O primeiro termo como o próprio nome sugere, representa a ação de carregar todas as funções, conjunto de dados de um referido pacote. Porém, a nível de usuário, esses objetos não estão disponíveis diretamente, a menos que se use o operador “::”. Para que os objetos de um pacote estejam disponíveis ao usuário, o pacote deve ser anexado, isto é, inserido no caminho de busca (Batista e Oliveira, 2022, p. 247). Por exemplo, quando usamos as funções library() ou require(), estamos sequencialmente carregando e anexando ao caminho de busca o referido pacote. De outro modo, quando anexamos um pacote obrigatoriamente ocorre o carregamento, e posteriormente a anexação ao caminho de busca. Assim, após esta ação, o usuário simplesmente digita o nome de uma determinada função no prompt de comando, sem necessidade de referenciar o nome do pacote anexado (usando o operador ::). Portanto, quando usamos as funções library() ou , dizemos que ``anexamos um pacote’‘, e não’‘carregamos o pacote’’.

Complementando o que foi discutido anteriormente, Wickham (2015) afirma que:

  • O carregamento irá carregar o código, dados e quaisquer DLLs1, registra os métodos S3 e S4, e executa a função .onLoad(). Após isso, o pacote fica disponível na memória virtual, mas não acessível no caminho de busca. Daí o usuário não terá como acessar os objetos do pacote diretamente, a menos que use ::, isto é, nome_pacote::nome_função; que por sua vez, o operador :: realiza o carregamento do pacote, se ainda não estiver carregado, e posteriormente, acessa os objetos sem estarem anexados. É bom lembrar que o operador :: não acessa os objetos pelo ambiente package:nome_pacote no caminho de busca, até porque o pacote pode ainda nem ter sido anexado. É muito raro precisar de carregar um pacote explicitamente, a menos que seja necessário saber internamente no seu pacote, se determinado pacote foi carregado2. Caso também seja do interesse acessar funções internas não exportáveis do pacote, podemos usar o operador :::;
  • Anexar um pacote significa colocá-lo no caminho de busca. Não é possível anexar um pacote sem primeiro tê-lo carregado, que no caso representa usar uma das funções library() ou require().

III) Usando o R:3

# Chamando uma funcao sem anexar o pacote 'tcltk'
tktoplevel()
Error in tktoplevel(): não foi possível encontrar a função "tktoplevel"
# Chamando tktoplevel() apenas por '::' (Carregando!)
tcltk::tktoplevel()
$ID
[1] ".1"

$env
<environment: 0x583ed124cab8>

attr(,"class")
[1] "tkwin"
# Anexando o pacote ao caminho de busca
search() # Verificando o caminho de busca
[1] ".GlobalEnv"        "package:stats"     "package:graphics" 
[4] "package:grDevices" "package:utils"     "package:datasets" 
[7] "package:methods"   "Autoloads"         "package:base"     
# Observe que nao existe o ambiente de pacote 'package:tcltk'
library(tcltk)
search() # Verificando o caminho de busca novamente
 [1] ".GlobalEnv"        "package:tcltk"     "package:stats"    
 [4] "package:graphics"  "package:grDevices" "package:utils"    
 [7] "package:datasets"  "package:methods"   "Autoloads"        
[10] "package:base"     
# Agora se observa 'package:tcltk'
tktoplevel() # Chamando sem necessidade de referenciar 'tcltk'
$ID
[1] ".2"

$env
<environment: 0x583ed14567c8>

attr(,"class")
[1] "tkwin"

Exercício 1.2
Por que a superatribuição <<- deve ser usada com cautela, principalmente quando se está desenvolvendo funções para um pacote?

Solução do exercício
Isso é uma prova!

Exercício 1.3
Qual a importância da estrutura NAMESPACE em um pacote?

Solução do exercício
Isso é uma prova!

Exercício 1.4
Por que devemos usar com cautela as funções internas não exportáveis, de um pacote? Como acessá-las? Como usamos uma função de um pacote sem anexá-lo ao caminho de busca? Por que esta última condição é mais interessante, quando se deseja utilizar poucas funções de um pacote?

Solução do exercício
Isso é uma prova!

Exercício 1.5

Quantos objetos temos na linha de comando a seguir?

x <- 10

Solução do exercício
Isso é uma prova!

Exercício 1.6
Quais os três princípios do R? Identifique-os em termos de linhas de comandos criadas em R.

Solução do exercício
Isso é uma prova!

Exercício 1.7
Como salvamos um script? Qual a importância de um script?

Solução do exercício
Isso é uma prova!

Exercício 1.8
O que são funções anônimas?

Solução do exercício
Isso é uma prova!

Exercício 1.9
Podemos afirmar que sempre o ambiente envolvente e ambiente de chamada são ambientes iguais?

Solução do exercício
Isso é uma prova!

Exercício 1.10
Considerando os ambientes envolvente, de execução e de chamada, qual dos três é um ambiente temporário? E quando este ambiente é criado?

Solução do exercício
Isso é uma prova!

Exercício 1.11
Baseado na linha de comando: x <- 1, por que não podemos afirmar que “x recebe o valor 1”?

Solução do exercício
Isso é uma prova!

Exercício 1.12
Como importamos um banco de dados externo do ambiente R? E como exportamos um resultado desejado?

Solução do exercício
Isso é uma prova!

Exercício 1.13
Por que comentar um código é muito importante para um programador?

Solução do exercício
Isso é uma prova!

Exercício 1.14
Precisamos ter o RStudio para utilizar o ambiente R?

Solução do exercício
Isso é uma prova!

Exercício 1.15
Podemos dizer que uma matriz ou array é um vetor? Se sim, o que os diferenciam?

Solução do exercício
Isso é uma prova!

Exercício 1.16

Considerando o script abaixo:

# Criando um nome "n" associado a um objeto 10
n <- 10
f1 <- function() {
  print(n) # Imprimindo "n"
  n <- 15 # Criando "n" no corpo da funcao
  print(n) # Imprimindo n
}
f1(); n # Imprimindo "f1" e "n"

Solução do exercício
Isso é uma prova!

Exercício 1.17
Podemos afirmar que um data frame é uma lista? Justifique.

Solução do exercício
Isso é uma prova!

Exercício 1.18
Qual a importância de uma boa escrita de um código?

Solução do exercício
Isso é uma prova!

Exercício 1.19
Por que o tem como um de seus princípios em sua origem, o princípio da interface?

Solução do exercício
Isso é uma prova!

Exercício 1.20
Quais os pacotes R dão suporte como uma interface para as linguagens: Python, Julia, C/C++, FORTRAN, HTML e Java? Quais outros pacotes existem no como uma interface para outras linguagens?

Solução do exercício
Isso é uma prova!

Exercício 1.21
O que representa os atributos para um objeto? Quais os dois atributos intrínsecos de um objeto? Qual a importância do atributo class para um objeto?

Solução do exercício
Isso é uma prova!

Exercício 1.22
Para que serve os arquivos .RData e .Rhistory? Apresente exemplos práticos sobre o uso desses arquivos.

Solução do exercício
Isso é uma prova!

Exercício 1.23
Qual a relação existente entre o escopo de uma função e os objetos do tipo ambiente (environment)?

Solução do exercício
Isso é uma prova!

Exercício 1.24
Como provamos que a função print() está implícita quando executamos uma linha de comando no console?

Solução do exercício
Isso é uma prova!

Exercício 1.25
Qual a diferença entre estrutura de dados e tipo de objetos no ambiente R?

Solução do exercício
Isso é uma prova!


  1. Do inglês, Dynamic Link Library, isto é, um arquivo (biblioteca de vínculo dinâmico) contendo código e dados, do qual estas informações podem ser utilizadas por mais de um programa ao mesmo tempo.↩︎

  2. Nesse caso, não se recomenda utilizar library() ou require() para essa finalidade. Para isso, devemos usar as funções requireNamespace() ou loadNamesoace(), ou inserirmos os pacotes dependentes nos campos Depends, Imports, ou em Sugests no arquivo DESCRIPTION.↩︎

  3. Por questão de estética do código, simplificamos a representação dos ambientes de pacote de package:<nome\_pacote> para pack:<nome\_pacote>.↩︎