从tar.gz安装自定义R包时依赖缺失报错,如何解决?
问题
自行创建了一个R包,其DESCRIPTION文件内容如下:
Imports: dagitty (>= 0.3.1), dplyr (>= 1.0.7), forcats (>= 0.5.1), ggdag (>= 0.2.4), ggplot2 (>= 3.3.5), magrittr (>= 2.0.1), medflex (>= 0.6.7), methods (>= 4.1.0), nnet (>= 7.3.16), stats (>= 4.1.0), stringr (>= 1.4.0), tibble (>= 3.1.5), bnlearn (>= 4.6.1), tidyr, ROCR, rpart, rlang Depends: R (>= 4.1.0), SuperLearner (>= 2.0) Suggests: rmarkdown (>= 2.10), knitr (>= 1.36), kableExtra (>= 1.3.4), recipes (>= 0.1.16)
尝试在测试环境中安装该包及其所有依赖,执行代码:
install.packages(pkgs = "testpkg-v0.1.0.tar.gz", repos = NULL, dependencies = TRUE, type = "source" )
出现错误:
ERROR: dependencies 'SuperLearner', 'dagitty, 'dplyr', 'forcats', 'ggdag', 'ggplot2', 'magrittr', 'medflex', 'stringr', 'tibble', 'bnlearn', 'tidyr', 'ROCR', 'rlang' are not available for package 'testpkg'
错误原因
- 无法远程获取依赖:设置
repos = NULL后,R仅会在本地环境查找依赖包,不会从CRAN等远程仓库下载缺失的依赖,而测试环境中未提前安装这些包。 - 版本或系统依赖不兼容:DESCRIPTION要求R版本≥4.1.0,若测试环境R版本过低,部分依赖包无法安装;另外
medflex、bnlearn这类源码包需要编译工具支持,若环境缺失编译依赖也会导致安装失败。
处理方案
方法一:允许R从远程仓库自动安装依赖
移除repos = NULL参数(或指定CRAN镜像地址),让R自动下载并安装所有缺失的依赖:
# 默认让R自动选择镜像 install.packages(pkgs = "testpkg-v0.1.0.tar.gz", dependencies = TRUE, type = "source" ) # 或直接指定镜像,避免交互选择步骤 install.packages(pkgs = "testpkg-v0.1.0.tar.gz", repos = "https://cloud.r-project.org/", dependencies = TRUE, type = "source" )
方法二:离线环境下手动提前安装所有依赖
如果必须使用repos = NULL(比如离线环境),需先手动安装所有依赖:
- 安装Depends中的核心依赖:
install.packages(c("SuperLearner"), repos = "https://cloud.r-project.org/")
- 安装Imports中的必需依赖:
install.packages(c("dagitty", "dplyr", "forcats", "ggdag", "ggplot2", "magrittr", "medflex", "nnet", "stringr", "tibble", "bnlearn", "tidyr", "ROCR", "rpart", "rlang"), repos = "https://cloud.r-project.org/")
- (可选)安装Suggests中的扩展依赖:
install.packages(c("rmarkdown", "knitr", "kableExtra", "recipes"), repos = "https://cloud.r-project.org/")
完成依赖安装后,再执行原本地包安装命令。
额外检查项
- 确认测试环境的R版本≥4.1.0,若版本过低需先升级R。
- 为源码包安装编译工具:
- Windows:安装Rtools
- Linux(Debian/Ubuntu):安装
build-essential包 - Linux(CentOS/RHEL):安装
gcc-c++包 - macOS:安装Xcode Command Line Tools
内容的提问来源于stack exchange,提问作者bananaboy
相关产品推荐
相关产品推荐

