Я часто пишу сценарии на R, которые генерируют много выходных данных. Я считаю чище поместить этот вывод в свои собственные каталоги. То, что я написал ниже, проверит наличие каталога и перейдет в него, или создаст каталог и затем перейдет в него. Есть ли лучший способ приблизиться к этому?
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 - это в основном отрицает идею использования рабочего каталога, потому что вы больше не можете легко перемещать свой код между компьютерами..bat
файл, который конечному пользователю никогда не придется изменять.setwd
работать с сетевыми путями. Вам просто нужно указать пути, чтобы сохранить результаты и по-прежнему работать с текущим путем (который устанавливается при запуске сеанса R). Или запустить R с желанием рабочего каталога.out_dir <- "path/to/output/directory"
а затем использоватьwrite.table(file = file.path(out_dir,"table_1.csv"), ...)
. Или дажеout_file <- function(fnm) file.path("path/to/output/directory", fnm)
и тогдаwrite.table(file = out_file("table_1.csv"), ...)
(аналогичный метод я использую при работе с сетевыми дисками).Ответы:
Используйте
showWarnings = FALSE
:dir.create()
не вылетает, если каталог уже существует, он просто выводит предупреждение. Так что если вы можете видеть предупреждения, нет проблем с этим:источник
showWarnings = FALSE
в виду, что при использовании этого также будут скрываться другие предупреждения, например, что каталог не может быть создан.dir.create("test1/test2/test3/", recursive=TRUE)
?suppressWarnings(<statement>)
будет подавлять предупреждения только для этого утверждения.По состоянию на 16 апреля 2015 года, с выпуском
R 3.2.0
новой функции называетсяdir.exists()
. Чтобы использовать эту функцию и создать каталог, если он не существует, вы можете использовать:Он вернется,
FALSE
если каталог уже существует илиTRUE
его невозможно создать , и если он не существует, но был успешно создан.Обратите внимание, что для простой проверки наличия каталога вы можете использовать
источник
ifelse()
для не векторизованного ветвления.|
вместо скаляра||
. Это работает, но это плохая практика.|
, является ли векторизация причиной, по которой||
иногда это не работает ? Я знаю, что это не по теме, но я очень хочу это выяснить. Я пойду дефо и пойду больше о векторизации. Спасибоifelse
?С точки зрения общей архитектуры, я бы рекомендовал следующую структуру в отношении создания каталогов. Это покроет большинство потенциальных проблем, и любые другие проблемы с созданием каталога будут обнаружены
dir.create
вызовом.Также имейте в виду, что если
~/foo
его не существует, вызовdir.create('~/foo/bar')
не будет выполнен, если вы не укажетеrecursive = TRUE
.источник
Вот простая проверка , и создает каталог, если не существует:
источник
Использование file.exists () для проверки существования каталога является проблемой в оригинальном посте. Если subDir содержит имя существующего файла (а не просто путь), file.exists () вернет TRUE, но вызов setwd () завершится неудачно, потому что вы не можете установить рабочий каталог так, чтобы он указывал на файл.
Я бы порекомендовал использовать file_test (op = "- d", subDir), который будет возвращать "TRUE", если subDir является существующим каталогом, и FALSE, если subDir является существующим файлом или несуществующим файлом или каталогом. Аналогично, проверка файла может быть выполнена с помощью op = "- f".
Кроме того, как описано в другом комментарии, рабочий каталог является частью среды R и должен контролироваться пользователем, а не сценарием. Скрипты в идеале не должны изменять среду R. Чтобы решить эту проблему, я мог бы использовать options () для хранения общедоступного каталога, в котором я хотел получить весь свой вывод.
Итак, рассмотрим следующее решение, где someUniqueTag - это определенный программистом префикс для имени опции, что делает маловероятным, чтобы опция с таким именем уже существовала. (Например, если вы разрабатывали пакет с именем «filer», вы можете использовать filer.mainDir и filer.subDir).
Следующий код будет использоваться для установки параметров, доступных позже для использования в других сценариях (таким образом, избегая использования setwd () в сценарии), и для создания папки при необходимости:
Затем в любом последующем скрипте, который должен был манипулировать файлом в subDir, вы можете использовать что-то вроде:
Это решение оставляет рабочий каталог под контролем пользователя.
источник
У меня была проблема с R 2.15.3, из-за которой при попытке рекурсивно создать древовидную структуру на общем сетевом диске я получил ошибку разрешения.
Чтобы обойти эту странность, я вручную создаю структуру;
источник
Один лайнер:
if (!dir.exists(output_dir)) {dir.create(output_dir)}
Пример:
источник
Чтобы узнать, является ли путь допустимым каталогом, попробуйте:
file.info
не заботится о слэше на конце.file.exists
в Windows произойдет сбой каталога, если он завершится косой чертой и преуспеет без него. Так что это не может использоваться, чтобы определить, является ли путь каталогом.источник
dir.create()
части, кроме )? Являются ли утверждения неправильными или просто считаются бесполезными для решения поставленного вопроса?