Проверить наличие директории и создать, если не существует

Я часто нахожу, что пишу сценарии 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)) } 

Использовать showWarnings = FALSE :

 dir.create(file.path(mainDir, subDir), showWarnings = FALSE) setwd(file.path(mainDir, subDir)) 

dir.create() не сбой, если каталог уже существует, он просто выводит предупреждение. Поэтому, если вы можете жить с предупреждением, нет никаких проблем с этим:

 dir.create(file.path(mainDir, subDir)) setwd(file.path(mainDir, subDir)) 

По состоянию на 16 апреля 2015 года с выпуском R 3.2.0 появилась новая функция dir.exists() . Чтобы использовать эту функцию и создать каталог, если он не существует, вы можете использовать:

 ifelse(!dir.exists(file.path(mainDir, subDir)), dir.create(file.path(mainDir, subDir)), FALSE) 

Это вернет FALSE если каталог уже существует или недоступен, и TRUE если он не существует, но был успешно создан.

Обратите внимание: чтобы просто проверить, существует ли каталог, вы можете использовать

 dir.exists(file.path(mainDir, subDir)) 

Что касается общей архитектуры, я бы рекомендовал следующую структуру в отношении создания каталогов. Это будет охватывать большинство потенциальных проблем, и любые другие проблемы с созданием каталогов будут обнаружены dir.create .

 mainDir <- "~" subDir <- "outputDirectory" if (file.exists(paste(mainDir, subDir, "/", sep = "/", collapse = "/"))) { cat("subDir exists in mainDir and is a directory") } else if (file.exists(paste(mainDir, subDir, sep = "/", collapse = "/"))) { cat("subDir exists in mainDir but is a file") # you will probably want to handle this separately } else { cat("subDir does not exist in mainDir - creating") dir.create(file.path(mainDir, subDir)) } if (file.exists(paste(mainDir, subDir, "/", sep = "/", collapse = "/"))) { # By this point, the directory either existed or has been successfully created setwd(file.path(mainDir, subDir)) } else { cat("subDir does not exist") # Handle this error as appropriate } 

Также имейте в dir.create('~/foo/bar') что если ~/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 () в скрипте) и при необходимости создайте папку:

 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)) 

Это решение оставляет рабочий каталог под контролем пользователя.

У меня возникла проблема с R 2.15.3, в результате чего при попытке создать древовидную структуру рекурсивно на общем сетевом диске я получил бы ошибку разрешения.

Чтобы обойти эту странность, я вручную создаю структуру;

 mkdirs <- function(fp) { if(!file.exists(fp)) { mkdirs(dirname(fp)) dir.create(fp) } } mkdirs("H:/foo/bar") 

Вот простую проверку и создает каталог, если он не существует:

 ## Provide the dir name(ie sub dir) that you want to create under main dir: output_dir <- file.path(main_dir, sub_dir) if (!dir.exists(output_dir)){ dir.create(output_dir) } else { print("Dir already exists!") } 

Чтобы выяснить, является ли путь действительным каталогом, попробуйте:

 file.info(cacheDir)[1,"isdir"] 

file.info не заботится о косой черте в конце.

file.exists в Windows будет терпеть неудачу для каталога, если он заканчивается косой чертой, и преуспеть без него. Поэтому это невозможно использовать для определения того, является ли путь каталогом.

 file.exists("R:/data/CCAM/CCAMC160b_echam5_A2-ct-uf.-5t05N.190to240E_level1000/cache/") [1] FALSE file.exists("R:/data/CCAM/CCAMC160b_echam5_A2-ct-uf.-5t05N.190to240E_level1000/cache") [1] TRUE file.info(cacheDir)["isdir"] 
  • Как вычесть месяцы из даты в R?
  • Стандартный способ удаления нескольких элементов из фрейма данных
  • вытащить p-значения и r-квадрат из линейной регрессии
  • Функция не найдена в R doParallel 'foreach' - Ошибка в {: task 1 failed - "не удалось найти функцию" растровый "
  • Добавление нового столбца к каждому элементу в списке таблиц или фреймов данных
  • Использование R для отображения всех файлов с указанным расширением
  • Условно удалить строки Dataframe с R
  • Манекены переменных из строковой переменной
  • Какая польза от этого?
  • Открытие всех файлов в папке и применение функции
  • нумерация по группам
  • Interesting Posts

    Что действительно и что нет в запросе URI?

    Обновление синтаксиса кэшированных данных CSS

    Зачем использовать «virtual» для свойств classа в определениях модели Entity Framework?

    Что означает «DS: » означает в сборке?

    Эмулятор Android Studio не поставляется с Play Store для API 23

    Неверная операция поперечного streamа: Control ‘textBox1’, доступ к которому осуществляется из streamа, отличного от streamа, который был создан на

    Проверка пустого файла на C ++

    Свяжите расширение файла с приложением в Snow Leopard

    Excel 2016: как я могу перемещать данные из строк в столбцы?

    Как включить только часть заголовка изображения в таблицу цифр в Microsoft Word?

    Как запустить (не только установить) приложение для Android с использованием файла .apk?

    Как я могу построить свой тестовый пакет асинхронно?

    Как остановить работу Windows 10 после блокировки с помощью клавиши Win + L

    Зачем использовать onDestroy (), если он не гарантированно называется?

    Как получить выбранный элемент в ListView?

    Давайте будем гением компьютера.