Comando R para definir o diretório de trabalho no local do arquivo de origem no Rstudio

135

Estou elaborando alguns tutoriais em R. Cada código R está contido em uma pasta específica. Existem arquivos de dados e outros arquivos lá. Desejo abrir o .rarquivo e fonte-lo de forma que não precise alterar o diretório ativo no Rstudio, como mostrado abaixo:

insira a descrição da imagem aqui

Existe uma maneira de especificar meu diretório de trabalho automaticamente em R.

Stat-R
fonte
Provavelmente isso é um tolo. Veja?setwd ?getwd
Brandon Bertelsen
3
Não é um tolo, o pôster deseja load.rdata-files na mesma pasta, não sourcecom o diretório de trabalho definido como o caminho do arquivo de origem.
Ruben

Respostas:

76

Para obter a localização de um script que está sendo originado, você pode usar utils::getSrcDirectoryou utils::getSrcFilename. Portanto, alterar o diretório de trabalho para o do arquivo atual pode ser feito com:

setwd(getSrcDirectory()[1])

Isso não funciona no RStudio se você executar o código em vez de fornecê -lo. Para isso, você precisa usar rstudioapi::getActiveDocumentContext.

setwd(dirname(rstudioapi::getActiveDocumentContext()$path))

Essa segunda solução exige que você esteja usando o RStudio como seu IDE, é claro.

Richie Cotton
fonte
sua própria resposta em stackoverflow.com/a/35842176/1247080 funciona (é necessário incluir o nome do diretório). Eu adicionei
Stat-R
Não funciona para mim. Eu receboError: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'
Andru 22/11
2
Observe que quando você executa getActiveDocumentContext()no console no RStudio, o caminho é relatado como ''. No entanto, se você executar a linha de código na parte do editor, ela será executada conforme o esperado. Isso pode abordar o comentário de @Andru
Megatron
1
@giac_man Parece que você está usando uma versão muito antiga do rstudioapipacote. Tente atualizar para o mais recente.
Richie Cotton
1
@mjs Na parte superior do console, você deve ver o diretório de trabalho atual. À direita disso está uma pequena flecha. Clique nele para mostrar o diretório de trabalho atual no navegador de arquivos.
Richie Cotton
62

Eu sei que essa pergunta está desatualizada, mas eu estava procurando uma solução para isso também e o Google lista isso no topo:

this.dir <- dirname(parent.frame(2)$ofile)
setwd(this.dir)

coloque isso em algum lugar do arquivo (o melhor seria o começo), para que o wd seja alterado de acordo com esse arquivo.

Segundo os comentários, isso pode não funcionar necessariamente em todas as plataformas (o Windows parece funcionar, Linux / Mac para alguns). Lembre-se de que esta solução é para 'fornecer' os arquivos, não necessariamente para executar blocos nesse arquivo.

veja também get filename e caminho do arquivo `source`d

BumbleBee
fonte
99
também não funcionou para mim:Error in dirname(parent.frame(2)$ofile) : a character vector argument expected
tumultous_rooster
4
O mesmo problema aqui como @Matt O'Brien no Linux.
patapouf_ai
3
Funcionando perfeitamente se fornecido.
m-dz
2
Funcionou para mim no RStudio v1.0.143 no Windows 10. Se você selecionar "Origem ao salvar", ele funcionará perfeitamente (você pode imprimir o diretório detectado com "cat"). Se você selecionar as linhas e executá-las, o resultado será nulo.
Contango 17/06
2
Isso funciona para mim em um Mac ao obter um arquivo. No entanto, como o @Contango apontou acima, ele não funcionará ao executar o código interativamente, destacando um pedaço e pressionando Command + Return. Nesse caso, como você não está adquirindo um arquivo, não há um arquivo de origem para extrair o diretório de trabalho. A resposta não precisa especificar advertências específicas da plataforma.
precisa saber é o seguinte
7
dirname(rstudioapi::getActiveDocumentContext()$path)

funciona para mim, mas se você não quiser usar o rstudioapi e não estiver em um projeto, poderá usar o símbolo ~ em seu caminho. O símbolo ~ refere-se ao diretório de trabalho padrão do RStudio (pelo menos no Windows).

Opções do RStudio

Se o diretório de trabalho do RStudio for "D: / Documents", setwd("~/proyect1")é o mesmo que setwd ("D: / Documents / proyect1").

Depois de definir isso, você pode navegar para um subdiretório: read.csv("DATA/mydata.csv"). É o mesmo que read.csv("D:/Documents/proyect1/DATA/mydata.csv").

Se você deseja navegar para uma pasta pai, pode usar "../". Por exemplo: read.csv("../olddata/DATA/mydata.csv")que é o mesmo queread.csv("D:/Documents/oldata/DATA/mydata.csv")

Essa é a melhor maneira de codificar scripts, independentemente do computador que você está usando.

Juan Pueyo
fonte
6

Para o rstudio , você pode definir automaticamente seu diretório de trabalho para o diretório de scripts usando o rstudioapi assim:

library(rstudioapi)

# Getting the path of your current open file
current_path = rstudioapi::getActiveDocumentContext()$path 
setwd(dirname(current_path ))
print( getwd() )

Isso funciona ao executar ou originar seu arquivo.

Você precisa instalar o pacote rstudioapi primeiro. Observe que imprimo o caminho para ter 100% de certeza de que estou no lugar certo, mas isso é opcional.

gagarine
fonte
Erro no setwd (dirname (current_path)): não pode mudar o diretório de trabalho
tavalendo
@helmo verifique se o usuário tem permissão de gravação no diretório de destino.
Gagarine
5

A solução

dirname(parent.frame(2)$ofile)

não está trabalhando para mim.

Estou usando um algoritmo de força bruta, mas funciona:

File <- "filename"
Files <- list.files(path=file.path("~"),recursive=T,include.dirs=T)
Path.file <- names(unlist(sapply(Files,grep,pattern=File))[1])
Dir.wd <- dirname(Path.file)

Mais fácil ao pesquisar em um diretório:

Dirname <- "subdir_name"
Dirs <- list.dirs(path=file.path("~"),recursive=T)
dir_wd <- names(unlist(sapply(Dirs,grep,pattern=Dirname))[1])
namu.net
fonte
1
O problema com esta solução é que é muito lento. Procurar todos os arquivos e armazenar em uma variável também consome muita memória.
tavalendo
4

Se você trabalha no Linux, pode tentar o seguinte:

setwd(system("pwd", intern = T) )

Funciona para mim.

Taz
fonte
1
Isso apenas fornece seu diretório inicial (onde seu shell é iniciado).
Caner
Ele fornece o caminho para o diretório onde está o script que você executa.
Taz
2
pwd significa o diretório de trabalho atual. Isso definirá o diretório para qualquer que seja o diretório atual do shell.
PeterVermont
pwdtambém funciona no PowerShell (atualmente considerado o shell padrão no Windows), onde é um alias para Get-Location.
BroVic 17/04
3

Eu estava apenas procurando uma solução para este problema, chegou a esta página. Eu sei que é datado, mas as soluções anteriores eram insatisfatórias ou não funcionavam para mim. Aqui está o meu trabalho, se estiver interessado.

filename = "your_file.R"
filepath = file.choose()  # browse and select your_file.R in the window
dir = substr(filepath, 1, nchar(filepath)-nchar(filename))
setwd(dir)
Ryan Liebert
fonte
Existe uma razão para você não usar apenas setwd( dirname(filepath) )?
Jodis
3

Percebo que esse é um encadeamento antigo, mas tive um problema semelhante ao precisar definir o diretório de trabalho e não consegui fazer com que nenhuma das soluções funcionasse para mim. Aqui está o que funcionou, caso mais alguém se depare com isso mais tarde:

# SET WORKING DIRECTORY TO CURRENT DIRECTORY:
system("pwd=`pwd`; $pwd 2> dummyfile.txt")
dir <- fread("dummyfile.txt")
n<- colnames(dir)[2]
n2 <- substr(n, 1, nchar(n)-1)
setwd(n2)

É um pouco complicado, mas basicamente isso usa comandos do sistema para obter o diretório de trabalho e salvá-lo em dummyfile.txt, então R lê esse arquivo usando data.table :: fread. O resto é apenas limpar o que foi impresso no arquivo, para que eu fique apenas com o caminho do diretório.

Eu precisava executar o R ​​em um cluster, para que não houvesse maneira de saber em qual diretório eu terminaria (os trabalhos recebem um número e um nó de computação). Isso fez o truque para mim.

Katie Renwick
fonte
2

Eu entendo que isso está desatualizado, mas não consegui que as respostas anteriores funcionassem satisfatoriamente, por isso, quis contribuir com meu método caso alguém encontrasse o mesmo erro mencionado nos comentários à resposta do BumbleBee.

O meu é baseado em um simples comando do sistema. Tudo o que você alimenta com a função é o nome do seu script:

extractRootDir <- function(x) {
    abs <- suppressWarnings(system(paste("find ./ -name",x), wait=T, intern=T, ignore.stderr=T))[1];
    path <- paste("~",substr(abs, 3, length(strsplit(abs,"")[[1]])),sep="");
    ret <- gsub(x, "", path);
    return(ret);
}

setwd(extractRootDir("myScript.R"));

A saída da função seria semelhante "/Users/you/Path/To/Script". Espero que isso ajude qualquer pessoa que possa ter ficado presa.

Tgsmith61591
fonte
1

O herepacote fornece a here()função, que retorna o diretório raiz do projeto com base em algumas heurísticas.

Não é a solução perfeita, pois não encontra a localização do script, mas é suficiente para alguns propósitos, então pensei em colocá-lo aqui.

Vai
fonte
1
Obrigado por esta resposta. A localização do script atual pode ser aproveitada colocando-se uma chamada here::set_here()na fonte.
BroVic 17/04
0

A maioria das GUIs pressupõe que, se você estiver em um diretório e "abrir", clique duas vezes ou tentar executar um arquivo .R, que o diretório em que reside será o diretório de trabalho, a menos que especificado de outra forma. A GUI do Mac fornece um método para alterar esse comportamento padrão, que pode ser alterado no painel Inicialização das Preferências que você define em uma sessão em execução e se torna efetivo na próxima "inicialização". Você também deve estar olhando para:

?Startup

A documentação do RStudio diz:

"Quando iniciado por meio de uma associação de arquivos, o RStudio define automaticamente o diretório de trabalho como o diretório do arquivo aberto." A configuração padrão é que o RStudio seja registrado como manipulador de arquivos .R, embora também haja menção da capacidade de definir uma "associação" padrão com o RStudio para extensões .Rdata e .R. Se ter status de manipulador e de associação é o mesmo no Linux, não sei dizer.

http://www.rstudio.com/ide/docs/using/workspaces

IRTFM
fonte
4
Com certeza o RStudio não faz essa suposição.
Nico
1
Ele se comporta da maneira que eu descrevi na minha máquina. Eu não fiz nada de especial nas Preferências do RStudio.
IRTFM 02/12/12
2
Não faz isso no Linux :)
nico
2
"Quando iniciado por meio de uma associação de arquivos" é a principal condição aqui. Algumas pessoas podem estar iniciando o Rstudio por meio de um atalho ou comando no terminal. Você precisa abrir o arquivo e o padrão para abrir arquivos .R é o Rstudio. Se você abrir o Rstudio primeiro (em seguida, abra o arquivo), ele não funcionará como descrito. Através de uma associação de arquivos, a resposta acima funciona no Windows e no Mac (possivelmente não no Linux, como o @nico indica - mas não posso verificar isso porque não tenho uma máquina Linux).
WetlabStudent
0
dirname(parent.frame(2)$ofile)  

também não funciona para mim, mas o seguinte (conforme sugerido em https://stackoverflow.com/a/35842176/992088 ) funciona para mim no ubuntu 14.04

dirname(rstudioapi::getActiveDocumentContext()$path)
Lamothy
fonte
1
Error: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'também no Ubuntu 14.04
rico Scriven
Talvez você possa tentar instalar o pacote rstudioapi primeiro.
Lamothy
Isso é estranho. Estou usando o R-3.2.4 em um ubuntu 14.04 de 32 bits. Espero que não é por causa do sistema operacional ou diferentes versões de R.
Lamothy
0

Caso você use a codificação UTF-8:

path <- rstudioapi::getActiveDocumentContext()$path
Encoding(path) <- "UTF-8"
setwd(dirname(path))

Você precisa instalar o pacote rstudioapi se ainda não o fez.

jormaga
fonte
Erro no setwd (dirname (caminho)): não pode mudar o diretório de trabalho
tavalendo
`` `Problemas com setwd (dirname (caminho)): não pode mudar trabalhando directory`` sua solução não funciona por favor, verifique a sua resposta
Sr. S Coder
0

Aqui está outra maneira de fazer isso:

set2 <- function(name=NULL) {
  wd <- rstudioapi::getSourceEditorContext()$path
  if (!is.null(name)) {
    if (substr(name, nchar(name) - 1, nchar(name)) != '.R') 
      name <- paste0(name, '.R')
  }
  else {
    name <- stringr::word(wd, -1, sep='/')
  }
  wd <- gsub(wd, pattern=paste0('/', name), replacement = '')
  no_print <- eval(expr=setwd(wd), envir = .GlobalEnv)
}
set2()
Issam
fonte