sql - 更新到 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 中的某些内容没有释放它创建的文件。我只是想指出一个方向,以便在这一点上继续排除故障。
解决方案
readr
版本 >=2.0 和 < 2.1vroom
用于快速数据导入,默认为延迟加载数据,这会锁定文件以防止您删除它。您需要明确禁用懒惰阅读
VPTS <- read_csv("temp.csv", col_types = cols(), lazy=FALSE)
此信息在 2.0.0 版本下的更改日志中提到。
阅读后删除文件也受到懒惰的影响。在 Windows 上,只要进程打开文件,就不能删除打开的文件。因为 readr 在懒惰读取时保持文件打开,这意味着您无法读取,然后立即删除该文件。在大多数情况下,readr 将在文件被完全读取后关闭文件。但是,如果您知道要在读取后能够删除文件,最好在读取文件时传递lazy = FALSE
更新说明从readr
2.1 版本开始,懒惰阅读不再是默认设置(正是因为这样的错误)。这将防止发生权限被拒绝错误。但是如果你想更快地读取数据,你现在需要lazy=TRUE
显式设置。
推荐阅读
- c++ - MinGW cmake:“pthread_mutex_init”的多个定义
- javascript - 从反应功能组件返回一个变量
- excel - Excel:签署 Excel 宏以防止弹出“启用宏”
- android - 如何使用`Laravel Passport`获取`Android`应用程序的客户端ID和客户端密码
- apache-kafka - 使用 jmx_exporter 向 jvm 相关指标添加自定义标签
- serverless-framework - 无法 JSON.parse 无服务器 event.body
- c - Perf 不注释 Rust 调用的 C 代码
- c - fgets 不会停止读取用户输入
- python - 前天查询pandas怎么办
- php - ImageMagick 文件太大