[R] On-demand importing of a package

Uwe Ligges ligges at statistik.tu-dortmund.de
Fri Nov 25 16:24:28 CET 2011

On 23.11.2011 14:59, Gabor Grothendieck wrote:
> 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

Errr, if I understand this correctly, your arguments are now orthogonal 
to your original comments.

Before you told us it is important to be able to run stuff without 
having Matrix available or just load on demand since it may not be 
available to the users. Now you tell us you want to make it available 
without having any need to use it?

Uwe Ligges

> 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.)

More information about the R-help mailing list