如何通过一连串的依赖关系自动安装CRAN软件包所依赖的Bioconductor软件包?

时间:2020-06-20 14:09:18

标签: r bioconductor cran

我有一个位于CRAN上的软件包metagam,它通过了CRAN's automated tests的全部。但是,该软件包通过依存关系链multtest <-metagam <-metap <-mutoss依赖于Bioconductor软件包multtest。下面显示了metap软件包的依赖性。

# Code for creating dependency graph
library(miniCRAN)
plot(makeDepGraph("metap", suggests = FALSE))

Dependencies of the metap package, on which metagam depends.

this question的回答建议将biocViews:添加到DEPENDENCIES中。因此,我的DESCRIPTION的相关部分如下所示:

biocViews: 
Imports: 
    dplyr,
    furrr,
    ggplot2,
    knitr,
    metafor,
    metap,
    purrr,
    rlang,
    stringr,
    tidyr
RoxygenNote: 7.1.0
Suggests: 
    future,
    mgcv,
    gamm4,
    gratia,
    roxygen2,
    rmarkdown,
    devtools,
    covr,
    viridis,
    testthat (>= 2.1.0)

但是,添加biocViews似乎仅适用于一阶依赖项。就我而言,DESCRIPTION中没有列出Bioconductor软件包,因此自动软件包安装失败。如下例所示。


# Remove packages 'metap', 'mutoss', and 'multtest' if they are installed
# If, any of these are installed, the dependency 'multtest' will not be attempted to be installed
pkgs <- installed.packages()[, "Package", drop = TRUE]
if("metap" %in% pkgs) remove.packages("metap")
#> Removing package from '/Library/Frameworks/R.framework/Versions/4.0/Resources/library'
#> (as 'lib' is unspecified)
if("mutoss" %in% pkgs) remove.packages("mutoss")
#> Removing package from '/Library/Frameworks/R.framework/Versions/4.0/Resources/library'
#> (as 'lib' is unspecified)
if("multtest" %in% pkgs) remove.packages("multtest")

# Install 'metagam', which trigges installation of the dependency 'metap'
# The dependencies are 'metagam' <- 'metap' <- 'mutoss' <- 'multtest'
install.packages("metagam")
#> Warning: dependency 'multtest' is not available
#> also installing the dependencies 'mutoss', 'metap'
#> 
#> The downloaded binary packages are in
#>  /var/folders/sz/q9lc1ggd66n5k5x_yp094hgh0000gn/T//Rtmphvg646/downloaded_packages

reprex package(v0.3.0)于2020-06-20创建

此外,这会导致程序包失败,因为对multtest的依赖是真实的:

# The code below is from the examples of the metagam::metagam() function
# The last line fails because the dependency 'multtest' is not available
library(metagam)
library(mgcv)
#> Loading required package: nlme
#> This is mgcv 1.8-31. For overview type 'help("mgcv-package")'.

## Create 5 datasets
set.seed(1234)
datasets <- lapply(1:5, function(x) gamSim(scale = 5, verbose = FALSE))

## Fit a GAM in each dataset, then use strip_rawdata() to remove
## individual participant data
models <- lapply(datasets, function(dat){
  ## This uses the gam() function from mgcv
  model <- gam(y ~ s(x0, bs = "cr") + s(x1, bs = "cr") + s(x2, bs = "cr"), data = dat)
  ## This uses strip_rawdata() from metagam
  strip_rawdata(model)
})

## Next, we meta-analyze the models.
## It is often most convenient to analyze a single term at a time. We focus on s(x1).
meta_analysis <- metagam(models, terms = "s(x1)", grid_size = 30)
#> Error in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck = vI[[j]]): there is no package called 'multtest'

reprex package(v0.3.0)于2020-06-20创建

我知道我可以通过GitHub repository或通过启动消息通知用户,在尝试安装metagam之前,他们需要运行以下行,但是它不能提供最佳的用户体验。

if (!requireNamespace("BiocManager", quietly = TRUE))
    install.packages("BiocManager") 
BiocManager::install("multtest")

在我看来,解决方案是在Imports中添加multtest。但是,这不会给未使用的导入发出警告,因为multtest不会直接使用metagam中的函数,而是通过上面指定的依赖关系链直接使用。我无法在运行R CMD check --as-cran的自己的系统上创建这样的警告,所以也许CRAN可以吗?另外,我可以使用multtest在某处添加一行代码,但这似乎很不方便。

总而言之,我的问题是安装multtest后自动安装metagam软件包应该怎么做。

1 个答案:

答案 0 :(得分:2)

由于Bioconductor每年发布两次,这与CRAN发行惯例不同,因此“正确”的做法是使用Bioconductor工具来安装软件包,因此BiocManager::install("metap")。 metap是CRAN包并不重要。 BiocManager将为用户的R版本安装正确版本的Bioconductor软件包。

如果该解决方案不可行,那么接下来的正确选择就是调整依赖性,以避免对Bioconductor封装的直接或间接依赖性。