R CMD check遇Rd交叉引用警告:未依赖cluster包却提示找不到它
我完全懂你这种困惑——明明自己的R包既没直接调用cluster,DESCRIPTION里没加它做依赖,甚至R脚本和Rd文档里连它的影子都找不到,结果跑R CMD check时突然弹出找不到cluster的警告,属实摸不着头脑。结合你的sessionInfo和检查场景,我整理了几个最可能的原因和对应的排查方向:
可能的原因与排查步骤
1. 依赖链的间接调用
你的包没直接用cluster,但你依赖的其他包可能偷偷间接依赖它。比如从你的sessionInfo看,你加载了testthat、doParallel、dplyr这些包,其中某些包的内部逻辑可能会调用cluster的功能。
- 排查方法:用工具查一下你的包的完整依赖树,看看有没有包把
cluster拉进来:tools::package_dependencies(packages = "my_package", recursive = TRUE) - 解决思路:如果确实是间接依赖,你不需要在DESCRIPTION里声明它(除非它是硬依赖),但要确保检查环境里装了
cluster——毕竟R CMD check是在相对干净的环境里运行,可能你本地环境装了,但临时检查环境没装上。
2. Rd文档的隐性交叉引用
有时候Rd文档里的交叉引用可能“暗度陈仓”,比如你复制粘贴过其他文档的代码片段,或者不小心用了\link{some_function},而这个函数刚好在cluster包里,哪怕你没意识到。
- 排查方法:
- 用RStudio的「Find in Files」功能全局搜索
/man目录下的所有.Rd文件,找有没有cluster相关的字符串,包括\link{}、\code{}里的内容。 - 也可以单独检查每个Rd文件的合法性:
lapply(list.files("man", pattern = "\\.Rd$", full.names = TRUE), tools::checkRd)
- 用RStudio的「Find in Files」功能全局搜索
3. 测试脚本的隐性依赖
你用了testthat做测试,测试脚本里可能间接触发了cluster的调用——比如某个测试用的辅助函数来自依赖cluster的包,或者测试时加载了其他带依赖的工具。
- 排查方法:
- 检查
tests/testthat目录下的所有脚本,看有没有加载陌生的包,或者调用了可能关联cluster的函数。 - 单独运行测试脚本,看会不会触发同样的错误:
testthat::test_dir("tests/testthat")
- 检查
4. R安装的不完整
注意:cluster是R的推荐包(recommended package),默认R安装时会自带,但如果你的R安装包不完整(比如自定义精简安装),可能会缺失这个包。
- 排查方法:在你运行R CMD check的环境里执行
find.package("cluster"),如果返回错误,说明确实缺失,直接安装即可:install.packages("cluster")
5. 开发工具的副作用
从你的sessionInfo看,你加载了一堆assertive系列包、devtools、roxygen2这些开发工具,它们在运行时可能会调用一些依赖cluster的功能(比如某些断言逻辑、文档生成工具的内部调用)。
- 排查方法:尝试在完全干净的环境里运行检查,避免加载全局配置或额外工具:
R CMD check --vanilla --no-vignettes --no-manual --ignore-vignettes \path\to\package
先从检查间接依赖和Rd文档入手,再排查测试脚本和环境问题,应该能快速定位到问题根源。
内容的提问来源于stack exchange,提问作者slava-kohut

