On 23.11.2011 14:59, Gabor Grothendieck wrote:
2011/11/23 Uwe Ligges<lig...@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<csa...@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.)

______________________________________________
R-help@r-project.org mailing list
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.

Reply via email to