Die R-Funktion setwd(Verzeichnis) ermöglicht es, das aktuelle Arbeitsverzeichnis (engl. working directory) zu wechseln und ist das Pendant zu getwd. Wenn man sauber arbeiten will, sollte man setwd nicht benutzen.

If the first line of your R script is

setwd("C:\Users\jenny\path\that\only\I\have")

I will come into your office and SET YOUR COMPUTER ON FIRE 🔥.

Warum man diese Aussage von Jenny Bryan beachten sollte und was man tatsächlich benutzen sollte, dazu weiter unten mehr.

In R ist immer ein Verzeichnis das aktuelle Arbeitsverzeichnis, d.h. dieses Verzeichnis ist der Ausgangspunkt für relative Pfade und Dateien. Willst Du eine Datei öffnen und gibst kein Verzeichnis an, dann geht R davon aus, dass sich die Datei im Arbeitsverzeichnis befindet. Relative Pfade bedeuten, dass nicht die gesamte Verzeichnisstruktur angegeben wird, sondern ausgehend von dem aktuellen Verzeichnis. Mit read.csv("Daten/Diagnosen.csv") wird die Datei ‚Diagnosen.csv‘ aus dem Unterordner Daten des aktuellen Verzeichnisses geladen.

Das aktive Arbeitsverzeichnis bekommt man mit dem Befehl getwd().

getwd()
# liefert zum Beispiel "C:/Users/databraineo/Documents"

Will man nun dieses ändern, dann benutzt man einfach setwd und gibt als Parameter einen String mit dem gewünschten Verzeichnis an, also z.B. setwd("C:/temp").

alter_pfad <- getwd()
print(alter_pfad)
setwd("C:/databraineo/Projekte/R")
getwd()

Der Backslash \ funktioniert in setwd nicht

Den Windows-Nutzer ist vielleicht aufgefallen, dass wir hier den Forward-Slash / statt des Backslash \ verwendet haben, wie bei Webadressen. Das liegt daran, dass der Backslash in Strings eine andere Bedeutung hat. Damit werden nämlich Sonderzeichen kodiert, z.B. schreibt „Hello\nWorld“ Hello in die erste und World in eine zweite Zeile, da \n für eine neue Zeile steht. Man nennt das Escape Sequence.

Der Backslash \ im R-Befehl setwd erzeugt eine Fehlermeldung. Es muss der Forward-Slash / in setwd() verwendet werden

Der Backslash „\“ selber kann durch Verdoppelung erzeugt werden, also „\\“. Man könnte das Verzeichnis „C:/temp“ also auch durch „C:\\temp“ darstellen, allerdings ist der Forward-Slash etwas praktischer, da auch die Rückgabe von R, zum Beispiel bei list.files den Forward-Slash verwendet.

Man kann einen Pfad auch mittels der Funktion file.path zusammenbasteln. Als Argumente übergibt man einfach die Ordner.

# Unterverzeichnisse
pfad <- file.path("R","Beispiele")
# das geht auch für absolute Pfade, hier für Windows mit dem Laufwerksbuchstaben
pfad <- file.path("C:","databraineo", "R","Beispiele")
setwd(pfad)
getwd()

Achtung: Portabilität bei Benutzung von setwd()

Absolute Pfade sind immer mit Vorsicht zu geniessen. Stellt euch vor, ihr verschiebt das R-Programm in ein anderes Verzeichnis oder auf einen anderen PC. Oder jemand anderes möchte eurer Skript laufen lassen. Dann muss man alle im Skript verwendeten Verzeichnisse anpassen. Das ist insbesondere lästig und ziemlich fehleranfällig, wenn ihr die Verzeichnisse mitten im Skript definiert bzw. ändert. Jetzt kann man den setwd-Befehl einmal am Anfang vom Skript setzen, aber wie oben beschrieben, ist das immer noch nicht best practice, denn der Aufruf des Skripts auf einem anderen Rechner erfordert (fast) immer eine Anpassung dieser Zeile.

Die sauberste Lösung ist, alle verwendeten Daten in Unterverzeichnissen des Skript-Ordners anzulegen und relative Pfade zu benutzen. Am besten geht das, indem ihr in RStudio ein Projekt anlegt. Denn öffnet man ein Projekt in RStudio, dann ist der Projektorder das Arbeitsverzeichnis.

Das ist aber nicht immer praktikabel. Wenn wir Daten haben, die von mehreren Skripten/Projekten verwendet werden, wollen wir nicht immer eine Kopie von den zum Teil großen Dateien machen. Sinnvoll ist es dann, die Verzeichnisse ganz oben im Skript als Variablen zu definieren. So gibt es nur einen sofort einsehbaren Ort, an dem ihr Änderungen vornehmen müsst.

Datenverzeichnis <- file.path("D:","Daten")
 
#liest dort eine Datei
Daten <- read.csv2(file.path(Datenverzeichnis,"Umfrage.csv")

Warum reichen relative Pfade in einem Projekt noch nicht aus? Das Package here

Here ist ein R-Package, welches die Funktion here() enthält, die im Prinzip file.path() ersetzt. Warum braucht man das denn auch noch, wenn man doch schon mit Projekten arbeitet? Nun, was passiert, wenn man ein R-Skript in einem Unterverzeichnis aufrufen möchte. Dann muss man gegebenenfalls mit .. wieder eine Ebene höher gehen, wenn man zum Beispiel Daten aus einem anderen Unterverzeichnis aufrufen möchte. Schöner wäre es doch, wenn das Projektverzeichnis das Stammverzeichnis wäre, von dem man startet. Und genau das macht here. Die Installation erfolgt wie für jedes Package einmalig mit install.packages("here")

library(here)
library(ggplot2)
 
# Einlesen aus dem Unterverzeichnis Daten
fread(here("Daten","Umfrage.csv"))
 
ggplot(iris, aes(Sepal.Length, Sepal.Width, color = Species)) + geom_point()
# Grafik in Unterverzeichnis Abbildungen speichern
ggsave(here("Abbildungen","Iris.png"), device="png")

Der Code funktioniert nicht nur im Stammverzeichnis des Projekts, sondern auch aus allen Unterverzeichnissen und deren Unterverzeichnissen heraus. Besonders praktisch ist das bei RMarkdown-Projekten.