调用Bioconductor包simpIntLists的封装函数运行报错的原因是什么
报错原因
核心原因是R包内置数据集的加载机制:
simpIntLists包的findInteractionList函数运行依赖包内置的交互数据集(比如报错里提到的HumanBioGRIDInteractionEntrezId),这类存放在包data目录下的数据集,默认不会随函数导出。- 你通过
simpIntLists::findInteractionList调用函数,或者仅在NAMESPACE中写import(simpIntLists),都只会导入包的导出函数,不会自动将内置数据集挂载到可搜索的环境中,因此函数内部找不到对应的数据集对象。 - 调用
library(simpIntLists)时会全量加载包,会自动将所有内置数据集加入搜索路径,因此函数可以正常运行。
适配R包开发的解决方案
- 方案1(最规范):在你的函数调用
findInteractionList前,主动加载对应数据集,不需要全量加载包:
do_xy <- function(organism, IDType){ # 主动从simpIntLists加载所需数据集 target_data <- paste0(toupper(substr(organism,1,1)), substr(organism,2,nchar(organism)), "BioGRIDInteraction", IDType) utils::data(list = target_data, package = "simpIntLists", envir = environment()) network <- simpIntLists::findInteractionList(organism, IDType) }
你需要在包的DESCRIPTION的Imports字段加入utils,如果已经添加可忽略。
- 方案2:将
simpIntLists从DESCRIPTION的Imports字段移到Depends字段,你的包加载时会自动全量加载simpIntLists,数据集会自动挂载。缺点是会增加用户环境的命名空间污染,不推荐依赖较多的场景使用。
内容的提问来源于stack exchange,提问作者fluffyflea
相关产品推荐
相关产品推荐

