Comando R per impostare la directory di lavoro sulla posizione del file di origine in Rstudio


135

Sto elaborando alcuni tutorial in R. Ogni codice R è contenuto in una cartella specifica. Ci sono file di dati e altri file lì dentro. Voglio aprire il .rfile e crearlo in modo tale da non dover cambiare la directory di lavoro in Rstudio come mostrato di seguito:

inserisci qui la descrizione dell'immagine

C'è un modo per specificare automaticamente la mia directory di lavoro in R.


Questo è probabilmente un inganno. vedi?setwd ?getwd
Brandon Bertelsen il


3
Non un duplicato, il poster desidera loadfile .rdata nella stessa cartella, non sourcecon la directory di lavoro impostata sul percorso del file di origine.
Ruben,

Risposte:


76

Per ottenere la posizione di uno script di provenienza, è possibile utilizzare utils::getSrcDirectoryo utils::getSrcFilename. Quindi la modifica della directory di lavoro in quella del file corrente può essere effettuata con:

setwd(getSrcDirectory()[1])

Questo non funziona in RStudio se si esegue il codice anziché l' origine . Per questo, è necessario utilizzare rstudioapi::getActiveDocumentContext.

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

Questa seconda soluzione richiede ovviamente l'utilizzo di RStudio come IDE.


la tua risposta su stackoverflow.com/a/35842176/1247080 funziona (bisogna tuttavia includere il nome dir). L'ho aggiunto
Stat-R

Non funziona per me. RicevoError: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'
Andru il

2
Si noti che quando si esegue getActiveDocumentContext()nella console in RStudio, il percorso viene segnalato come ''. Tuttavia, se si esegue la riga di codice nella parte dell'editor, verrà eseguita come previsto. Questo può riguardare il commento di @Andru
Megatron,

1
@giac_man Sembra che tu stia utilizzando una versione molto vecchia del rstudioapipacchetto. Prova ad aggiornare a quello più recente.
Richie Cotton,

1
@mjs Nella parte superiore della console, dovresti vedere l'attuale directory di lavoro. A destra c'è una piccola freccia. Fare clic per visualizzare la directory di lavoro corrente nel browser dei file.
Richie Cotton,

62

So che questa domanda è obsoleta, ma stavo cercando una soluzione anche per questo e Google la elenca in alto:

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

mettilo da qualche parte nel file (il migliore sarebbe comunque l'inizio), in modo che il wd venga modificato in base a quel file.

Secondo i commenti, questo potrebbe non funzionare necessariamente su ogni piattaforma (Windows sembra funzionare, Linux / Mac per alcuni). Tieni presente che questa soluzione è per "approvvigionamento" dei file, non necessariamente per l'esecuzione di blocchi in quel file.

vedi anche ottenere il nome file e il percorso del file `source`d


99
non ha funzionato neanche per me:Error in dirname(parent.frame(2)$ofile) : a character vector argument expected
tumultous_rooster

4
Lo stesso problema qui di @Matt O'Brien su Linux.
patapouf_ai,

3
Funziona perfettamente se di provenienza.
m-dz,

2
Ha funzionato per me in RStudio v1.0.143 su Windows 10. Se si seleziona "Sorgente su salvataggio", funzionerà perfettamente (è possibile stampare la directory rilevata con "cat"). Se si selezionano le linee, quindi le si esegue, il risultato è null.
Contango,

2
Questo funziona per me su un Mac durante l'approvvigionamento di un file. Tuttavia, come sottolineato da @Contango sopra, non funzionerà durante l'esecuzione interattiva del codice evidenziando un blocco e premendo Comando + Invio. In questo caso, dal momento che non si sta acquistando un file, non esiste un file sorgente da cui estrarre la directory di lavoro. La risposta non deve specificare avvertenze specifiche della piattaforma.
bmosov01,

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

funziona per me ma se non vuoi usare rstudioapi e non sei in progetto, puoi usare il simbolo ~ nel tuo percorso. Il simbolo ~ si riferisce alla directory di lavoro predefinita di RStudio (almeno su Windows).

Opzioni di RStudio

Se la directory di lavoro di RStudio è "D: / Documents", setwd("~/proyect1")è uguale a setwd ("D: / Documents / proyect1").

Una volta impostato questo, si può passare a una sottodirectory: read.csv("DATA/mydata.csv"). È lo stesso di read.csv("D:/Documents/proyect1/DATA/mydata.csv").

Se si desidera passare a una cartella principale, è possibile utilizzare "../". Ad esempio: read.csv("../olddata/DATA/mydata.csv")che è lo stesso diread.csv("D:/Documents/oldata/DATA/mydata.csv")

Questo è il modo migliore per codificare gli script, indipendentemente dal computer che stai utilizzando.



6

Per rstudio , puoi impostare automaticamente la tua directory di lavoro sulla directory degli script usando rstudioapi in questo modo:

library(rstudioapi)

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

Funziona quando si esegue o si esegue il sorgente del file.

Devi prima installare il pacchetto rstudioapi. Nota che stampo il percorso per essere sicuro al 100% di essere nel posto giusto, ma questo è facoltativo.


Errore in setwd (dirname (current_path)): impossibile cambiare la directory di lavoro
tavalendo

@helmo controlla che il tuo utente abbia i permessi di scrittura nella directory di destinazione.
gagarine,

5

La soluzione

dirname(parent.frame(2)$ofile)

non funziona per me.

Sto usando un algoritmo a forza bruta, ma funziona:

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)

Più facile durante la ricerca di una directory:

Dirname <- "subdir_name"
Dirs <- list.dirs(path=file.path("~"),recursive=T)
dir_wd <- names(unlist(sapply(Dirs,grep,pattern=Dirname))[1])

1
Il problema con questa soluzione è che è molto lento. Anche la ricerca di tutti i file e l'archiviazione in una variabile occupa molta memoria.
Tavalendo,

4

Se lavori su Linux puoi provare questo:

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

Per me funziona.


1
Questo dà solo la tua home directory (dove inizia la tua shell).
Caner,

Dà il percorso alla directory in cui si trova lo script che si esegue.
Taz,

2
pwd indica l'attuale directory di lavoro. Questo imposterà la directory su qualunque sia la directory corrente della shell.
PeterVermont,

pwdfunziona anche in PowerShell (che è attualmente considerata la shell predefinita su Windows), dove è un alias per Get-Location.
BroVic,

3

Stavo solo cercando una soluzione a questo problema, sono arrivato a questa pagina. So che è datato ma le soluzioni precedenti erano insoddisfacenti o non funzionavano per me. Ecco il mio lavoro intorno se interessati.

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)

C'è un motivo per cui non ti limiti a usare setwd( dirname(filepath) )?
jodis,

3

Mi rendo conto che questo è un vecchio thread, ma ho avuto un problema simile con la necessità di impostare la directory di lavoro e non sono riuscito a far funzionare nessuna delle soluzioni per me. Ecco cosa ha funzionato, nel caso in cui qualcun altro si imbattesse in questo in seguito:

# 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)

È un po 'contorto, ma fondamentalmente utilizza i comandi di sistema per ottenere la directory di lavoro e salvarla in dummyfile.txt, quindi R legge quel file usando data.table :: fread. Il resto è solo ripulire ciò che è stato stampato sul file in modo che rimanga solo il percorso della directory.

Avevo bisogno di eseguire R su un cluster, quindi non c'era modo di sapere in quale directory sarei finito (ai lavori viene assegnato un numero e un nodo di calcolo). Questo ha fatto il trucco per me.


2

Capisco che questo è obsoleto, ma non sono riuscito a far funzionare le risposte precedenti in modo molto soddisfacente, quindi volevo contribuire con il mio metodo nel caso in cui qualcuno dovesse riscontrare lo stesso errore menzionato nei commenti alla risposta di BumbleBee.

Il mio si basa su un semplice comando di sistema. Tutto ciò che alimenta la funzione è il nome del tuo 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"));

L'output della funzione sarebbe simile "/Users/you/Path/To/Script". Spero che questo aiuti chiunque altro potrebbe essersi bloccato.


1

Il herepacchetto fornisce la here()funzione, che restituisce la directory principale del progetto in base ad alcune euristiche.

Non è la soluzione perfetta, dal momento che non trova la posizione della sceneggiatura, ma è sufficiente per alcuni scopi, quindi ho pensato di metterlo qui.


1
Grazie per questa risposta La posizione dello script corrente può essere sfruttata effettuando una chiamata alla here::set_here()fonte.
BroVic

0

La maggior parte delle GUI presumono che se ci si trova in una directory e si "apre", fare doppio clic o tentare in altro modo di eseguire un file .R, la directory in cui risiede sarà la directory di lavoro se non diversamente specificato. La GUI del Mac fornisce un metodo per modificare quel comportamento predefinito che è modificabile nel pannello Startup delle Preferenze che imposti in una sessione in esecuzione e diventa effettivo al successivo "avvio". Dovresti anche guardare:

?Startup

La documentazione di RStudio dice:

"Quando viene avviato tramite un'associazione di file, RStudio imposta automaticamente la directory di lavoro sulla directory del file aperto." L'impostazione predefinita prevede che RStudio sia registrato come gestore per i file .R, anche se si parla anche della possibilità di impostare un'associazione predefinita con RStudio per le estensioni .Rdata e .R. Se lo stato "gestore" e lo stato "associazione" sono gli stessi su Linux, non posso dire.

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


4
Sicuramente RStudio non fa questo presupposto.
nico,

1
Si comporta come l'ho descritto sulla mia macchina. Non ho fatto nulla di speciale per le preferenze di RStudio.
IRTFM,

2
Non lo fa su Linux :)
nico

2
"Se avviato tramite un'associazione di file" è la condizione chiave qui. Alcune persone potrebbero avviare Rstudio tramite un collegamento o un comando nel terminale. È necessario aprire il file e avere l'impostazione predefinita per l'apertura dei file .R su Rstudio. Se apri prima Rstudio (quindi apri il file) non funzionerà come descritto. Attraverso un'associazione di file, la risposta di cui sopra funziona su Windows e Mac (probabilmente non Linux come sottolinea @nico - ma non posso verificarlo perché non ho una macchina Linux).
WetlabStudent,

0
dirname(parent.frame(2)$ofile)  

non funziona neanche per me, ma quanto segue (come suggerito in https://stackoverflow.com/a/35842176/992088 ) funziona per me in Ubuntu 14.04

dirname(rstudioapi::getActiveDocumentContext()$path)

1
Error: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'anche in Ubuntu 14.04
Rich Scriven il

Forse puoi provare prima a installare il pacchetto rstudioapi.
Lamothy,

È strano. Sto usando R-3.2.4 in un Ubuntu 14.04 a 32 bit. Spero non sia a causa del sistema operativo o di diverse versioni di R.
Lamothy,

0

Nel caso in cui usi la codifica UTF-8:

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

Devi installare il pacchetto rstudioapi se non l'hai ancora fatto.


Errore in setwd (dirname (percorso)): impossibile cambiare la directory di lavoro
tavalendo

`` Errore in setwd (dirname (percorso)): impossibile cambiare la directory di lavoro`` la tua soluzione non funziona, controlla la tua risposta
Mr S Coder

0

Ecco un altro modo per farlo:

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()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.