Ich schreibe oft R-Skripte, die viel Ausgabe erzeugen. Ich finde es sauberer, diese Ausgabe in ein eigenes Verzeichnis zu stellen. Was ich unten geschrieben habe, prüft, ob ein Verzeichnis vorhanden ist, und verschiebt es, oder erstellt das Verzeichnis und verschiebt es dann. Gibt es einen besseren Weg, dies zu erreichen?
mainDir <- "c:/path/to/main/dir"
subDir <- "outputDirectory"
if (file.exists(subDir)){
setwd(file.path(mainDir, subDir))
} else {
dir.create(file.path(mainDir, subDir))
setwd(file.path(mainDir, subDir))
}
setwd()
R-Code verwenden - dies widerspricht im Grunde der Idee, ein Arbeitsverzeichnis zu verwenden, da Sie Ihren Code nicht mehr einfach zwischen Computern verschieben können..bat
Datei, die der Endbenutzer niemals ändern muss.setwd
mit Netzwerkpfaden arbeiten. Sie müssen nur Pfade angeben, um Ergebnisse zu speichern und trotzdem mit dem aktuellen Pfad zu arbeiten (dem Pfad, der beim Start der R-Sitzung festgelegt wurde). Oder starten Sie R mit dem gewünschten Arbeitsverzeichnis.out_dir <- "path/to/output/directory"
und dann verwendenwrite.table(file = file.path(out_dir,"table_1.csv"), ...)
. Oder sogarout_file <- function(fnm) file.path("path/to/output/directory", fnm)
und dannwrite.table(file = out_file("table_1.csv"), ...)
(ähnliche Methode verwende ich bei der Arbeit mit Netzwerklaufwerken).Antworten:
Verwendung
showWarnings = FALSE
:dir.create()
stürzt nicht ab, wenn das Verzeichnis bereits vorhanden ist, sondern druckt nur eine Warnung aus. Wenn Sie also mit Warnungen leben können, ist es kein Problem, dies einfach zu tun:quelle
showWarnings = FALSE
dass dadurch auch andere Warnungen ausgeblendet werden, z. B., dass das Verzeichnis nicht erstellt werden kann.dir.create("test1/test2/test3/", recursive=TRUE)
?suppressWarnings(<statement>)
unterdrückt aber Warnungen nur für diese Aussage.Ab dem 16. April 2015 gibt es mit der Veröffentlichung
R 3.2.0
eine neue Funktion namensdir.exists()
. Um diese Funktion zu verwenden und das Verzeichnis zu erstellen, falls es nicht vorhanden ist, können Sie Folgendes verwenden:Dies wird zurückgegeben,
FALSE
wenn das Verzeichnis bereits vorhanden ist oder nicht erstellt werden kann undTRUE
wenn es nicht vorhanden war, aber erfolgreich erstellt wurde.Beachten Sie, dass Sie einfach überprüfen können, ob das Verzeichnis vorhanden ist
quelle
ifelse()
für nicht vektorisierte Verzweigungen zu verwenden.|
anstelle von Skalar||
. Es funktioniert, ist aber eine schlechte Praxis.|
, ist die Vektorisierung der Grund, warum sie||
manchmal nicht funktioniert ? Ich weiß, dass dies kein Thema ist, aber ich bin einfach zu eifrig, es herauszufinden. Ich werde auf jeden Fall mehr über Vektorisierung lesen. Dankeifelse
?In Bezug auf die allgemeine Architektur würde ich die folgende Struktur in Bezug auf die Verzeichniserstellung empfehlen. Dies deckt die meisten potenziellen Probleme ab, und alle anderen Probleme bei der Verzeichniserstellung werden vom
dir.create
Aufruf erkannt .Beachten Sie auch, dass
~/foo
ein Aufruf vondir.create('~/foo/bar')
fehlschlägt , wenn er nicht vorhanden ist , wenn er nicht vorhanden istrecursive = TRUE
.quelle
Hier ist die einfache Prüfung , und erstellt das Verzeichnis , wenn nicht vorhanden ist :
quelle
Die Verwendung von file.exists () zum Testen der Existenz des Verzeichnisses ist ein Problem im ursprünglichen Beitrag. Wenn subDir den Namen einer vorhandenen Datei enthält (und nicht nur einen Pfad), gibt file.exists () TRUE zurück, aber der Aufruf von setwd () schlägt fehl, da Sie das Arbeitsverzeichnis nicht so einstellen können, dass es auf eine Datei verweist.
Ich würde die Verwendung von file_test (op = "- d", subDir) empfehlen, das "TRUE" zurückgibt, wenn subDir ein vorhandenes Verzeichnis ist, aber FALSE, wenn subDir eine vorhandene Datei oder eine nicht vorhandene Datei oder ein nicht vorhandenes Verzeichnis ist. Ebenso kann die Suche nach einer Datei mit op = "- f" durchgeführt werden.
Wie in einem anderen Kommentar beschrieben, ist das Arbeitsverzeichnis außerdem Teil der R-Umgebung und sollte vom Benutzer gesteuert werden, nicht von einem Skript. Skripte sollten im Idealfall die R-Umgebung nicht ändern. Um dieses Problem zu beheben, verwende ich möglicherweise options (), um ein global verfügbares Verzeichnis zu speichern, in dem ich meine gesamte Ausgabe haben möchte.
Betrachten Sie daher die folgende Lösung, bei der someUniqueTag nur ein vom Programmierer definiertes Präfix für den Optionsnamen ist, sodass es unwahrscheinlich ist, dass bereits eine Option mit demselben Namen vorhanden ist. (Wenn Sie beispielsweise ein Paket mit dem Namen "filer" entwickelt haben, können Sie filer.mainDir und filer.subDir verwenden.)
Der folgende Code wird verwendet, um Optionen festzulegen, die später in anderen Skripten verwendet werden können (wodurch die Verwendung von setwd () in einem Skript vermieden wird), und um den Ordner bei Bedarf zu erstellen:
In jedem nachfolgenden Skript, das eine Datei in subDir bearbeiten muss, können Sie dann Folgendes verwenden:
Diese Lösung verlässt das Arbeitsverzeichnis unter der Kontrolle des Benutzers.
quelle
Ich hatte ein Problem mit R 2.15.3, bei dem beim Versuch, eine Baumstruktur rekursiv auf einem freigegebenen Netzlaufwerk zu erstellen, ein Berechtigungsfehler angezeigt wurde.
Um diese Kuriosität zu umgehen, erstelle ich die Struktur manuell.
quelle
Einzeiler:
if (!dir.exists(output_dir)) {dir.create(output_dir)}
Beispiel:
quelle
Um herauszufinden, ob ein Pfad ein gültiges Verzeichnis ist, versuchen Sie:
file.info
kümmert sich nicht um einen Schrägstrich am Ende.file.exists
Unter Windows schlägt ein Verzeichnis fehl, wenn es mit einem Schrägstrich endet und ohne dieses erfolgreich ist. Dies kann also nicht verwendet werden, um festzustellen, ob ein Pfad ein Verzeichnis ist.quelle
dir.create()
Teil nicht enthalten ist)? Sind die Aussagen falsch oder werden sie nur als nicht hilfreich angesehen, um die vorliegende Frage zu lösen?