首页 > 解决方案 > 是一种检查包裹是否属于 Bioconductor 或 Cran 的方法吗?

问题描述

我想知道是否有一种很好的方法来检查属于 Bioconductor 的包(因为安装不同于 R CRAN 包。

例如,我想做这样的事情:

libraries <- c("ggplot2","BioBase")
check.libraries <- is.element(libraries, installed.packages()[, 1])==FALSE
libraries.to.install <- libraries[check.libraries]
if (length(libraries.to.install!=0)) {
  install.packages(libraries.to.install)
}

success <- sapply(libraries,require, quietly = FALSE,  character.only = TRUE)
if(length(success) != length(libraries)) {stop("A package failed to return a success in require() function.")}

这段代码检查是否安装了库(如果没有安装)。但是由于 Bioconductor Packages 以不同的方式安装,即: Biocmanager::install("Biobase") 我想做一个条件。我检查了 BiocCheck 但我认为它不起作用。

标签: rbioconductor

解决方案


不是最聪明的答案,但您可以一次准备所有包的详尽列表,然后将其写入 csv 以避免一次又一次地这样做。下载从这里获取的 BioConductor 包代码。

library(dplyr)
library(rvest)

CRANpackages <- available.packages() %>% 
                  as.data.frame() %>% 
                  select(Package) %>% 
                  mutate(source = 'CRAN')

url <- 'https://www.bioconductor.org/packages/release/bioc/'
biocPackages <- url %>% 
                  read_html() %>% 
                  html_table() %>%
                  .[[1]] %>%
                  select(Package) %>% 
                  mutate(source = 'BioConductor')

all_packages <- bind_rows(CRANpackages, biocPackages) 
rownames(all_packages) <- NULL

write.csv(all_packages, 'All_packages.csv', row.names = FALSE)

现在,您可以过滤要从此数据框中检查的包 -

libraries <- c("ggplot2","Biobase")
result <- all_packages %>% filter(Package %in% libraries)
result

#  Package       source
#1 ggplot2         CRAN
#2 Biobase BioConductor

获取由 BioConductor 安装的包,这些包CRAN可以result$Package[result$source == 'CRAN']传递result$Package[result$source == 'BioConductor']给它们各自的函数。


推荐阅读