如何区分CRAN与Bioconductor安装的R包并批量重装
实现R包环境导出与批量重装(类
conda env export功能) 一、获取已安装包的仓库来源信息
基于你提供的代码,我们可以扩展提取仓库来源字段,同时处理部分无明确仓库标记的包:
# 获取包含仓库信息的已安装包列表(过滤基础包) ip <- as.data.frame(installed.packages()[, c("Package", "Version", "Repository")]) ip <- ip[is.na(installed.packages()[, "Priority"]), , drop = FALSE] # 区分CRAN和Bioconductor包 cran_pkgs <- ip[grepl("CRAN", ip$Repository, ignore.case = TRUE), ] bioc_pkgs <- ip[grepl("Bioconductor|BioC", ip$Repository, ignore.case = TRUE), ] # 处理仓库信息为空的包,通过包描述判断归属 missing_repo <- ip[is.na(ip$Repository) | ip$Repository == "", ] for (pkg in rownames(missing_repo)) { desc <- packageDescription(pkg) # 带biocViews标签的是Bioconductor包 if (!is.null(desc$biocViews)) { bioc_pkgs <- rbind(bioc_pkgs, missing_repo[pkg, ]) # 描述里提到CRAN的归为CRAN包 } else if (!is.null(desc$Repository) && grepl("CRAN", desc$Repository, ignore.case = TRUE)) { cran_pkgs <- rbind(cran_pkgs, missing_repo[pkg, ]) } }
二、批量重装不同仓库的包
根据分类结果,分别用对应工具重装指定版本的包:
1. CRAN包批量重装
if (nrow(cran_pkgs) > 0) { # 构造"包名==版本号"格式的字符串 cran_pkg_list <- paste0(cran_pkgs$Package, "==", cran_pkgs$Version) install.packages(cran_pkg_list, repos = "https://cloud.r-project.org/") }
2. Bioconductor包批量重装
if (nrow(bioc_pkgs) > 0) { # 先确保BiocManager已安装 if (!requireNamespace("BiocManager", quietly = TRUE)) { install.packages("BiocManager") } # 构造版本指定的包列表,关闭自动更新避免干扰 bioc_pkg_list <- paste0(bioc_pkgs$Package, "==", bioc_pkgs$Version) BiocManager::install(bioc_pkg_list, update = FALSE) }
三、导出环境信息(类conda env export)
可以将分类后的包信息导出为文本文件,方便后续恢复:
env_df <- rbind( data.frame(Source = "CRAN", cran_pkgs), data.frame(Source = "Bioconductor", bioc_pkgs) ) write.table(env_df, file = "r_environment_export.txt", sep = "\t", row.names = FALSE, quote = FALSE)
内容的提问来源于stack exchange,提问作者garcesj
相关产品推荐
相关产品推荐

