Использование 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 () в сценарии), и для создания папки при необходимости:
mainDir = "c:/path/to/main/dir"
subDir = "outputDirectory"
options(someUniqueTag.mainDir = mainDir)
options(someUniqueTag.subDir = "subDir")
if (!file_test("-d", file.path(mainDir, subDir)){
if(file_test("-f", file.path(mainDir, subDir)) {
stop("Path can't be created because a file with that name already exists.")
} else {
dir.create(file.path(mainDir, subDir))
}
}
Затем в любом последующем скрипте, который должен был манипулировать файлом в subDir, вы можете использовать что-то вроде:
mainDir = getOption(someUniqueTag.mainDir)
subDir = getOption(someUniqueTag.subDir)
filename = "fileToBeCreated.txt"
file.create(file.path(mainDir, subDir, filename))
Это решение оставляет рабочий каталог под контролем пользователя.