In Bezug auf die allgemeine Architektur würde ich die folgende Struktur für die Verzeichniserstellung empfehlen. Dies wird die meisten potenziellen Probleme abdecken, und alle anderen Probleme mit der Verzeichniserstellung werden durch den dir.create
-Aufruf erkannt.
mainDir <- "~"
subDir <- "outputDirectory"
if (file.exists(paste(mainDir, subDir, "/", sep = "/", collapse = "/"))) {
cat("subDir existiert in mainDir und ist ein Verzeichnis")
} else if (file.exists(paste(mainDir, subDir, sep = "/", collapse = "/"))) {
cat("subDir existiert in mainDir, ist aber eine Datei")
# Sie werden wahrscheinlich wollen, dass Sie dies separat behandeln
} else {
cat("subDir existiert nicht in mainDir - wird erstellt")
dir.create(file.path(mainDir, subDir))
}
if (file.exists(paste(mainDir, subDir, "/", sep = "/", collapse = "/"))) {
# Zu diesem Zeitpunkt existierte das Verzeichnis entweder oder wurde erfolgreich erstellt
setwd(file.path(mainDir, subDir))
} else {
cat("subDir existiert nicht")
# Behandeln Sie diesen Fehler entsprechend
}
Denken Sie auch daran, dass wenn ~/foo
nicht existiert, ein Aufruf von dir.create('~/foo/bar')
fehlschlagen wird, es sei denn, Sie geben recursive = TRUE
an.
1 Stimmen
Ich bin mir sicher, dass es eine R-Funktion gibt, die ein temporäres Verzeichnis mit einem zufällig generierten Namen erstellt und den Namen zurückgibt. Ich glaube, es gibt eine ähnliche Funktion, die eine temporäre Datei erstellt. Ich kann sie gerade nicht finden, aber das Databel-Paket (cran.r-project.org/web/packages/DatABEL/index.html) hat eine Funktion get_temporary_file_name.
65 Stimmen
Du solltest nie
setwd()
im R-Code verwenden - es untergräbt im Grunde genommen die Idee der Verwendung eines Arbeitsverzeichnisses, weil du deinen Code nicht mehr leicht zwischen Computern verschieben kannst.7 Stimmen
@hadley Interessantes Thema zum Nachdenken, ich würde Ihre Gedanken zu anderen Methoden zum selben Zweck schätzen. Bei der Arbeit sind alle Computer mit demselben Netzwerk synchronisiert, sodass Dateipfade konsistent sind. Wenn sie es nicht sind, haben wir größere Probleme zu lösen als die Tragbarkeit eines Skripts. In diesem speziellen Beispiel habe ich ein Skript geschrieben, das auf einer Maschine geladen wird, die zwei Jahre lang in unseren Nationalparks herumgetragen wird. Dieses Skript wird Daten aus einer lokalen SQL-Instanz abrufen, einige Verarbeitungen durchführen und eine .csv-Datei ausgeben. Das Endprodukt wird eine
.bat
Datei sein, die der Endbenutzer nie ändern muss.0 Stimmen
@Chase Aber du brauchst nicht
setwd
, um mit Netzwerkpfaden zu arbeiten. Du musst einfach Pfade angeben, um Ergebnisse zu speichern und trotzdem mit dem aktuellen Pfad zu arbeiten (dem, der festgelegt ist, wenn die R-Sitzung gestartet wurde). Oder starte R im gewünschten Arbeitsverzeichnis.1 Stimmen
@Marek - ahh, ich verstehe. Du willst also sagen, dass ich meine Aufrufe von
setwd()
durch etwas wiewrite.table(file = "Pfad/zum/Ausgabeverzeichnis", ...)
ersetzen soll?8 Stimmen
Yep. Oder parametrisieren Sie
out_dir <- "pfad/zum/ausgabe/verzeichnis"
und verwenden Sie dannwrite.table(file = file.path(out_dir,"tabelle_1.csv"), ...)
. Oder sogarout_file <- function(fnm) file.path("pfad/zum/ausgabe/verzeichnis", fnm)
und dannwrite.table(file = out_file("tabelle_1.csv"), ...)
(ähnliche Methode, die ich beim Arbeiten mit Netzlaufwerken verwende).0 Stimmen
@Marek - Nun habe ich etwas Neues gelernt, Zeit nach Hause zu gehen! Vielen Dank für die Tipps, das ist sehr hilfreich.
0 Stimmen
@hadley das ist gut zu wissen. Was ist mit der Verwendung von setwd() auf der obersten Ebene, so dass sich das Arbeitsverzeichnis ändert, wenn Sie den Code einfügen, aber es ist immer noch relativ tragbar? Meiner Meinung nach ist der Hauptgrund für die Verwendung von
setwd()
, wenn Sie an einem Projekt arbeiten, das Pfade benötigt, aber nicht langfristig genug ist, um das Standardverzeichnis von RStudio zu ändern. Gibt es auch technische Probleme bei der Verwendung vonsetwd()
oder handelt es sich eher um ein paradigmatisches Problem? Danke!!0 Stimmen
@PaulHurleyuk, waren Sie auf der Suche nach
tempdir()
undtempfile()
? Theoretisch könntetempdir()
für die Speicherung der Ausgabe verwendet werden, solange die Ausgabe nach Beendigung der R-Sitzung nicht mehr benötigt wird.