16

I have an R package on github which uses multiple Bioconductor dependencies, 'myPackage'

If I include CRAN packages in the DESCRIPTION via Depends:, the packages will automatically install upon installation via devtools, i.e.

devtools::install_github('repoName/myPackage')

This is discussed in Section 1.1.3 Package Dependencies, in Writing R Extensions

Is there a way to streamline this such that packages from Bioconductor are automatically installed as well?

Normally, users install Bioconductor packages via BiocLite, e.g.

source("http://www.bioconductor.org/biocLite.R")
biocLite("edgeR")
ShanZhengYang
  • 1,691
  • 1
  • 14
  • 20
  • 1
    Note that as of Bioconductor release 3.8 onwards, bioconductor packages are installed with BiocManager::install() which can be installed from CRAN – Tom Kelly Apr 19 '19 at 15:05

3 Answers3

18

As suggested, here’s an example showing the relevant lines from a DESCRIPTION file from a CRAN/GitHub hosted project that has Bioconductor dependencies (truncated):

Depends:
    R (>= 3.3.0)
biocViews:
Imports:
    methods,
    snpStats,
    dplyr

The relevant bit is the empty biocViews: declaration, which allows the Bioconductor dependency {snpStats} to be automatically installed.

Konrad Rudolph
  • 4,845
  • 14
  • 45
  • r Check() would still fail for me with "Packages required but not available" – Edmondo Jan 23 '22 at 09:20
  • @Edmondo1984 Hard to know what you’re doing wrong without seeing your code. As evidenced by the linked package (which can run R CMD check without failure), this works just fine. – Konrad Rudolph Jan 23 '22 at 17:02
  • I have a clear repro. I have a DESCRIPTION containing biocViews: and an Import on a bioconductor package. I do a check() it fails, I install the package manually and do a check, it works. The problem is, how is this supposed to work on a CI/CD server? Shouldn't R download the packages itself on a check()? – Edmondo Jan 23 '22 at 17:30
  • @Edmondo1984 No, R CMD check doesn’t install packages. The same is true for CRAN packages. If you want to run check on CI, the conventional way is to first install the package and its dependencies, and then run check on it. – Konrad Rudolph Jan 23 '22 at 21:54
  • Thanks, what is the right way to install the package and its dependencies? – Edmondo Jan 23 '22 at 22:24
  • @Edmondo1984 The easiest way is probably via remotes::install_deps(dependencies = TRUE). Check out r-lib/actions, it’s a comprehensive repository of CI/CD actions for R on GitHub. Even if you’re not using GitHub Actions, these can serve as a template for you. – Konrad Rudolph Jan 24 '22 at 10:46
  • I now recommend using pak::pak() instead of remotes::install_deps(). – Konrad Rudolph Aug 10 '23 at 09:12
10

There's a trick to this where one needs to add biocViews: to the package Description. That's the only solution I've ever seen to allowing automatic installation of bioconductor dependencies. If you need a couple of examples, then click through the link I posted and scroll down to pull requests referencing that issue, they will generally include the actual example.

Devon Ryan
  • 19,602
  • 2
  • 29
  • 60
  • I didn't find the examples in the pull requests you mentioned. However, I did search the github mirror on CRAN. There are DESCRIPTION files with a lone biocViews: line before Depends:. Others include tags, like biocViews: Infrastructure, RNA – ShanZhengYang Jan 22 '18 at 19:32
  • Maybe we should post an example DESCRIPTION so it's absolutely clear to future biohackers how this is done...this news needs to spread! – ShanZhengYang Jan 22 '18 at 19:57
  • 2
    You don't need anything after biocViews:, that alone suffices (see ?devtools::package_deps). – Devon Ryan Jan 22 '18 at 20:14
2

I have a counter example to other answers. BiocViews is not needed to install Bioconductor dependencies on CRAN. I have a package on CRAN that suggests Bioconductor packages and they are found without using BiocViews.

If you are installing a package from github and it has dependencies on Bioconductor you can use directly BiocManager::install("user/package") and it will use remotes::install_github internally and pull also packages from Bioconductor (from the right release).

BiocViews is/was used to detect that a package is for Bioconductor by remotes, devtools and sessioninfo among other packages that help the development and testing of packages. In addition Bioconductor doesn't add a Repository: Bioconductor on the provided DESCRIPTION field of the packages, while CRAN adds Repository: CRAN.

llrs
  • 4,693
  • 1
  • 18
  • 42