O Que É o Diretório de Trabalho
Toda sessão do R roda "dentro de" exatamente uma pasta: o diretório de trabalho. Sempre que você usa um caminho relativo - um caminho que não começa na raiz do sistema de arquivos - o R o resolve em relação a essa pasta. read.csv("data.csv") não significa "encontre data.csv em algum lugar do meu computador"; significa "abra o arquivo chamado data.csv no diretório de trabalho".
Esse único fato explica o erro mais comum de iniciantes no R:
read.csv("data.csv")
# Error in file(file, "rt") : cannot open the connection
# In addition: Warning message: cannot open file 'data.csv': No such file or directory
O arquivo existe - só não na pasta para a qual o R está olhando no momento. Não há nada de errado com sua chamada a read.csv; o diretório de trabalho da sessão e a localização do arquivo discordam. As duas funções abaixo transformam isso de um mistério em um diagnóstico de dez segundos.
getwd() e setwd()
getwd() (get working directory) diz onde o R está procurando agora:
Rode isso e você verá um caminho absoluto - a pasta em que esta sessão está ancorada. setwd() (set working directory) o altera:
setwd("C:/Users/rosa/projects/sales-analysis") # Windows: use / not \
setwd("/Users/rosa/projects/sales-analysis") # macOS / Linux
getwd() # confirm it took
Duas notas mecânicas. No Windows, escreva caminhos com / (ou \\ duplicado) - uma \ sozinha é um caractere de escape dentro de strings do R, então "C:\Users" é um erro de sintaxe. E setwd() dá erro imediatamente se a pasta não existe, o que é a falha mais amigável que você verá no dia: ela não consegue te deixar silenciosamente apontado para o lugar errado.
A rotina de depuração para qualquer erro de "cannot open file" é, portanto: getwd() para ver onde o R está procurando, e então comparar com onde o arquivo realmente está.
list.files(): Veja o Que o R Vê
A terceira ferramenta do kit lista o conteúdo do diretório de trabalho - literalmente o conjunto de nomes que um caminho relativo consegue alcançar:
Se o arquivo que você está tentando ler aparece nessa saída, read.csv("aquele_arquivo.csv") vai encontrá-lo. Se não aparece, digitar de novo a linha do read.csv mil vezes não vai ajudar - o diretório de trabalho é o que precisa ser corrigido. list.files("data") espia dentro de uma subpasta, e list.files(pattern = "\\.csv$") filtra apenas os CSVs. Quando um nome de arquivo parece certo mas não é encontrado, list.files() também expõe os culpados clássicos: uma extensão .txt invisível acrescentada por um editor de texto, ou Data.csv vs data.csv em um sistema sensível a maiúsculas.
Por Que setwd() Fixo no Código Quebra
Agora a parte opinativa. Você vai ver scripts que começam com:
setwd("C:/Users/me/Desktop/stuff/project3/final_FINAL")
Essa linha funciona em exatamente uma máquina: a do autor. No seu notebook, no Mac do seu colega, no servidor do departamento ou no seu próprio computador depois de uma reorganização, ela dá erro na linha 1. Fixar um caminho absoluto assa o layout de pastas de uma pessoa dentro de um código feito para sobreviver a ela.
A solução é inverter a responsabilidade: não faça o script encontrar a pasta - inicie o R na pasta certa e use caminhos relativos dentro do script. Concretamente:
- Use Projetos do RStudio. Abrir um arquivo
.Rprojdefine o diretório de trabalho como a pasta do projeto automaticamente, em qualquer máquina. Dentro do script,read.csv("data/sales.csv")funciona então para todo mundo que tenha o projeto. - Rodar pelo terminal faz o mesmo trabalho:
Rscript analysis.Rusa a pasta de onde você o lançou como diretório de trabalho (veja rodando scripts R). - O pacote here vai um passo além para quem quiser -
here::here("data", "sales.csv")constrói caminhos a partir da raiz do projeto, não importa para onde o diretório de trabalho tenha vagado - mas Projetos mais caminhos relativos cobrem a maioria das necessidades sem ele.
setwd() em si não é o mal - ele é ótimo no modo interativo, quando você está explorando. O cheiro ruim é especificamente um setwd() absoluto e específico de máquina comitado no topo de um script compartilhado.
O Workspace: ls() e rm()
Ao lado de "em qual pasta eu estou" existe a segunda peça do estado da sessão: o workspace (o ambiente global) - todo objeto que você criou nesta sessão. ls() os lista, rm() os remove:
O último ls() imprime character(0) - um workspace vazio. O encantamento rm(list = ls()) soa estranho até você destrinchá-lo: ls() retorna o vetor de caracteres com todos os nomes de objetos, e rm(list = ...) apaga todo nome desse vetor. É o equivalente em código ao ícone de vassoura no painel Environment do RStudio.
Saiba o que ele não faz: pacotes carregados com library() continuam carregados, opções continuam definidas e o diretório de trabalho fica onde estava. Ele limpa objetos, nada mais - então não substitui reiniciar o R quando você quer uma folha realmente em branco.
Limpar o Console, e a Armadilha do .RData
Limpar o console - o histórico rolável de comandos e saídas - é cosmético e separado de limpar o workspace. No RStudio é Ctrl+L; em código, o curioso cat("\014") envia o caractere de avanço de página, que a maioria dos consoles interpreta como "limpar a tela". Nenhum dos dois toca nos seus objetos.
Por fim, a armadilha. Quando você sai do R, ele oferece "save workspace image?" - gravando todo objeto em um arquivo oculto .RData que é recarregado silenciosamente na próxima vez que você iniciar o R naquela pasta. Recuse, e desligue isso permanentemente (RStudio: Tools → Global Options → desmarque "Restore .RData", defina "Save workspace" como Never). Um workspace restaurado significa que sua sessão começa poluída com objetos de dias atrás, criados por código que você talvez já tenha editado ou apagado. Seu script parece funcionar - porque está se apoiando em um model_v2 obsoleto que nada no arquivo cria mais - até o momento em que ele roda em uma máquina limpa e desaba.
O hábito profissional é o oposto: comece limpo e rode o script de novo. Se a sua análise é um script que roda de cima para baixo em uma sessão nova, ela é reprodutível por construção; o workspace é uma saída descartável, nunca um estado precioso. Reinicie o R com frequência (RStudio: Session → Restart R) justamente para provar que seu script ainda se sustenta sozinho.
O Que Você Leva Daqui
- Caminhos relativos são resolvidos em relação ao diretório de trabalho;
getwd()o mostra,setwd()o altera,list.files()mostra o que é alcançável. - "Cannot open file" quase sempre significa que o diretório de trabalho e a pasta do arquivo discordam - diagnostique com
getwd()+list.files(). - Nunca comite um
setwd()absoluto em um script compartilhado - use Projetos do RStudio (ou rode o script a partir da pasta dele) e caminhos relativos. ls()lista os objetos do workspace;rm(x)remove um;rm(list = ls())limpa todos - pacotes e opções permanecem.- Ctrl+L (ou
cat("\014")) limpa apenas o texto do console. - Não salve/restaure
.RDataautomaticamente: comece limpo e rode o script de novo - é isso que torna seu trabalho reprodutível.
A seguir: ler dados de verdade - read.csv() e companhia, agora que o R está olhando na pasta certa para encontrá-los.
Perguntas frequentes
Como defino o diretório de trabalho no R?
Chame setwd("caminho/para/pasta") para mudá-lo e getwd() para ver o atual. No RStudio você também pode usar o menu: Session → Set Working Directory. Mas para qualquer coisa que você vá rodar de novo ou compartilhar, prefira um Projeto do RStudio (que define o diretório de trabalho automaticamente) a uma linha setwd() fixa - caminhos absolutos quebram em qualquer outra máquina.
Como limpo o ambiente no R?
rm(list = ls()) remove todo objeto do ambiente global: ls() lista todos os nomes de objetos e rm() os apaga. Para remover apenas um objeto, use rm(x). Note que isso limpa apenas objetos - pacotes carregados continuam carregados, e o texto do console fica intacto (isso é Ctrl+L no RStudio).
Por que read.csv diz 'cannot open file' se o arquivo existe?
Porque o R resolve caminhos relativos em relação ao seu diretório de trabalho, e o seu está apontando para outro lugar que não a pasta onde está o arquivo. Rode getwd() para ver onde o R está procurando e list.files() para ver o que ele enxerga ali. Corrija abrindo o projeto na pasta certa (ou com setwd()), não colando um caminho absoluto no script.