R包开发中devtools::test()正常但devtools::check()无法定位yml文件
R包开发中devtools::check()找不到inst目录下.yml配置文件的问题及解决方案
问题背景
开发R包时使用testthat编写单元测试,需要读取后缀为.yml的外部配置文件。按照R包开发规范,该文件放置在inst目录下。调用system.file()(而非base::system.file(),便于pkgload:::shim_system.file()拦截调用)配合yaml包加载文件执行单元测试时,运行devtools::test()全部测试通过,但运行devtools::check()时持续抛出文件未找到的错误。
测试过程中发现特殊现象:将文件后缀从.yaml/.yml修改为.txt后,devtools::check()不再报错。
相关代码与报错
测试代码:
## 位于test_that()内部 cf <- system.file("config", "config1.yml", package = "mypackage", mustWork = TRUE)
devtools::check()运行报错:
Error in `system.file("config", "config1.yml", package = "mypackage", mustWork = TRUE)`: no file found Backtrace: x 1. \-base::system.file(...) test-set_config.R:34:2 [ FAIL 1 | WARN 0 | SKIP 0 | PASS 15 ]
注:将config1.yml重命名为config1.txt后,
devtools::check()运行无报错。
运行环境:
- devtools版本:CRAN发布的最新v2.4.2
- R版本:4.1.1
问题定位与解决方案
后续排查已确认问题根源:此前为了忽略CI相关的yaml文件,误在.Rbuildignore中添加了[.]yml、[.]yaml通配规则,导致打包检查时inst目录下的yml配置文件也被过滤排除,因此无法被读取。
将.Rbuildignore中的yml/yaml匹配规则修改为匹配具体路径的精准规则后,问题即可解决,无需修改配置文件后缀。
内容的提问来源于stack exchange,提问作者Vivek Atal
相关产品推荐
相关产品推荐

