Rstudio имеет разрешение Excelfile - XLconnect - PullRequest
3 голосов
/ 06 августа 2020

Поскольку я обновил RStudio в прошлый день, я не могу заставить Rstudio отказаться от своих файлов excelfiles.

Я безрезультатно пробовал следующее:

  unlink(fileName, recursive = TRUE)
  file.info(fileName)
  file.remove(fileName)

file.info дает следующее:

size 2383465
isdir FALSE
mode 666
mtime 2020-08-06 11:02:03
ctime 2020-06-16 13:00:22
atime 2020-08-06 10:40:30
exe no

RStudio установлен администратором, но я лично не обладаю правами администратора в моей организации. file.remove не разрешен даже с отключением (но это не каталог, поэтому ...). И я действительно не хочу его удалять, просто заставьте Rstudio сбросить удержание. Файл будет изменен в Excel (и сохранен, что недопустимо, поскольку его содержит RStudio).

UPDATE:

Я думаю, это ошибка, поэтому все мои поиски в Google не нашли решения до сих пор. Я полагаю, что один обходной путь можно было бы исправить, если бы я мог программно повторно инициализировать JVM-экземпляр. (например, .rs.restartR() сбросить удержание R: s в файле)

ОБНОВЛЕНИЕ 2:

Точно такая же ошибка происходит с пакетом openxlsx, который не зависит от Java так что проблема, вероятно, связана с R.

R version 3.6.3 (2020-02-29)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18362)

Matrix products: default

locale:
[1] LC_COLLATE=Swedish_Finland.1252  LC_CTYPE=Swedish_Finland.1252    LC_MONETARY=Swedish_Finland.1252
[4] LC_NUMERIC=C                     LC_TIME=Swedish_Finland.1252 

UPDATE 3:

Здесь все еще нет прорыва, я решил блокировку с помощью небольшого хакерского кода, но он решает немедленная проблема, по крайней мере:

  .rs.restartR()
  source("~/.Rprofile")

ОБНОВЛЕНИЕ 4:

Если я сделаю это:

library(XLConnect)

wb <- loadWorkbook("Cars.xlsx", create = TRUE)
createSheet(wb, "Data")
writeWorksheet(wb, cars, "Data")
saveWorkbook(wb)

При первом открытии файла я могу сохранить, не закрывая R-сессия. Если я это сделаю, откройте файл Excel и сохраните, а затем повторно запустите вышеуказанный код, мой R-сеанс удерживает блокировку разрешений. Таким образом, у него есть что-то в пределах области сохранения файла.

1 Ответ

3 голосов
/ 12 августа 2020

Следующий вызов функции внутри XLconnect очищает Java -сессию:

xlcFreeMemory()

gc() сам по себе не работал, но xlcFreeMemory также запускает приведенный ниже код, который, я думаю, это то, что скрепляет сделку:

J("java.lang.Runtime")$getRuntime()$gc()
...