Skip to content

Matrix / SparseM conflict (PR#8618)

4 messages · David Winsemius, Duncan Murdoch, Brian Ripley +1 more

#
Full_Name: David Pleydell
Version: 2.2.1
OS: Debian Etch
Submission from: (NULL) (193.55.70.206)


There appears to be a conflict between the chol functions from the Matrix and
the SparseM packages. chol() can only be applied to a matrix of class dspMatrix
if SparseM is not in the path.

with gratitude
David
5 x 5 Matrix of class "pCholesky"
     [,1]      [,2]      [,3]      [,4]      [,5]     
[1,] 1.4142136 0.7071068 0.7071068 0.7071068 0.7071068
[2,]         . 1.2247449 0.4082483 0.4082483 0.4082483
[3,]         .         . 1.1547005 0.2886751 0.2886751
[4,]         .         .         . 1.1180340 0.2236068
[5,]         .         .         .         . 1.0954451
[1] "SparseM library loaded"
Error in chol(sm) : no applicable method for "chol"
5 x 5 Matrix of class "pCholesky"
     [,1]      [,2]      [,3]      [,4]      [,5]     
[1,] 1.4142136 0.7071068 0.7071068 0.7071068 0.7071068
[2,]         . 1.2247449 0.4082483 0.4082483 0.4082483
[3,]         .         . 1.1547005 0.2886751 0.2886751
[4,]         .         .         . 1.1180340 0.2236068
[5,]         .         .         .         . 1.0954451
#
On 2/20/2006 8:54 AM, dpleydel at univ-fcomte.fr wrote:
This isn't a bug, it's simply that both Matrix and SparseM define a 
generic for chol (though Matrix actually gets it by converting the 
function in base).

If you want access to the version in Matrix after attaching SparseM 
ahead of it in the search path, use Matrix::chol.

 > library(Matrix)
 > sm <- as(as(Matrix(diag(5) + 1), "dsyMatrix"), "dspMatrix")
 > library(SparseM)
[1] "SparseM library loaded"
 > chol(sm)
Error in chol(sm) : no applicable method for "chol"
 > Matrix::chol(sm)
5 x 5 Matrix of class "pCholesky"
      [,1]      [,2]      [,3]      [,4]      [,5]
[1,] 1.4142136 0.7071068 0.7071068 0.7071068 0.7071068
[2,]         . 1.2247449 0.4082483 0.4082483 0.4082483
[3,]         .         . 1.1547005 0.2886751 0.2886751
[4,]         .         .         . 1.1180340 0.2236068
[5,]         .         .         .         . 1.0954451

You might want to discuss this with the SparseM package maintainers; 
perhaps they don't really need to define their own generic.

Duncan Murdoch
#
On Mon, 20 Feb 2006, Duncan Murdoch wrote:

            
The problem appears to be that SparseM first redefines chol as an S3 
generic and then defines S4 methods on it.  As no new S3 methods are then 
defined the S3 step would seem unnecessary, but it is used to allow the 
package to define S4 methods on a different signature from R's chol().
(That seems to me to be asking for trouble.)

Only the package maintainer of SparseM can do anything about this.

Beyond, that I guess it is a consequence of namespaces that Matrix 
defines methods via a derived generic on base::chol and not on the generic 
chol in SparseM.  That needs further thought by someone (JMC?) who 
understands the S4 internals.
But the whole point of generic functions is to allow one to write generic 
code.
#
On Feb 20, 2006, at 8:29 AM, Prof Brian Ripley wrote:

            
I'm happy to modify this, but would welcome advice.  The current  
snafu is a consequence of writing a first
version of SparseM with S3 methods and then converting (evidently  
incompletely) to S4.