R-Befehl zum Festlegen des Arbeitsverzeichnisses auf den Speicherort der Quelldatei in Rstudio

135

Ich arbeite an einigen Tutorials in R. Jeder R-Code ist in einem bestimmten Ordner enthalten. Dort befinden sich Datendateien und andere Dateien. Ich möchte die .rDatei öffnen und als Quelle verwenden, damit ich das Arbeitsverzeichnis in Rstudio nicht wie unten gezeigt ändern muss:

Geben Sie hier die Bildbeschreibung ein

Gibt es eine Möglichkeit, mein Arbeitsverzeichnis automatisch in R anzugeben?

Stat-R
quelle
Dies ist wahrscheinlich ein Betrug. siehe?setwd ?getwd
Brandon Bertelsen
3
Kein Betrüger, das Poster möchte load.rdata-Dateien im selben Ordner haben, nicht sourcemit dem Arbeitsverzeichnis, das auf den Pfad der Quelldatei festgelegt ist.
Ruben

Antworten:

76

Um den Speicherort eines Skripts zu ermitteln, das bezogen wird, können Sie utils::getSrcDirectoryoder verwenden utils::getSrcFilename. Das Ändern des Arbeitsverzeichnisses in das der aktuellen Datei kann also folgendermaßen erfolgen:

setwd(getSrcDirectory()[1])

Dies gilt nicht in RStudio funktionieren , wenn Sie starten Sie den Code anstatt Quelle es ing. Dafür müssen Sie verwenden rstudioapi::getActiveDocumentContext.

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

Für diese zweite Lösung müssen Sie natürlich RStudio als IDE verwenden.

Richie Cotton
quelle
Ihre eigene Antwort unter stackoverflow.com/a/35842176/1247080 funktioniert (man muss jedoch den Verzeichnisnamen angeben ). Ich habe es hinzugefügt
Stat-R
Funktioniert bei mir nicht Ich bekommeError: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'
Andru
2
Beachten Sie, dass beim Ausführen getActiveDocumentContext()in der Konsole in RStudio der Pfad als gemeldet wird ''. Wenn Sie jedoch die Codezeile im Editorabschnitt ausführen, wird sie wie erwartet ausgeführt. Dies kann @Andru 's Kommentar
Megatron
1
@giac_man Es hört sich so an, als würden Sie eine sehr alte Version des rstudioapiPakets verwenden. Versuchen Sie, auf die neueste Version zu aktualisieren.
Richie Cotton
1
@mjs Oben auf der Konsole sollte das aktuelle Arbeitsverzeichnis angezeigt werden. Rechts davon ist ein kleiner Pfeil. Klicken Sie darauf, um das aktuelle Arbeitsverzeichnis im Dateibrowser anzuzeigen.
Richie Cotton
62

Ich weiß, dass diese Frage veraltet ist, aber ich habe auch nach einer Lösung dafür gesucht, und Google listet diese ganz oben auf:

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

Fügen Sie das irgendwo in die Datei ein (am besten jedoch am Anfang), damit das wd entsprechend dieser Datei geändert wird.

Den Kommentaren zufolge funktioniert dies möglicherweise nicht auf jeder Plattform (Windows scheint zu funktionieren, Linux / Mac für einige). Beachten Sie, dass diese Lösung zum "Sourcing" der Dateien dient und nicht unbedingt zum Ausführen von Chunks in dieser Datei.

Siehe auch Dateiname und Pfad der Quelldatei abrufen

Hummel
quelle
99
hat auch bei mir nicht funktioniert:Error in dirname(parent.frame(2)$ofile) : a character vector argument expected
tumultous_rooster
4
Gleiches Problem hier wie bei @Matt O'Brien unter Linux.
Patapouf_ai
3
Funktioniert perfekt, wenn es bezogen wird.
m-dz
2
Funktionierte für mich in RStudio v1.0.143 unter Windows 10. Wenn Sie "Quelle beim Speichern" auswählen, funktioniert dies einwandfrei (Sie können das erkannte Verzeichnis mit "cat" ausdrucken). Wenn Sie die Zeilen auswählen und dann ausführen, ist das Ergebnis null.
Contango
2
Dies funktioniert bei einem Mac bei der Beschaffung einer Datei. Wie @Contango oben ausgeführt hat, funktioniert dies jedoch nicht, wenn der Code interaktiv ausgeführt wird, indem ein Block markiert und Befehlstaste + Eingabetaste gedrückt wird. In diesem Fall gibt es keine Quelldatei, aus der das Arbeitsverzeichnis abgerufen werden kann, da Sie keine Datei beziehen. In der Antwort müssen keine plattformspezifischen Einschränkungen angegeben werden.
bmosov01
7
dirname(rstudioapi::getActiveDocumentContext()$path)

funktioniert für mich, aber wenn Sie rstudioapi nicht verwenden möchten und sich nicht in einem Projekt befinden, können Sie das Symbol ~ in Ihrem Pfad verwenden. Das Symbol ~ bezieht sich auf das Standard-RStudio-Arbeitsverzeichnis (zumindest unter Windows).

RStudio-Optionen

Wenn Ihr RStudio-Arbeitsverzeichnis "D: / Documents" lautet, setwd("~/proyect1") lautet es setwd ("D: / Documents / proyect1").

Sobald Sie dies festgelegt haben, können Sie zu einem Unterverzeichnis navigieren : read.csv("DATA/mydata.csv"). Ist das gleiche wie read.csv("D:/Documents/proyect1/DATA/mydata.csv").

Wenn Sie zu einem übergeordneten Ordner navigieren möchten, können Sie verwenden "../". Beispielsweise:read.csv("../olddata/DATA/mydata.csv") das ist das gleiche wieread.csv("D:/Documents/oldata/DATA/mydata.csv")

Dies ist der beste Weg für mich, Skripte zu codieren, egal welchen Computer Sie verwenden.

Juan Pueyo
quelle
6

Für rstudio können Sie Ihr Arbeitsverzeichnis mit rstudioapi automatisch wie folgt auf das Skriptverzeichnis einstellen :

library(rstudioapi)

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

Dies funktioniert beim Ausführen oder Quellen Ihrer Datei.

Sie müssen zuerst das Paket rstudioapi installieren. Beachten Sie, dass ich den Pfad drucke, um 100% sicher zu sein, dass ich am richtigen Ort bin. Dies ist jedoch optional.

gagarine
quelle
Fehler in setwd (dirname (current_path)): Arbeitsverzeichnis kann nicht geändert werden
tavalendo
@helmo Überprüfen Sie, ob Ihr Benutzer über Schreibrechte für das Zielverzeichnis verfügt.
Gagarine
5

Die Lösung

dirname(parent.frame(2)$ofile)

Ich arbeite nicht für mich.

Ich verwende einen Brute-Force-Algorithmus, funktioniert aber:

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)

Einfacher beim Durchsuchen eines Verzeichnisses:

Dirname <- "subdir_name"
Dirs <- list.dirs(path=file.path("~"),recursive=T)
dir_wd <- names(unlist(sapply(Dirs,grep,pattern=Dirname))[1])
namu.net
quelle
1
Das Problem bei dieser Lösung ist, dass sie sehr langsam ist. Das Suchen nach allen Dateien und das Speichern in einer Variablen beansprucht ebenfalls viel Speicher.
Tavalendo
4

Wenn Sie unter Linux arbeiten, können Sie Folgendes versuchen:

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

Für mich geht das.

Taz
quelle
1
Dies gibt nur Ihr Home-Verzeichnis (wo Ihre Shell beginnt).
Caner
Es gibt den Pfad zu dem Verzeichnis an, in dem sich das von Ihnen ausgeführte Skript befindet.
Taz
2
pwd steht für aktuelles Arbeitsverzeichnis. Dadurch wird das Verzeichnis auf das aktuelle Verzeichnis der Shell gesetzt.
PeterVermont
pwdfunktioniert auch in PowerShell (das derzeit unter Windows als Standard-Shell gilt), wo es ein Alias ​​für ist Get-Location.
BroVic
3

Ich habe nur nach einer Lösung für dieses Problem gesucht und bin auf diese Seite gekommen. Ich weiß, dass es veraltet ist, aber die vorherigen Lösungen waren unbefriedigend oder haben bei mir nicht funktioniert. Hier ist meine Arbeit bei Interesse.

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
quelle
Gibt es einen Grund, warum Sie nicht nur verwenden setwd( dirname(filepath) )?
Jodis
3

Mir ist klar, dass dies ein alter Thread ist, aber ich hatte ein ähnliches Problem mit der Notwendigkeit, das Arbeitsverzeichnis festzulegen, und konnte keine der Lösungen für mich zum Laufen bringen. Folgendes hat funktioniert, falls später jemand anderes darauf stößt:

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

Es ist ein bisschen kompliziert, aber im Grunde werden Systembefehle verwendet, um das Arbeitsverzeichnis abzurufen und in dummyfile.txt zu speichern. Dann liest R diese Datei mit data.table :: fread. Der Rest bereinigt nur das, was in die Datei gedruckt wurde, so dass nur noch der Verzeichnispfad übrig bleibt.

Ich musste R in einem Cluster ausführen, sodass ich nicht wissen konnte, in welchem ​​Verzeichnis ich landen würde (Jobs erhalten eine Nummer und einen Rechenknoten). Das hat den Trick für mich getan.

Katie Renwick
quelle
2

Ich verstehe, dass dies veraltet ist, aber ich konnte die früheren Antworten nicht sehr zufriedenstellend zum Laufen bringen, deshalb wollte ich meine Methode einbringen, falls jemand anderes auf den gleichen Fehler stößt, der in den Kommentaren zu BumbleBees Antwort erwähnt wurde.

Meins basiert auf einem einfachen Systembefehl. Alles, was Sie der Funktion geben, ist der Name Ihres Skripts:

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"));

Die Ausgabe der Funktion würde so aussehen "/Users/you/Path/To/Script". Hoffe, das hilft allen anderen, die stecken geblieben sind.

Tgsmith61591
quelle
1

Das herePaket enthält die here()Funktion, die Ihr Projektstammverzeichnis basierend auf einigen Heuristiken zurückgibt.

Nicht die perfekte Lösung, da es den Speicherort des Skripts nicht findet, aber für einige Zwecke ausreicht, dachte ich, ich würde es hier einfügen.

Wille
quelle
1
Danke für diese Antwort. Der Speicherort des aktuellen Skripts kann durch einen Anruf here::set_here()in der Quelle genutzt werden.
BroVic
0

Die meisten GUIs gehen davon aus, dass, wenn Sie sich in einem Verzeichnis befinden und eine .R-Datei "öffnen", doppelklicken oder auf andere Weise versuchen, sie auszuführen, das Verzeichnis, in dem sie sich befindet, das Arbeitsverzeichnis ist, sofern nicht anders angegeben. Die Mac-GUI bietet eine Methode zum Ändern des Standardverhaltens, das im Startfenster der Einstellungen geändert werden kann, das Sie in einer laufenden Sitzung festgelegt haben und das beim nächsten "Start" wirksam wird. Sie sollten sich auch Folgendes ansehen:

?Startup

In der RStudio-Dokumentation heißt es:

"Beim Start über eine Dateizuordnung setzt RStudio das Arbeitsverzeichnis automatisch auf das Verzeichnis der geöffneten Datei." Die Standardeinstellung ist, dass RStudio als Handler für .R-Dateien registriert wird. Es wird jedoch auch die Möglichkeit erwähnt, eine Standard- "Zuordnung" zu RStudio für .Rdata- und .R-Erweiterungen festzulegen. Ob der Status "Handler" und der Status "Zuordnung" unter Linux identisch sind, kann ich nicht sagen.

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

IRTFM
quelle
4
Sicher geht RStudio nicht davon aus.
Nico
1
Es verhält sich so, wie ich es auf meinem Computer beschrieben habe. Ich habe nichts Besonderes an den RStudio-Einstellungen vorgenommen.
IRTFM
2
Tut das nicht unter Linux :)
Nico
2
"Beim Start über eine Dateizuordnung" ist hier die Schlüsselbedingung. Einige Leute starten Rstudio möglicherweise über eine Verknüpfung oder einen Befehl im Terminal. Sie müssen die Datei öffnen und die Standardeinstellung für das Öffnen von .R-Dateien ist Rstudio. Wenn Sie zuerst Rstudio öffnen (und dann die Datei öffnen), funktioniert es nicht wie beschrieben. Durch eine Dateizuordnung funktioniert die obige Antwort unter Windows und Mac (möglicherweise nicht unter Linux, wie @nico hervorhebt - aber ich kann dies nicht überprüfen, da ich keinen Linux-Computer habe).
WetlabStudent
0
dirname(parent.frame(2)$ofile)  

funktioniert auch nicht für mich, aber das Folgende (wie in https://stackoverflow.com/a/35842176/992088 vorgeschlagen ) funktioniert für mich in Ubuntu 14.04

dirname(rstudioapi::getActiveDocumentContext()$path)
Lamothy
quelle
1
Error: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'auch in Ubuntu 14.04
Rich Scriven
Vielleicht können Sie zuerst versuchen, das rstudioapi-Paket zu installieren.
Lamothy
Das ist seltsam. Ich verwende R-3.2.4 in einem 32-Bit-Ubuntu 14.04. Ich hoffe, es liegt nicht am Betriebssystem oder verschiedenen Versionen von R.
Lamothy
0

Wenn Sie die UTF-8-Codierung verwenden:

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

Sie müssen das Paket rstudioapi installieren, wenn Sie es noch nicht getan haben.

Jormaga
quelle
Fehler in setwd (dirname (path)): Arbeitsverzeichnis kann nicht geändert werden
tavalendo
`` `Fehler in setwd (dirname (Pfad)): Arbeitsverzeichnis kann nicht geändert werden`` Ihre Lösung funktioniert nicht Bitte überprüfen Sie Ihre Antwort
Mr S Coder
0

Hier ist eine andere Möglichkeit:

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
quelle