В разрешении отказано при использовании файла.удалить в R после обновления до 4.1.1

#sql #r

Вопрос:

После обновления с 3.6.3 до 4.1.1 еженедельный скрипт, который я запускаю, сломался. В частности, это вызывает ошибку:

 In file.remove("temp.csv") :
  cannot remove file 'temp.csv', reason 'Permission denied'
 

Чтобы вручную удалить файл temp.csv, я получаю файл, используемый rsession.exe ошибка из Windows. Если я перезапущу R в Rstudio, то оба файла.remove() и удаление вручную будут работать.

Возможно, в первую очередь я использую плохую стратегию, но код, вызывающий ошибку, — это бит:

  write_csv(VPTS, "temp.csv")
 VPTS <- read_csv("temp.csv", col_types = cols())
 file.remove("temp.csv")
 

Для контекста VPTS поступает из импорта SQL с использованием SQLFetch (), и все форматы являются ненадежными, сбрасывая его в CSV и используя read_csv (), импортирует его идеально для использования в будущем.

Я уверен, что это не проблема с разрешениями, но что-то в обновленном R не освобождает созданный им файл. Я просто хочу, чтобы мне указали направление для продолжения устранения неполадок на этом этапе.

Комментарии:

1. Я бы, вероятно, воспользовался этим как возможностью взглянуть на другие способы импорта из SQL: dbplyr.tidyverse.org/articles/…

2. у базы R read.csv и write.csv есть те же проблемы?

3. @cory, они этого не делают, поэтому теперь я должен выяснить, что не так с моим пакетом readr. read.csv не соответствует моему нижестоящему использованию, но интересно знать, что, похоже, проблема в пакете.

Ответ №1:

readr версия >=2.0 и >< 2.1 используется vroom для быстрого импорта данных и по умолчанию используется для ленивой загрузки данных, из-за чего файл заблокирован, что не позволяет его удалить. Вам нужно было явно отключить ленивое чтение с помощью

 VPTS <- read_csv("temp.csv", col_types = cols(), lazy=FALSE)
 

Эта информация была упомянута в списке изменений в версии 2.0.0.

На удаление файлов после чтения также влияет лень. В Windows открытые файлы не могут быть удалены до тех пор, пока процесс не откроет файл. Поскольку readr сохраняет файл открытым при ленивом чтении, это означает, что вы не можете читать, а затем немедленно удалите файл. readr в большинстве случаев закроет файл, как только он будет полностью прочитан. Однако, если вы знаете, что хотите иметь возможность удалить файл после чтения, лучше всего передать lazy = FALSE при чтении файла

Примечание об обновлении начиная с версии readr 2.1, отложенное чтение больше не используется по умолчанию (именно из-за подобных ошибок). Это предотвратит возникновение ошибки «отказано в разрешении». Но если вы хотите быстрее считывать данные, теперь вам нужно будет установить lazy=TRUE их явно.

Комментарии:

1. Спасибо, в этом-то и была вся проблема. Извлеченный урок: читайте журналы изменений, когда что-то ломается после обновления.