Pacotes: {fs}, {usethis} e {here}

Fernanda Kelly - Fundadora

Jennifer Lopes - Co-Fundadora
Allison Horst.
Ensinar a comunidade R a criar projetos que funcionem em qualquer computador, eliminando problemas com caminhos absolutos e setwd().
Isso facilita o compartilhamento de código entre colegas, orientadores e colaboradores, garantindo que análises possam ser reproduzidas independentemente do sistema operacional ou estrutura de pastas.
Capacitar iniciantes e intermediários a adotarem uma estrutura profissional de organização de projetos desde seus primeiros trabalhos em R.
Ao aprender a separar dados brutos de processados, numerar scripts sequencialmente e documentar adequadamente, os usuários desenvolvem hábitos que sustentarão projetos mais complexos no futuro.
Resolver um dos problemas mais comuns que afasta pessoas do R: erros com caminhos de arquivos.
Ao aprender {here}, {fs} e {usethis}, a comunidade passa menos tempo lutando com “file not found” e mais tempo fazendo análises, tornando a experiência com R mais agradável e produtiva.
São uma forma de organizar todo o trabalho relacionado a uma análise, aplicação ou pesquisa em uma pasta dedicada e autocontida.
# primeiro_projeto/ # pasta raiz do projeto
# ├── primeiro_projeto.Rproj # arquivo de projeto RStudio
# └── meu_projeto/ # subpasta principal
# ├── dados/ # dados brutos (não modificar manualmente)
# ├── scripts/ # scripts R (.R, .Rmd, .qmd)
# ├── output/ # resultados processados (csv, rds, etc.)
# ├── figuras/ # gráficos e visualizações exportadas
# ├── docs/ # relatórios ou apresentações
# ├── funcoes/ # funções criadas
# └── README.md # instruções rápidas sobre o projeto# ❌ Código que NÃO funciona em outro PC
setwd("C:/Users/Jennifer/Documents/projeto")
dados <- read.csv("../data/dados.csv")Problemas:
Caminho absoluto não portável
setwd() muda diretório global
Não funciona em colaboração
Três Pilares:
| Pacote | Função | Quando |
|---|---|---|
| {usethis} | Criar projetos | Início |
| {here} | Caminhos seguros | Sempre |
| {fs} | Manipular arquivos | Diário |
usethis é um pacote de fluxo de trabalho.
Ele automatiza tarefas repetitivas que surgem durante a configuração e o desenvolvimento de projetos, tanto para pacotes R quanto para projetos que não são pacotes.
Nós iremos focar nas funções de criação de projetos!
Mas lembre-se, o pacote vai muito além, leia a documentação.
1. Criar projeto
2. Verificar diretório
3. Configurar
here é facilitar a referência a arquivos em fluxos de trabalho orientados a projetos . Ao contrário do uso de `file` setwd(), que é frágil e dependente da forma como você organiza seus arquivos, o pacote here utiliza o diretório raiz do projeto para construir caminhos para os arquivos de forma simples.O pacote
herecria caminhos relativos ao diretório raiz.O pacote exibe o diretório raiz do projeto atual ao ser carregado ou sempre que você chamar `
here():`.Mas lembre-se, o pacote vai muito além, leia a documentação.
# ❌ Caminhos absolutos - não funcionam em outro PC
"C:/Users/Jennifer/projeto/data/dados.csv" # Windows
"/Users/jennifer/projeto/data/dados.csv" # MacSolução: {here}
Procura indicadores de raiz:
.Rproj ⭐.here.git/DESCRIPTION# Ver raiz
here()
# Construir caminhos
here("data")
here("data", "raw", "arquivo.csv")
# Verificar existência
file.exists(here("README.md"))VEJAMOS O NOSSO SCRIPT!
fs são divididas em quatro categorias principais:path_para manipular e construir caminhos
file_para arquivos
dir_para diretórios
link_para links
Operações para o sistema de arquivos.
# Criar
file_create(here("data", "notas.txt"))
# Listar com padrão
dir_ls(here("scripts"), glob = "*.R")
# Informações
file_info(here("README.md"))
file_size(here("README.md"))
file_exists(here("README.md"))
# Copiar
file_copy(origem, destino, overwrite = TRUE)
# Mover/renomear
file_move(origem, destino)
# Deletar
file_delete(arquivo)# Extensões
path_ext("relatorio.docx") # "docx"
path_ext_set("dados.xlsx", "csv") # "dados.csv"
path_ext_remove("analise.R") # "analise"
# Partes do caminho
path_file(here("data", "vendas.csv")) # "vendas.csv"
path_dir(here("data", "raw", "x.csv")) # ".../data/raw"
# Conversões
path_abs("data/dados.csv")
path_rel(caminho, start = here())
# Temporários
file_temp(ext = ".csv")
path_temp()CRIAR ARQUIVOS
library(fs)
library(here)
# Scripts numerados
scripts <- c(
"01-importar.R", "02-limpar.R",
"03-analisar.R", "04-visualizar.R")
file_create(here("scripts", scripts))
# Dados fictícios
file_create(here("data", "raw", "vendas_2024.csv"))
file_create(here("data", "raw", "clientes.xlsx"))
file_create(here("data", "raw", "produtos.txt"))LISTAR ARQUIVOS
INFORMAÇÕES DOS ARQUIVOS
COPIAR ARQUIVOS
MOVER/RENOMEAR E EXTENSÕES
# Simular processamento: raw → clean
file_copy(
path = here("data", "raw", "vendas_2024.csv"),
new_path = here("data", "clean", "vendas_processadas.csv"))
# Renomear script
file_move(
path = here("scripts", "01-importar.R"),
new_path = here("scripts", "01-importar-dados-vendas.R"))
# Ver extensões
arquivos <- dir_ls(here("data", "raw"))
path_ext(arquivos)
# Mudar extensão
path_ext_set("dados.xlsx", "csv")
# Apenas nome do arquivo
path_file(here("data", "raw", "vendas_2024.csv"))TEMPORÁRIOS E LIMPEZA
# Arquivo temporário
temp_file <- file_temp(ext = ".rds")
print(temp_file)
# Testar salvamento
saveRDS(mtcars, temp_file)
file_exists(temp_file)
# Diretório temporário
path_temp()
# Deletar backup
file_delete(here("data", "raw", "vendas_backup.csv"))
dir_delete(here("data", "raw_backup"))
# Verificação final
dir_tree(here())SETUP E GERAR DADOS
library(here)
library(fs)
# Criar script
file_create(here("scripts", "01-gerar-dados.R"))
# Dados fictícios
set.seed(123)
vendas <- data.frame(
data = seq.Date(as.Date("2024-01-01"),
as.Date("2024-03-31"), by = "day"),
produto = sample(LETTERS[1:4], 90, replace = TRUE),
valor = round(runif(90, 100, 1000), 2),
quantidade = sample(1:10, 90, replace = TRUE))
# Salvar em raw
write.csv(vendas,
here("data", "raw", "vendas_q1.csv"),
row.names = FALSE)
# Verificar
file_exists(here("data", "raw", "vendas_q1.csv"))
file_size(here("data", "raw", "vendas_q1.csv"))PROCESSAR E ANALISAR
# Ler dados brutos
dados_raw <- read.csv(here("data", "raw", "vendas_q1.csv"))
# Processar
dados_clean <- dados_raw
dados_clean$receita <- dados_clean$valor * dados_clean$quantidade
dados_clean$data <- as.Date(dados_clean$data)
# Salvar em clean
write.csv(dados_clean,
here("data", "clean", "vendas_processadas.csv"),
row.names = FALSE)
# Verificar diferença de tamanho
file_size(here("data", "raw", "vendas_q1.csv"))
file_size(here("data", "clean", "vendas_processadas.csv"))
# Análise - agregar dados
resumo <- aggregate(receita ~ produto, dados_clean, sum)
# Salvar resultado
write.csv(resumo,
here("outputs", "resumo_vendas.csv"),
row.names = FALSE)BACKUP E ORGANIZAÇÃO
# Criar pasta backup com timestamp
timestamp <- format(Sys.time(), "%Y%m%d_%H%M%S")
backup_dir <- here("data", paste0("backup_", timestamp))
dir_create(backup_dir)
# Copiar dados processados
file_copy(
here("data", "clean", "vendas_processadas.csv"),
path(backup_dir, "vendas_processadas.csv"))
# Listar estrutura criada
dir_tree(here("data"))
dir_tree(here("outputs"))
# Informações dos arquivos
info <- file_info(dir_ls(here("data", "clean")))
print(info[, c("path", "size", "modification_time")])
# Limpeza - deletar temporários
temp_files <- dir_ls(here(), glob = "*.tmp")
if (length(temp_files) > 0) file_delete(temp_files)LINKS SIMBÓLICOS E PERMISSÕES
BUSCA E COMPARAÇÃO
# Buscar padrão específico
dir_ls(here(), recurse = TRUE, regexp = "vendas")
# Buscar por tipo
dir_ls(here(), recurse = TRUE, type = "file")
# Comparar tamanhos
files <- dir_ls(here("data"), recurse = TRUE, type = "file")
sizes <- file_size(files)
names(sizes) <- basename(files)
sort(sizes, decreasing = TRUE)
# Metadados - última modificação
info <- file_info(here("scripts", "01-gerar-dados.R"))
info$modification_time
info$access_timeCONVERSÃO E UTILITÁRIOS
library(here)
library(fs)
# Workflow completo
caminho_raw <- here("data", "raw", "vendas.csv")
# 1. Verificar se existe
if (file_exists(caminho_raw)) {
# 2. Ver informações
cat("Tamanho:", as.character(file_size(caminho_raw)), "\n")
# 3. Ler
dados <- read.csv(caminho_raw)
# 4. Processar
dados$total <- dados$valor * dados$quantidade
# 5. Salvar em clean
caminho_clean <- here("data", "clean", "vendas_limpo.csv")
write.csv(dados, caminho_clean, row.names = FALSE)
# 6. Backup
timestamp <- format(Sys.time(), "%Y%m%d")
caminho_backup <- here("data", "clean",
paste0("vendas_", timestamp, ".csv"))
file_copy(caminho_clean, caminho_backup)
# 7. Confirmar
cat("✅ Arquivo salvo:", caminho_clean, "\n")
cat("✅ Backup criado:", caminho_backup, "\n")
}Este projeto foi criado durante o workshop “Organização de Projetos em R” do R-Ladies Goiânia. O objetivo é aplicar boas práticas de organização usando os pacotes {usethis}, {fs} e {here} para criar um fluxo de trabalho reproduzível e colaborativo.
workshop_r/
├── data/
│ ├── raw/ # Dados originais (NUNCA modificar!)
│ └── clean/ # Dados processados
├── scripts/ # Scripts R numerados
│ ├── 01-importar.R
│ ├── 02-limpar.R
│ ├── 03-analisar.R
│ └── 04-visualizar.R
├── outputs/ # Resultados das análises
├── figures/ # Gráficos e visualizações
├── README.md # Este arquivo
└── workshop_r.Rproj # Arquivo de projeto RStudioJennifer Lopes - R-Ladies Goiânia
Site: rladiesgyn.com
Use projetos R (.Rproj)
Sempre use here() para caminhos
Nunca modifique data/raw/
Use nomes descritivos: 01-importar.R
Documente no README.md
setwd() - Nunca use!
Caminhos absolutos
Espaços em nomes de arquivos
Acentos em nomes
Scripts sem numeração
Não use ❌
analise final.R
dados (1).csv
Script Análise.R
Use✅
03-analise-final.R
dados_vendas_2024.csv
01-importar-dados.R
projeto/
├── data/
│ ├── raw/ # Dados originais (NUNCA modificar!)
│ └── clean/ # Dados processados
├── scripts/ # Scripts numerados
├── outputs/ # Resultados
├── figures/ # Gráficos
├── README.md
└── projeto.Rproj
# Título: Análise de Vendas
# Autor: Seu Nome
# Data: 2025-01-15
# 1. Setup ----
library(here)
library(fs)
library(dplyr)
# 2. Importar ----
dados <- read.csv(here("data", "raw", "vendas.csv"))
# 3. Processar ----
dados_clean <- dados %>%
filter(!is.na(valor))
# 4. Exportar ----
write.csv(dados_clean,
here("data", "clean", "vendas_limpo.csv"))# CRIAR PROJETO
usethis::create_project("nome")
usethis::use_readme_md()
usethis::use_git()
# ESTRUTURA
dir_create(here("data", c("raw", "clean")))
dir_tree(here())
# CAMINHOS
here("data", "arquivo.csv")
# ARQUIVOS
file_create(caminho)
file_copy(origem, destino, overwrite = TRUE)
file_move(origem, destino)
file_delete(arquivo)
dir_ls(here(), glob = "*.R")
file_info(arquivo)
# EXTENSÕES
path_ext(arquivo)
path_ext_set(arquivo, "nova_ext")
path_file(caminho)Documentação: - {usethis} - {fs} - {here}
Livros: - R for Data Science | What They Forgot to Teach You
R-Ladies Goiânia
Organizando projetos, uma pasta por vez! 📁
Nosso site, tem todas as redes!

Jennifer Lopes • R-Ladies Goiânia