# find current available packages
<- available.packages()
df_cran_pkgs
# get size of matrix
<- nrow(df_cran_pkgs)
n_cran_pkgs
# print it
print(n_cran_pkgs)
R> [1] 20631
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.
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
<- available.packages()
df_cran_pkgs
# get size of matrix
<- nrow(df_cran_pkgs)
n_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
<- nrow(installed.packages())
n_local_pkgs
# 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!
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.
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.
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
::install_github("hadley/ggplot2") devtools
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).
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.
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
::fortune(10) fortunes
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):
<- function(x){
my_fct require(quantmod)
<- getSymbols(x, auto.assign = F)
df 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.
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.
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.
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.
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.
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
::install_github ('msperlin/introR') devtools
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
<- introR::data_list(be_silent = TRUE)
available_files
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
<- introR::data_path("CH04_example-fst.fst")
my_f
# 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.
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.
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)
.