Как автоматически установить пакет Bioconductor, от которого пакет CRAN зависит через длинную цепочку зависимостей? - PullRequest
0 голосов
/ 20 июня 2020

У меня есть пакет metagam, который находится на CRAN, и он проходит все автоматические тесты CRAN . Однако пакет зависит от пакета Bioconductor multtest через цепочку зависимостей metagam <- <code>metap <- <code>mutoss <- <code>multtest. Это визуализировано ниже для зависимостей пакета metap.

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

Dependencies of the metap package, on which metagam depends.

The answer to этот вопрос предлагает добавить 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 работает только для зависимостей первого порядка. В моем случае нет пакетов Bioconductor, перечисленных в DESCRIPTION, и, следовательно, автоматическая установка пакета c не выполняется. Это показано в примере ниже.


# 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

Создано 20.06.2020 пакетом REPEX (v0.3.0)

Кроме того, это приводит к сбою пакета, потому что зависимость от 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'

Создано 20.06.2020 пакетом REPEX ( v0.3.0)

Я знаю, что могу проинформировать пользователей либо о репозитории GitHub , либо с помощью сообщения запуска, что им необходимо выполнить следующие строки перед попыткой установки metagam, но это не обеспечивает наилучшего взаимодействия с пользователем.

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

Что мне кажется решением, так это добавление multtest к импорту. Однако не будет ли это предупреждением о неиспользуемом импорте, поскольку никакие функции из multtest не используются metagam напрямую, а скорее через цепочку зависимостей, указанную выше. Я не смог создать такое предупреждение в моей собственной системе, использующей R CMD check --as-cran, так что, может быть, CRAN с этим справится? В качестве альтернативы я мог бы добавить строку кода где-нибудь, используя multtest, но это кажется очень хакерским.

Подводя итог, мой вопрос заключается в том, что я должен сделать, чтобы пакет multtest был автоматически установлен, когда metagam установлено.

1 Ответ

2 голосов
/ 20 июня 2020

Поскольку Bioconductor выпускает выпуски два раза в год, и это отличается от практики выпуска CRAN, «правильным» решением будет использовать инструменты Bioconductor для установки вашего пакета, поэтому BiocManager::install("metap"). Неважно, что metap - это CRAN-пакет. BiocManager устанавливает правильную версию пакета Bioconductor для пользовательской версии R.

Если это решение не подходит, то следующий лучший правильный шаг - это настроить ваши зависимости, чтобы избежать прямых или косвенных зависимостей. на упаковках Bioconductor.

...