首页 > 解决方案 > 更新到 4.1.1 后在 R 中使用 file.remove 时权限被拒绝

问题描述

从 3.6.3 更新到 4.1.1 后,我运行的每周脚本坏了。具体来说,它会触发一个错误:

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

要手动删除 temp.csv,我会从 Windows 中得到一个文件正在使用中的 rsession.exe 错误。如果我在 Rstudio 中重新启动 R,那么 file.remove() 和手动删除工作。

可能是我一开始就使用了不好的策略,但是导致错误的代码是这样的:

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

对于上下文,VPTS 来自使用 sqlFetch() 的 SQL 导入,并且格式都很不稳定,将其转储到 CSV 并使用 read_csv() 将其完美导入以备将来使用。

我相信这不是权限问题,而是更新后的 R 中的某些内容没有释放它创建的文件。我只是想指出一个方向,以便在这一点上继续排除故障。

标签: sqlr

解决方案


readr版本 >=2.0 和 < 2.1vroom用于快速数据导入,默认为延迟加载数据,这会锁定文件以防止您删除它。您需要明确禁用懒惰阅读

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

此信息在 2.0.0 版本下的更改日志中提到。

阅读后删除文件也受到懒惰的影响。在 Windows 上,只要进程打开文件,就不能删除打开的文件。因为 readr 在懒惰读取时保持文件打开,这意味着您无法读取,然后立即删除该文件。在大多数情况下,readr 将在文件被完全读取后关闭文件。但是,如果您知道要在读取后能够删除文件,最好在读取文件时传递lazy = FALSE

更新说明从readr2.1 版本开始,懒惰阅读不再是默认设置(正是因为这样的错误)。这将防止发生权限被拒绝错误。但是如果你想更快地读取数据,你现在需要lazy=TRUE显式设置。


推荐阅读