[R] Checking whether specific packages (from bioconductor) are installed when loading a package

Martin Morgan mtmorgan at fredhutch.org
Wed Mar 11 14:19:20 CET 2015


On 03/11/2015 01:36 AM, Søren Højsgaard wrote:
> Dear all,
>
> My package 'gRbase' uses three packages from Bioconductor and these are not automatically installed when gRbase is installed. My instructions (on the package webpage) to users are therefore to run:
>

Treat Bioconductor packages as any other, listing them in Depends: or Imports: 
or Suggests: as described in 'Writing R Extensions'. CRAN builds packages with 
access to the Bioconductor repository. Your CRAN users chooseBioCmirror() and 
setRepositories() before using install.packages(), and Bioc dependencies are 
installed like any other dependency.

> source("http://bioconductor.org/biocLite.R"); biocLite(c("graph","RBGL","Rgraphviz"))
>
> When loading gRbase, it is checked whether these Bioconductor packages are available, but I would like to add a message about how to install the packages if they are not.
>

This functionality is provided by Depends: and Imports:, so is not relevant for 
packages listed in this part of your DESCRIPTION file. You're only asking for 
advice on packages that are in Suggests:. It does not matter that these are 
Bioconductor packages or CRAN packages or ... the packages in Suggests: are not, 
by default, installed when your package was installed (see the 'dependencies' 
argument to install.packages()).

> Does this go into .onAttach or .onLoad or elsewhere?

Or not at all. If the package belongs in Suggests: and provides some special 
functionality not needed by the package most of the time (else it would be in 
Imports: [most likely] or Depends:) then there will be some few points in the 
code where the package is used and you need to alert the user to the special 
condition they've encountered. You'll want to fully specify the package and 
function to be used

   RBGL::transitive.closure(...)

(full specification provides similar advantage to Import:'ing a symbol into your 
package, avoiding symbol look-up along the search() path, potentially getting a 
function transitive.closure() defined by the user or a package different from 
RBGL). If RBGL is not available, the above code will fail, and the user will be 
told that "there is no package called 'RBGL'".

One common strategy for nicer messages is to

     if (!requireNamespace("RBGL)")
         stop("your more tailored message")

in the few code chunks before your use of RBGL::transitive.closure(). 
requireNamespace() loads but does not attach the RBGL package, so the symbols 
are available when fully qualified RBGL:: but the package does not interfere 
with the user search() path.

Which I guess brings us to your question, and the answer is probably that if 
after the above you were to still wish to add a message at package start-up, 
then the right place would be .onLoad(), so that users of your package, as well 
as users of packages that Import: (load) but do not Depend: (attach) on your 
package, will see the message.

Also, this belongs on the R-devel mailing list.

Hope that's helpful,

Martin

>
> Thanks in advance
> Søren
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>


-- 
Computational Biology / Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N.
PO Box 19024 Seattle, WA 98109

Location: Arnold Building M1 B861
Phone: (206) 667-2793



More information about the R-help mailing list