Często piszę skrypty R, które generują wiele wyników. Uważam, że łatwiej jest umieścić te dane wyjściowe we własnych katalogach. To, co napisałem poniżej, sprawdzi istnienie katalogu i przejdzie do niego lub utworzy katalog, a następnie przejdzie do niego. Czy istnieje lepszy sposób na to?
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()
w kodzie R - to w zasadzie przeczy idei używania katalogu roboczego, ponieważ nie możesz już łatwo przenosić kodu między komputerami..bat
plikiem, którego użytkownik nigdy nie będzie musiał modyfikować.setwd
pracować ze ścieżkami sieciowymi. Wystarczy podać ścieżki, aby zapisać wyniki i nadal pracować z bieżącą ścieżką (tą, która jest ustalana przy rozpoczęciu sesji R.) Lub uruchom R z pożądanym katalogiem roboczym.out_dir <- "path/to/output/directory"
a następnie użyjwrite.table(file = file.path(out_dir,"table_1.csv"), ...)
. Lub nawetout_file <- function(fnm) file.path("path/to/output/directory", fnm)
wtedywrite.table(file = out_file("table_1.csv"), ...)
(podobna metoda, której używam podczas pracy z dyskami sieciowymi).Odpowiedzi:
Użyj
showWarnings = FALSE
:dir.create()
nie ulega awarii, jeśli katalog już istnieje, po prostu wypisuje ostrzeżenie. Jeśli więc możesz żyć z widzeniem ostrzeżeń, nie ma problemu z robieniem tego:źródło
showWarnings = FALSE
że korzystanie z tego spowoduje ukrycie również innych ostrzeżeń, takich jak niemożność utworzenia katalogu.dir.create("test1/test2/test3/", recursive=TRUE)
?suppressWarnings(<statement>)
ostrzeżenia tylko dla tego stwierdzenia.Od 16 kwietnia 2015 r. Wraz z wydaniem
R 3.2.0
pojawiła się nowa funkcja o nazwiedir.exists()
. Aby użyć tej funkcji i utworzyć katalog, jeśli nie istnieje, możesz użyć:Będzie to powrót
FALSE
jeśli katalog już istnieje lub jest uncreatable, aTRUE
jeżeli nie istniał, ale został pomyślnie utworzony.Pamiętaj, że aby po prostu sprawdzić, czy katalog istnieje, możesz użyć
źródło
ifelse()
do rozgałęzień niewektoryzowanych.|
zamiast skalara||
. Działa, ale jest złą praktyką.|
, czy wektoryzacja jest powodem, dla którego||
czasami nie działa ? Wiem, że to nie jest temat, ale jestem zbyt chętny, aby się dowiedzieć. Zdecyduję się przejść i przeczytać więcej o wektoryzacji. Dziękiifelse
?Jeśli chodzi o ogólną architekturę, poleciłbym następującą strukturę w odniesieniu do tworzenia katalogów. Obejmuje to większość potencjalnych problemów, a wszelkie inne problemy z tworzeniem katalogu zostaną wykryte przez
dir.create
połączenie.Należy również pamiętać, że jeśli
~/foo
nie istnieje, wywołaniedir.create('~/foo/bar')
nie powiedzie się, chyba że zostanie to określonerecursive = TRUE
.źródło
Oto check prosty , i tworzy dir jeśli nie istnieje:
źródło
Użycie file.exists () do testowania istnienia katalogu jest problemem w oryginalnym poście. Jeśli subDir zawiera nazwę istniejącego pliku (a nie tylko ścieżki), file.exists () zwróci TRUE, ale wywołanie setwd () zakończy się niepowodzeniem, ponieważ nie można ustawić katalogu roboczego tak, aby wskazywał na plik.
Poleciłbym użycie test_pliku (op = "- d", subDir), który zwróci „PRAWDA”, jeśli subDir jest istniejącym katalogiem, ale FALSE, jeśli subDir jest istniejącym plikiem lub nieistniejącym plikiem lub katalogiem. Podobnie, sprawdzanie pliku można wykonać op = "- f".
Ponadto, jak opisano w innym komentarzu, katalog roboczy jest częścią środowiska R i powinien być kontrolowany przez użytkownika, a nie skrypt. Skrypty nie powinny idealnie zmieniać środowiska R. Aby rozwiązać ten problem, mógłbym użyć options () do przechowywania globalnie dostępnego katalogu, w którym chciałbym mieć wszystkie moje dane wyjściowe.
Rozważmy zatem następujące rozwiązanie, w którym someUniqueTag jest tylko przedrostkiem zdefiniowanym przez programistę dla nazwy opcji, co sprawia, że jest mało prawdopodobne, aby opcja o tej samej nazwie już istniała. (Na przykład, jeśli tworzysz pakiet o nazwie „filer”, możesz użyć filer.mainDir i filer.subDir).
Poniższy kod zostanie użyty do ustawienia opcji, które będą dostępne później w innych skryptach (unikając w ten sposób użycia setwd () w skrypcie), i do utworzenia folderu, jeśli to konieczne:
Następnie w każdym kolejnym skrypcie, który musiał manipulować plikiem w katalogu subDir, możesz użyć czegoś takiego:
To rozwiązanie pozostawia katalog roboczy pod kontrolą użytkownika.
źródło
Miałem problem z wersją 2.15.3, w wyniku której podczas próby rekurencyjnego tworzenia struktury drzewa na współużytkowanym dysku sieciowym dostałem błąd uprawnień.
Aby obejść tę dziwność, ręcznie tworzę strukturę;
źródło
Jednowarstwowy:
if (!dir.exists(output_dir)) {dir.create(output_dir)}
Przykład:
źródło
Aby dowiedzieć się, czy ścieżka jest prawidłowym katalogiem, spróbuj:
file.info
nie dba o kreskę na końcu.file.exists
w systemie Windows nie powiedzie się katalog, jeśli zakończy się ukośnikiem i bez niego odniesie sukces. Nie można tego użyć do ustalenia, czy ścieżka jest katalogiem.źródło
dir.create()
części)? Czy stwierdzenia są błędne lub po prostu uważane za nieprzydatne w rozwiązaniu danego pytania?