如何通过长链自动安装 CRAN 包所依赖的 Bioconductor 包?
How to automatically install Bioconductor package on which a CRAN package depends through a long chain of dependencies?
我有一个包 metagam
在 CRAN 上,它通过了所有 CRAN's automated tests。但是,该包通过依赖链 metagam
<- metap
<- mutoss
<- multtest
依赖于 Bioconductor 包 multtest
。 metap
包的依赖关系如下所示。
# Code for creating dependency graph
library(miniCRAN)
plot(makeDepGraph("metap", suggests = FALSE))
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 年 6 月 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 年 6 月 20 日创建
我知道我可以通过 GitHub repository 或通过启动消息通知用户,他们在尝试安装 metagam
之前需要 运行 以下几行,但是它没有提供最佳的用户体验。
if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("multtest")
在我看来,解决方案是将 multtest
添加到 Imports。但是,这不会对未使用的导入发出警告,因为 multtest
中没有函数直接被 metagam
使用,而是通过上面指定的依赖链使用。我无法在我自己的系统上创建这样的警告,运行ning R CMD check --as-cran
,所以也许 CRAN 可以接受这个吗?或者,我可以使用 multtest
在某处添加一行代码,但这看起来很老套。
总而言之,我的问题是在安装 metagam
时我应该如何自动安装 multtest
包。
因为 Bioconductor 每年发布两次,这与 CRAN 发布实践不同,'right' 要做的是使用 Bioconductor 工具来安装你的包,所以 BiocManager::install("metap")
。 metap 是一个 CRAN 包并不重要。 BiocManager 为用户的 R 版本安装正确版本的 Bioconductor 包。
如果这个解决方案不受欢迎,那么下一个最好的正确做法是调整您的依赖关系以避免对 Bioconductor 包的直接或间接依赖。
我有一个包 metagam
在 CRAN 上,它通过了所有 CRAN's automated tests。但是,该包通过依赖链 metagam
<- metap
<- mutoss
<- multtest
依赖于 Bioconductor 包 multtest
。 metap
包的依赖关系如下所示。
# Code for creating dependency graph
library(miniCRAN)
plot(makeDepGraph("metap", suggests = FALSE))
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 年 6 月 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 年 6 月 20 日创建我知道我可以通过 GitHub repository 或通过启动消息通知用户,他们在尝试安装 metagam
之前需要 运行 以下几行,但是它没有提供最佳的用户体验。
if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("multtest")
在我看来,解决方案是将 multtest
添加到 Imports。但是,这不会对未使用的导入发出警告,因为 multtest
中没有函数直接被 metagam
使用,而是通过上面指定的依赖链使用。我无法在我自己的系统上创建这样的警告,运行ning R CMD check --as-cran
,所以也许 CRAN 可以接受这个吗?或者,我可以使用 multtest
在某处添加一行代码,但这看起来很老套。
总而言之,我的问题是在安装 metagam
时我应该如何自动安装 multtest
包。
因为 Bioconductor 每年发布两次,这与 CRAN 发布实践不同,'right' 要做的是使用 Bioconductor 工具来安装你的包,所以 BiocManager::install("metap")
。 metap 是一个 CRAN 包并不重要。 BiocManager 为用户的 R 版本安装正确版本的 Bioconductor 包。
如果这个解决方案不受欢迎,那么下一个最好的正确做法是调整您的依赖关系以避免对 Bioconductor 包的直接或间接依赖。