[R] On-demand importing of a package

Gabor Grothendieck ggrothendieck at gmail.com
Wed Nov 23 14:59:50 CET 2011

2011/11/23 Uwe Ligges <ligges at statistik.tu-dortmund.de>:
> On 23.11.2011 03:18, Gabor Grothendieck wrote:
>> On Tue, Nov 22, 2011 at 3:16 PM, Gábor Csárdi<csardi at rmki.kfki.hu>  wrote:
>>> Dear All,
>>> in some functions of my package, I use the Matrix S4 class, as defined
>>> in the Matrix package.
>>> I don't want to depend on Matrix, however, because my package is
>>> perfectly fine without Matrix, most of the functionality does not need
>>> Matrix. Matrix is so included in the 'Suggests' line.
>>> I load Matrix via require(), from the functions that really need it.
>>> This mostly works fine, but I have an issue now that I cannot sort
>>> out.
>>> If I define a function like this in my package:
>>> f<- function() {
>>>  require(Matrix)
>>>  res<- sparseMatrix(dims=c(5, 5), i=1:5, j=1:5, x=1:5)
>>>  y<- rowSums(res)
>>>  res / y
>>> }
>>> then calling it from the R prompt I get
>>> Error in rowSums(res) : 'x' must be an array of at least two dimensions
>>> which basically means that the rowSums() in the base package is
>>> called, not the S4 generic in the Matrix package. Why is that?
>>> Is there any way to work around this problem, without depending on
>>> Matrix?
>>> I am doing this on R 2.14.0, x86_64-apple-darwin9.8.0.
>> Try adding these three lines to the package:
>> rowSums<- function(x, na.rm = FALSE, dims = 1L) UseMethod("rowSums")
>> rowSums.dgCMatrix<- Matrix:::rowSums
>> rowSums.default<- base::rowSums
> Folks, please not, just import relevant functionality from the *recommended*
> package Matrix.
> Messing around even more is certainly less helpful than importing relevant
> part from a Namespace/package that you will use anyway.

The real problem is how to deal with conditional dependencies and
importing is just as much a kludge as anything else.  In the problem
under discussion it has the undesirable property that Matrix is always
imported even though its almost never needed.

Additional conditional dependency features may be needed in R.  All
the scenarios in which conditional dependency are involved need to be
thought about since there may be interaction among them.

Some features might be:

- dynamically import another package.
- uncouple package installation and loading.  Right now
install.packages has a dep= argument that causes the Suggests packages
to be installed too.  There should be some way for the package
developer to specify this rather than make the user specify it.  For
example, if Matrix were not a recommended package and most users
wanted to use it in the problem above but a few wanted to use a
package that conflicts with it then it would be nice if the package in
question could force dep=TRUE without having the user do it.  For
example, perhaps there would be an
  Installs: Matrix
line in the DESCRIPTION file to tell it to install Matrix at install
time but not load it automatically at package load time -- the package
would have to require it itself.  (sqldf has this problem since most,
but not all, users want RSQLite but to put it in Suggests would make
most users use install.packages("sqldf", dep = TRUE) which makes it
harder to install whereas putting it in Depends means its always
loaded and could conflict with some other database backend.)

Statistics & Software Consulting
GKX Group, GKX Associates Inc.
tel: 1-877-GKX-GROUP
email: ggrothendieck at gmail.com

More information about the R-help mailing list