是检查包裹是否属于Bioconductor或Cran的方法吗?

rseugnpd  于 2023-07-31  发布在  其他
关注(0)|答案(3)|浏览(70)

我想知道是否有一个很好的方法来检查一个软件包属于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.")}

字符串
这段代码检查库是否已安装(如果未安装)。但是,由于生物导体包以不同的方式安装,即:Biocmanager::install(“Biobase”)我想做一个条件。我检查了BiocCheck,但我认为它不起作用。

txu3uszq

txu3uszq1#

这不是最聪明的答案,但你可以准备一个详尽的所有软件包的列表,也许把它写在csv中,以避免一次又一次地这样做。下载从here获取的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)

字符串
现在你可以从这个dataframe中过滤你想要检查的包-

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

#  Package       source
#1 ggplot2         CRAN
#2 Biobase BioConductor


通过result$Package[result$source == 'CRAN']CRAN获取要安装的软件包,并通过BioConductor作为result$Package[result$source == 'BioConductor']获取要安装的软件包,这些软件包可以传递给它们各自的函数。

tcbh2hod

tcbh2hod2#

libraries <- c("ggplot2", "Biobase")

if (!require("BiocManager")) install.packages("BiocManager")

#Checking if the package belongs to CRAN or to Bioconductor and installing them accordingly.

for(lib in libraries){
        if(!lib %in% installed.packages()){
            if(lib %in% available.packages()[,1]){
             install.packages(lib,dependencies=TRUE)
            }else {(BiocManager::install(lib))
            }}
        }

#Loading the libraries
sapply(libraries,require,character=TRUE)

字符串
我想这个会有帮助。

nlejzf6q

nlejzf6q3#

您可以通过以下方式获得所有可用生物导体包的列表:

BiocManager::available()

字符串
正如其他人提到的CRAN:installed.packages().参见:管理生物导体封装
然后你可以用一个if-else语句写一个for循环来遍历你所有的包。
但是,如果你不想处理这个问题,我会看看包管理器,它可以处理不同的源,例如。GitHub、Bioconductor和CRAN。您可以查看:r-lib/pak或我的forked version,后者允许您使用pak::pkg_load,它首先检查您的软件包是否已经安装,如果没有,它将安装它,然后将尝试加载它。pak允许你给予一个你想要安装的包的列表/向量并安装它,而不需要指定它是Github还是CRAN等。
另一种选择是pacman,它的功能非常类似。

相关问题