【问题标题】:Rstudio holds Excelfile permission - XLconnectRstudio 拥有 Excelfile 权限 - XLconnect
【发布时间】:2020-08-06 08:10:47
【问题描述】:

自从我昨天更新了 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 拥有它)。

更新:

我想这是一个错误,所以到目前为止我所有的谷歌搜索都没有找到解决方案。我想可以解决这个问题的一种解决方法是,如果我可以以编程方式重新初始化 JVM 实例。 (例如,.rs.restartR() 删除文件中的 R:s 保留)

更新 2:

openxlsx-package 也发生了完全相同的错误,它不依赖于 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 

更新 3:

这里仍然没有突破,我已经用一些hacky代码解决了锁,但它至少解决了眼前的问题:

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

更新 4:

如果我这样做:

library(XLConnect)

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

第一次打开文件时,我可以在不关闭 R-session 的情况下保存。如果我这样做,打开 Excel 文件并保存,然后重新运行上面的代码,我的 R-session 持有权限锁。所以它在文件保存的范围内有一些东西。

更新 5:

现在这是一个未解决的问题,可能是仅限 Windows 的错误:

Github - XLconnect

【问题讨论】:

  • R 没有运行时有问题吗?如果是这种情况,则表明它不是与 R 相关的问题。如果是,则应通过在关闭 R 时不保存环境并删除现有的 .Rhistory.Rprofile 文件来解决问题。
  • @Oliver 如果我关闭/重新启动 R 会话,则权限保持被删除,是的。因此,只要打开并保存文件的 R 会话与工作簿有某种连接,我就会遇到问题。这种情况发生在我们升级了 R-studio 和 R 之后。恢复到以前的版本并没有帮助。我不是在拯救环境,所以每次都是一个干净的开始。删除 .Rprofile 听起来像一个真正的痛苦,几乎比疾病更糟糕:p
  • 应该没有必要连续删除。似乎您在会话期间的某个时刻打开了连接,并在此特定时间保存了环境(或自动打开连接的对象)。我的建议只是删除.Rhistory.Rprofile 以清除此变量,并小心避免将来出现同样的情况。 :-)
  • @我尝试过,但不幸的是它没有帮助。我猜这可能与 Java 对象的底层或权限有关。 R 可能是原因,但也可能与 excel 有关。由于谷歌搜索时在纯 Windows/excel 设置中存在类似问题

标签: r rjava xlconnect


【解决方案1】:

XLconnect 中的以下函数调用清除 Java 会话:

xlcFreeMemory()

gc() 本身不起作用,但xlcFreeMemory 也运行下面的代码,我猜这就是达成交易的原因:

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

【讨论】:

    猜你喜欢
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2021-10-10
    • 2014-10-12
    • 2017-06-19
    • 2013-04-20
    • 2015-07-10
    相关资源
    最近更新 更多