如何正确在R包的DESCRIPTION文件中配置依赖项
R包依赖配置问题解答
1. 是否可以直接手动编辑DESCRIPTION文件?
完全可以。DESCRIPTION本身就是纯文本格式的包配置文件,手动编辑是官方认可的常规操作。你手动修改后问题未解决,并不是操作方式有误,大概率是依赖配置逻辑错误,或是修改后没有执行后续的包构建安装步骤导致修改未生效。
2. 正确的修改操作流程
首先需要明确Imports和Depends的适用区别,不建议盲目将所有依赖都迁移到Depends下:
Depends会在你的包加载时,自动将所有关联依赖加载到用户的全局工作环境,会造成命名空间污染,仅适合需要直接暴露给用户使用的依赖Imports仅会要求安装依赖,不会默认加载到全局环境,需要在包代码中通过包名::函数名调用,或是在NAMESPACE中声明导入指定函数,是更推荐的规范写法
如果你确定要使用Depends配置解决依赖加载问题,按以下步骤操作即可:
- 第一步:手动编辑DESCRIPTION文件,新增
Depends字段,将需要的依赖写入该字段下,示例配置如下:
Depends: dplyr (>= 0.4.3), ggplot2 (>= 2.1.0), lazyeval (>= 0.1.10)
如果原本Imports字段下还有这些依赖,可以直接删除对应条目,避免重复声明。
- 第二步:修改完成后必须重新构建安装你的包,修改才会生效:
- 若使用devtools工具链开发,运行
devtools::document()更新NAMESPACE文件,再运行devtools::install()重新安装本地包即可 - 若手动构建包,重新执行
R CMD build 包目录名和R CMD INSTALL 构建生成的tar包路径即可
- 若使用devtools工具链开发,运行
如果你希望使用更规范的Imports配置,不需要修改DESCRIPTION里的Imports字段,仅需做如下调整即可解决依赖找不到的问题:
- 在包代码中所有调用依赖包函数的位置,都加上包名前缀,例如将
filter(mtcars, cyl == 4)修改为dplyr::filter(mtcars, cyl == 4) - 或是在对应R脚本的roxygen2注释中添加导入声明,例如
#' @importFrom dplyr filter,之后运行devtools::document()会自动在NAMESPACE中生成对应的导入规则,无需手动写包名前缀
常见踩坑提醒:修改DESCRIPTION后未重新构建安装包,直接加载本地旧版本包,是修改不生效的最常见原因,和是否手动编辑DESCRIPTION无关。
内容的提问来源于stack exchange,提问作者Reynaldo Senra
相关产品推荐
相关产品推荐

