R 4.0.0环境pins搭配AzureStor执行pin_read报unused argument错误
问题根因
- 核心触发原因是基于R 4.0.0构建的Docker环境内
withr包版本过低,与pins 1.0.1的调用逻辑不兼容。 - pins 1.0.1内置的
local_azure_progress函数仅在下载Blob存储内的文件时触发,该函数调用withr::local_options时传入.local_envir参数指定选项作用域,这个参数是withr 2.4.0及以上版本才新增的正式形参。 - 低版本withr的
local_options函数对应的环境参数名为.envir,受R语言的参数部分匹配规则影响,传入的.local_envir会被直接匹配到.envir形参,剩余的azure_storage_progress_bar = progress参数无法被函数识别,直接抛出unused argument错误。 - 本地R 4.1.3环境运行正常,是因为高版本R默认拉取的CRAN包快照中withr版本满足≥2.4.0的要求,不存在参数匹配问题。
- 同脚本内
pin_list()可正常执行,是因为该操作仅列举Blob容器内的文件目录,不会触发实际的文件下载逻辑,不会调用local_azure_progress函数。手动提前设置azure_storage_progress_bar全局选项无法解决问题,因为报错发生在函数参数匹配阶段,还未执行到选项读取、设置的逻辑。
可行解决方案
按落地优先级排序:
- 方案1(推荐):升级Docker环境中的withr包到2.4.1及以上版本。withr高版本完全兼容R 4.0.0,在R脚本或Docker构建流程中执行以下安装命令即可:
install.packages("withr", repos = "https://cloud.r-project.org/")
安装完成后重启R进程,原有代码即可正常运行。
- 方案2(受环境限制无法升级withr时临时使用):在调用
pin_read()前,通过assignInNamespace重写pins包内部的local_azure_progress函数,将环境参数名改为适配低版本withr的.envir,代码如下:
assignInNamespace( "local_azure_progress", function(progress = TRUE, env = parent.frame()) { if (!progress) { withr::local_options(azure_storage_progress_bar = progress, .envir = env) } }, ns = "pins" )
- 方案3:同步升级环境内的pins、AzureStor到适配R 4.0的最新小版本,安装时自动更新所有依赖包,从根源避免版本兼容问题:
install.packages(c("pins", "AzureStor"), repos = "https://cloud.r-project.org/")
内容的提问来源于stack exchange,提问作者guzu92
相关产品推荐
相关产品推荐

