4  Pacotes do R

Um dos grandes benefícios do uso do R é o seu acervo de pacotes gratuitos. O R tem em sua essência uma filosofia de colaboração. O CRAN é o repositório oficial do R e é onde pessoas do mundo inteiro disponibilizam seus códigos no formato de pacotes. E, mais importante, todos os pacotes são gratuitos, assim como o R. Por exemplo, considere um caso em que está interessado em baixar dados da internet sobre o desemprego histórico no Brasil. Para isso, basta procurar e instalar o pacote específico que realiza esse procedimento.

Os pacotes podem ser instalados de diferentes fontes, com as principais sendo CRAN (The Comprehensive R Archive Network) e Github. A cada dia aumenta a quantidade e diversidade de pacotes existentes para o R. O próprio autor deste livro possui diversos pacotes disponíveis no CRAN, cada um para resolver algum problema diferente. Na grande maioria, são pacotes para importar e organizar dados financeiros.

O CRAN é o repositório público oficial do R e, atualmente, contém 20631 pacotes disponíveis para a comunidade. Todo código do CRAN passa por um processo de avaliação onde normas rígidas devem ser respeitadas. Para quem tiver interesse, um tutorial claro e fácil de seguir é apresentado no site < https://r-pkgs.org/ >. As regras completas estão disponíveis no site do CRAN. A adequação do código a essas normas é responsabilidade do desenvolvedor e gera um trabalho significativo, principalmente na primeira submissão.

Como procurar um pacote na internet

Uma maneira prática de verificar a existência ou não de um pacote é carregar a página de pacotes do CRAN e, no seu navegador de internet, procurar (control + f nos principais navegadores ) a palavra-chave que define a sua busca. Caso existir o pacote com a palavra-chave, a procura acusará o encontro do termo na descrição do pacote. Outra fonte importante para o encontro de pacotes é o Task Views, em que são destacados os principais pacotes de acordo com a área e o tipo de uso.

O Github é um repositório de códigos na internet e também pode ser usado para instalar pacotes do R. Porém, ao contrário do CRAN, o Github não possui restrição ou controle quanto ao código enviado. A responsabilidade de uso é sempre do próprio usuário. Na prática, é muito comum os desenvolvedores de pacotes manterem uma versão em desenvolvimento no Github e outra oficial no CRAN. Quando a versão em desenvolvimento atinge um estágio de maturidade, a mesma é enviada ao CRAN. O mais interessante no uso de pacotes é que estes podem ser acessados e instalados diretamente no R via a internet.

Para saber qual é a quantidade atual de pacotes no CRAN, digite e execute os seguintes comandos no prompt:

# find current available packages
df_cran_pkgs <- available.packages()

# get size of matrix
n_cran_pkgs <- nrow(df_cran_pkgs)

# print it
print(n_cran_pkgs)
R> [1] 20631

Conforme saída do código, 2024-04-29 08:12:14.32135, existem 20631 pacotes disponíveis nos servidores do CRAN. O objeto df_cran_pkgs contém uma tabela com todas as informações dos pacotes. Caso esteja curioso, basta executar View(df_cran_pkgs) para visualizar a tabela no Rstudio. Também se pode verificar a quantidade de pacotes localmente instalados com o comando installed.packages():

# get number of local (installed) packages
n_local_pkgs <- nrow(installed.packages())

# print it
print(n_local_pkgs)
R> [1] 473

Nesse caso, o computador em que o livro foi escrito possui 473 pacotes do R instalados. Note que, apesar do autor ser um experiente programador do R, apenas uma pequena fração do pacotes disponíveis no CRAN está sendo usada!

4.1 Instalando Pacotes do CRAN

Para instalar um pacote, basta utilizar o comando install.packages() . Como exemplo, vamos instalar um pacote que será utilizado nos capítulos futuros, o {readr} (Wickham, Hester, e Bryan 2024):

# install pkg readr
install.packages('readr')

Copie e cole este comando no prompt e pronto! O R irá baixar os arquivos necessários e instalar o pacote {readr} (Wickham, Hester, e Bryan 2024) e suas dependências. Após isto, as funções relativas ao pacote estarão prontas para serem usadas após o carregamento do módulo. Observe que definimos o nome do pacote na instalação como se fosse texto, com o uso das aspas ("). Caso o pacote instalado seja dependente de outros pacotes, o R automaticamente instala todos módulos faltantes. Assim, todos os requerimentos para o uso do respectivo pacote já estarão satisfeitos e tudo funcionará perfeitamente. É possível, porém, que um pacote tenha uma dependência externa. Como exemplo, pacote {quarto} (Allaire e Dervieux 2024) depende da existência de uma instalação do LaTex. Geralmente essa é anunciada na sua descrição e um erro é sinalizado na execução do programa quando o LaTex não é encontrado. Fique atento, portanto, a esses casos.

Aproveitando o tópico, sugiro que o leitor já instale todos os pacotes do {tidyverse} (Wickham 2023b) com o seguinte código:

# install pkgs from tidyverse
install.packages('tidyverse')

O {tidyverse} (Wickham 2023b) é um conjunto de pacotes voltados a data science e com uma sintaxe própria e consistente, voltada a praticabilidade. Verás que, em uma instalação nova do R, o {tidyverse} (Wickham 2023b) depende de uma grande quantidade de pacotes.

Uma maneira rápida de instalar pacotes

O RStudio consegue identificar pacotes que são necessários para um script em particular e pode facilitar a instalação de pacotes. O mesmo lê o código que está sendo editado na interface e procura por chamadas a função library() , require() e o uso de ::, tal como em dplyr::tibble(). Assim que encontra pacotes não instalados, ele apresenta um diálogo que permite instalar os pacotes faltantes. Assim, com um clique do mouse é possível instalar todas as dependências de um projeto no R. Veja um exemplo na Figura 4.1.

Figura 4.1: Auto-instalação de pacotes no RStudio

4.2 Instalando Pacotes do Github

Para instalar um pacote diretamente do Github, um dos pré-requisitos é o pacote {devtools} (Wickham et al. 2022), disponível no CRAN:

# install devtools
install.packages('devtools')

Após isto, utilize função devtools::install_github() para instalar um pacote diretamente do Github. Note que o símbolo :: indica que função install_github() pertence ao pacote {devtools}. Com esta particular sintaxe, não precisamos carregar todo o pacote para utilizar apenas uma função.

No exemplo a seguir instalamos a versão em desenvolvimento do pacote {ggplot2} (Wickham et al. 2024), cuja versão oficial também está disponível no CRAN:

# install ggplot2 from github
devtools::install_github("hadley/ggplot2")

Observe que o nome do usuário do repositório também é incluído. No caso anterior, o nome hadley pertence ao desenvolvedor principal do {ggplot2} (Wickham et al. 2024), Hadley Wickham. No decorrer do livro notará que esse nome aparecerá diversas vezes, dado que Hadley é um prolífico e competente desenvolvedor de diversos pacotes do R e do {tidyverse} (Wickham 2023b).

Cuidado

Um aviso aqui é importante. Os pacotes do github não são moderados. Qualquer pessoa pode enviar código para lá e o conteúdo não é checado. Nunca instale pacotes do github sem conhecer os autores. Apesar de improvável – nunca aconteceu comigo por exemplo – é possível que esses possuam algum código malicioso.

4.3 Carregando Pacotes

Dentro de uma rotina de pesquisa, utilizamos a função library() para carregar um pacote na nossa sessão do R. Ao fecharmos o RStudio ou então iniciar uma nova sessão do R, os pacotes são descarregados. Vale salientar que alguns pacotes, tal como o {base} (R Core Team 2023a) e o {stats} (R Core Team 2023b), são inicializados automaticamente a cada nova sessão. A grande maioria, porém, deve ser carregada no início dos scripts. Veja o exemplo a seguir:

# load dplyr
library(dplyr)

A partir disso, todas as funções do pacote estarão disponíveis para o usuário. Note que não é necessário utilizar aspas (") ao carregar o pacote. Caso utilize uma função específica do pacote e não deseje carregar todo ele, pode fazê-lo através do uso do símbolo especial ::, conforme o exemplo a seguir.

# call fct fortune() from pkg fortune
fortunes::fortune(10)
R> 
R> Overall, SAS is about 11 years behind R and S-Plus in
R> statistical capabilities (last year it was about 10 years
R> behind) in my estimation.
R>    -- Frank Harrell (SAS User, 1969-1991)
R>       R-help (September 2003)

Nesse caso, utilizamos a função fortunes::fortune() do próprio pacote {fortunes} (Zeileis 2016), o qual mostra na tela uma frase possivelmente engraçada escolhida do mailing list do R. Nesse caso, selecionamos a mensagem número 10. Se não tiver disponível o pacote, o R mostrará a seguinte mensagem de erro:

R> Error in library("fortune") : there is no package called "fortune"

Para resolver, utilize o comando install.packages("fortunes") para instalar o pacote no seu computador. Execute o código fortunes::fortune(10) no prompt para confirmar a instalação. Toda vez que se deparar com essa mensagem de erro, deves instalar o pacote que está faltando.

Outra maneira de carregar um pacote é através da função require() . Esta tem um comportamento diferente da função library() pois não emite erro se o pacote não estiver instalado. Usualmente, require() é utilizado dentro da definição de funções ou no teste do carregamento do pacote. Caso o usuário crie uma função customizada que necessite de procedimentos de um pacote em particular, o mesmo deve carregar o pacote no escopo da função. Por exemplo, veja o código a seguir, em que criamos uma função dependente do pacote {quantmod} (Ryan e Ulrich 2024):

my_fct <- function(x){
  require(quantmod)

  df <- getSymbols(x, auto.assign = F)
  return(df)
}

Nesse caso, a função quantmod::getSymbols() faz parte do pacote {quantmod} (Ryan e Ulrich 2024). Não se preocupe agora com a estrutura utilizada para criar uma função no R. Essa será explicada em capítulo futuro.

Cuidado!

Uma precaucão que deve sempre ser tomada quando se carrega um pacote é um possível conflito de funções. Por exemplo, existe uma função chamada filter() no pacote {dplyr} (Wickham et al. 2023) e também no pacote {stats} (R Core Team 2023b). Caso carregarmos ambos pacotes e chamarmos a função filter() no escopo do código, qual delas o R irá usar?

Pois bem, a preferência é sempre para o último pacote carregado. Esse é um tipo de problema que pode gerar muita confusão. Felizmente, note que o próprio R acusa um conflito de nome de funções no carregamento do pacote. Para testar, inicie uma nova sessão do R e carregue o pacote {dplyr} (Wickham et al. 2023). Verás que uma mensagem indica haver dois conflitos com o pacote stats e quatro com pacote o {base} (R Core Team 2023a). Alternativamente, pacote {conflicted} (Wickham 2023a) oferece uma maneira explícita de administrar possíveis conflitos e definir quais funções são usadas no código.

4.4 Atualizando Pacotes

Ao longo do tempo, é natural que os pacotes disponibilizados no CRAN sejam atualizados para acomodar novas funcionalidades ou se adaptar a mudanças em suas dependências. Assim, é recomendável que os usuários atualizem os seus pacotes instalados para uma nova versão através da internet. Esse procedimento é bastante fácil. Uma maneira direta de atualizar pacotes é clicar no botão update no painel de pacotes no canto direito inferior do RStudio, conforme mostrado na Figura 4.2.

Figura 4.2: Aualizando pacotes no RStudio

A atualização de pacotes através do prompt também é possível. Para isso, basta utilizar o comando update.packages() , conforme mostrado a seguir.

update.packages()

O comando update.packages() compara a versão dos pacotes instalados em relação a versão disponível no CRAN. Caso tiver alguma diferença, a nova versão é instalada. Após a execução do comando, todos os pacotes estarão atualizados com a versão disponível nos servidores do CRAN.

Importante

Versionamento de pacotes é extremamente importante para manter a reprodutibilidade do código. Apesar de ser raro de acontecer, é possível que a atualização de um pacote no R modifique, para os mesmos dados, resultados já obtidos anteriormente. Tenho uma experiência particularmente memorável quando um artigo científico retornou da revisão e, devido a atualização de um dos pacotes, não consegui reproduzir os resultados apresentados no artigo original. No final das contas deu tudo certo, mas o trauma fica. Reporto, porém, que isto é muito raro de acontecer.

Uma solução para este problema é congelar as versões dos pacotes para cada projeto usando a ferramenta {renv} (Ushey e Wickham 2024) do RStudio. Em resumo, o {renv} (Ushey e Wickham 2024) faz cópias locais dos pacotes utilizados no projeto, os quais têm preferência aos pacotes do sistema. Assim, se um pacote for atualizado no sistema, mas não no projeto, o código R vai continuar usando a versão mais antiga e seu código sempre rodará nas mesmas condições.

4.5 Pacote {introR} (M. S. Perlin 2023)

Nas seções futuras iremos utilizar o pacote {introR} (M. S. Perlin 2023) para carregar diversos exemplos de arquivos. Se você seguiu as instruções da seção Material Suplementar localizada no prefácio do livro, já deves ter o pacote instalado. Caso contrário, execute o seguinte código:

# install devtools (if not installed)
if (!require(devtools)) install.packages ('devtools')

# install book package
devtools::install_github ('msperlin/introR')

Uma vez que você instalou o pacote {introR} (M. S. Perlin 2023), todos os arquivos de dados usados no livro foram baixados. Podemos verificar os cinco primeiros arquivos disponíveis com o comando introR::data_list() :

# list available data files
available_files <- introR::data_list(be_silent = TRUE)

print(available_files[1:5])
R> [1] "CH04_another-funky-csv-file.csv"
R> [2] "CH04_example-fst.fst"           
R> [3] "CH04_example-Rdata.RData"       
R> [4] "CH04_example-rds.rds"           
R> [5] "CH04_example-sqlite.SQLite"

Os arquivos anteriores estão salvos na pasta de instalação dos pacote introR. Para ter o caminho completo, basta usar função introR::data_path() tendo o nome do arquivo como entrada:

# get location of file
my_f <- introR::data_path("CH04_example-fst.fst")

# print it
print(my_f)

A partir de agora iremos usar a função introR::data_path para obter o caminho dos arquivos utilizados nos exemplos. Note que, desde que tenha o pacote introR instalado, podes facilmente reproduzir todos os exemplos do livro no seu computador.

4.6 Exercícios


Q.1 - Toda vez que o usuário instala um pacote do R, os arquivos particulares ao pacote são armazenados localmente em uma pasta específica do computador. Utilizando comando Sys.getenv('R_LIBS_USER') e list.dirs, liste todos os diretórios desta pasta. Quantos pacotes estão disponíveis nesta pasta do seu computador?


Q.2 - Use função install.packages() para instalar o pacote {yfR} (M. Perlin 2023) no seu computador. Após a instalação, use função yfR::get_yf para baixar dados de preços para a ação da Petrobrás – PETR3 (PETR3.SA no Yahoo finance) – nos últimos 15 dias. Dica: use função Sys.Date() para definir data atual e Sys.Date() - 15 para calcular a data localizada 15 dias no passado.


Q.3 - Pacote {cranlogs} (Csárdi 2019) permite o acesso a estatísticas de downloads de pacotes do CRAN. Após instalar o pacote no seu computador, use função cranlogs::cran_top_downloads() para verificar quais são os 10 pacotes mais instalados pela comunidade global no último mês. Qual o pacote em primeiro lugar? Dica: Defina a entrada da função cran_top_downloads como sendo when = 'last-week'. Também note que a resposta aqui pode não ser a mesma que obteve pois esta depende do dia em que foi executado o código.

  1. pillar
  2. rlang
  3. jsonlite
  4. lifecycle
  5. ggplot2

Q.4 - Utilizando pacote devtools, instale a versão de desenvolvimento do pacote {ggplot2} (Wickham et al. 2024), disponível no repositório de Hadley Hickman. Carregue o pacote usando library e crie uma figura simples com o código qplot(y = rnorm(10), x = 1:10).