Tutorial 5: Fluxo de Trabalho e R Projects
Introdução.
Na aula passada, discutimos sobre o uso do R Markdown para geração de relatórios dinâmicos, documentos de alta qualidade estética, e produção de pesquisas mais transparentes e reproduzíveis.
Hoje vamos discutir boas práticas para fluxo de trabalho em R. Em especial, discutiremos como utilizar Rprojects para organizar seu ambiente de trabalho, como organizar suas pastas no seu computador, e como integrar melhor o funcionamento do R com a produção de artigos acadêmicos.
O que existe no seu R?
Em geral, quando começamos a programar, pensamos que o que é real no R é aquilo que conseguimos abrir. É quase uma idéia sensorial de que precisamos ver, ter um nome, tocar, para saber que algo existe em R.
Isto nos leva a crer que objetos salvos em nosso ambiente de trabalho são nosso mundo real de R. No entanto, esta é uma idéia ilusória, e muito capaz de gerar erros e complicações maiores em sua dinâmica de programação.
O ideal é pensarmos que o que existe de real em nossa rotina de programação são os nossos scripts. Precisamos ter a idéia de que, se eu precisar desligar meu computador hoje, amanhã este script me retornará exatamente ao ponto em que eu parei no dia anterior.
Esta noção de script como o real do R guiará a aula de hoje. Para que nosso script seja real, minha sugestão é pensarmos em nosso trabalho em R como um projeto auto-contido. Para isto perseguiremos três objetivos.
Meu script precisa ser reproduzível - por mim, por mim daqui há seis meses, por meu co-autores, ou colegas de profissão que lerão meu script.
Meu script precisa ser de fácil compreensão - por mim, por mim daqui há seis meses, por meu co-autores, ou colegas de profissão que lerão meu script.
Todas as dependências e resultados dos scripts precisam estar devidamente ordenados e organizados.
O seu projeto não deve ter absolutamente nenhuma dependência externa.
Veremos a seguir algumas formas de implementar estes três princípios.
Como organizar meus arquivos?
Regra 1: Cada Projeto = Uma Pasta
Crie uma pasta para cada projeto. Por exemplo, segue abaixo um foto de como organizo todos os artigos que estou escrevendo:
::include_graphics("figs/pasta_artigos.png") knitr
Regra 2: Crie subpastas relevantes.
/resultados
/codigos
- analysis_x
- build_x
- visualizacao_x
/leituras
/artigo
- rmd?
- .tex?
- .doc?
/dados
- dados brutos
- dados processados.
Boas Práticas
Nunca crie pastas ou arquivos com espaços.
Use nomes intuitivos, e que lhe ajudem a lembrar o que cada documento faz.
Divida seus códigos em multiplos arquivos (análise, limpeza, gráficos).
Regra 3: Remove Dependências Automáticas do R.
O R por default vem com uma opção de restauras seu ambiente de trabalho anterior. Esta opção é péssimas para produzir projetos auto-contidos, e reproduzíveis.
Vamos retirar isso: Tools > Global Options.
- Desmarque
Restore .RData into workspace at startup
. - Selecione NEVER para
saving workspace option
.
Regra 4: Crie um Projeto de R.
Cada um dos seus projetos deve ter um Rproject associado. Esta prática descrita acima é tão comum, que a equipe do RStudio criou um tipo de arquivo chamado R Project
que permite justamente você ter um ambiente de R dedicado para cada um dos seus projetos distintos.
O uso de R Projects
é super útil quando integramos o R com outras plataformas, como o Git e Github. Não veremos isto nesse nosso curso. Por isto, em nosso caso, a principal contribuição do R Projects
será em integrar nosso ambiente em R com cada um dos nossos projetos específicos.
Por exemplo, siga os passos abaixo para ver algumas das vantagens do R Projects
.
Crie um arquivo de R project para a pasta da Regra 1 acima.
file > new project > existing directory
Crie um script novo e salve dentro desta pasta.
Feche o R Studio.
Abre a pasta de seu projeto, e clique no arquivo .rproj
Ao abrir o R Studio você verá que seu ambiente de trabalho está restaurado sem nenhuma dependência, no entanto, você é trazido de volta para onde parou, seus scripts abertos, história dos últimos comandos salva, e mais importante, diretório de trabalho definido no local onde está salvo o .rproj.
Rode as funções abaixo em seu R, com seu R Project aberto.
list.files()
getwd()
Como seguir este fluxo sem fazer point-and-click?
As funções abaixo implementam o passo a passo acima diretamente do seu R.
Crie um R Project
file > new project > new directory
Onde Estamos
getwd()
Crie suas subpastas
dir.create("dados")
dir.create("resultados")
dir.create("codigo")
dir.create("leituras")
dir.create("doc")
Regra 5: Use o Pacote Here.
Quando começamos a programar, somos ensinados a usar a função setwd()
para definir nosso diretório de trabalho, ou como falamos semanas atrás, onde o R está olhando.
A maioria dos códigos que você recebe amigos e professores contêm o seguinte comando nas primeiras linhas:
setwd("tiago/wd/dropbox/arquivo/aula")
## Error in setwd("tiago/wd/dropbox/arquivo/aula"): cannot change working directory
No espírito de termos um projeto auto-contido, vamos evitar utilizar a função setwd(). Porque? Porque a pasta (path) do seu computador nunca será igual a minha. Por isso, por definição, seu código nunca será reproduzível em meu computador.
Para substituir o setwd()
, vamos usar uma solução super prática. Vamos combinar o o R Projects, que automaticamente redefine meu diretório de trabalho, como o pacote here
que nos oferta uma forma mais fácil de encontrar nossos arquivos.
#install.packages("here")
library(here)
here()
## [1] "/home/venturat/Dropbox/fgv_capes_print/website/fgv_intro_css_"
Vamos criar uma pasta nova:
list.files()
## [1] "data.jpeg" "dfake.csv"
## [3] "example_markdown.html" "example_markdown.Rmd"
## [5] "figs" "rstudio.png"
## [7] "styles.css" "tutorial1_instalacao.html"
## [9] "tutorial1_instalacao.rmd" "tutorial2_rbasico.html"
## [11] "tutorial2_rbasico.rmd" "tutorial3_rbasicoII.html"
## [13] "tutorial3_rbasicoII.rmd" "tutorial4_rmarkdown.html"
## [15] "tutorial4_rmarkdown.rmd" "tutorial5_rprojects.html"
## [17] "tutorial5_rprojects.rmd"
dir.create(here("exemplo_para_aula"))
list.files()
## [1] "data.jpeg" "dfake.csv"
## [3] "example_markdown.html" "example_markdown.Rmd"
## [5] "figs" "rstudio.png"
## [7] "styles.css" "tutorial1_instalacao.html"
## [9] "tutorial1_instalacao.rmd" "tutorial2_rbasico.html"
## [11] "tutorial2_rbasico.rmd" "tutorial3_rbasicoII.html"
## [13] "tutorial3_rbasicoII.rmd" "tutorial4_rmarkdown.html"
## [15] "tutorial4_rmarkdown.rmd" "tutorial5_rprojects.html"
## [17] "tutorial5_rprojects.rmd"
Vamos salvar um gráfico nesta pastas.
library(tidyverse)
ggplot(mtcars, aes(x = mpg, y = wt)) +
geom_point()
ggsave(here("exemplo_para_aula", "grafico.png")) # endereço , nome do arquivo
list.files(here("exemplo_para_aula"))
## [1] "grafico.png"
Ou seja, o here
encontra seu R Projects, e usa ele como diretório de um nível maior. A partir daí, você acessa todos os níveis inferiors usando os nomes das subpastas.
Mais importante, quando você compartilhar seu projeto, com as subpastas, e o R projects, todos os seus códigos devem ser plenamente reproduzíveis justamente pela combinação entre .rproj
e o pacote here
.