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?