[Rd] multiple defines of diag

Terry Therneau therneau at mayo.edu
Thu Oct 6 19:19:13 CEST 2011


On Thu, 2011-10-06 at 10:00 -0400, Kasper Daniel Hansen wrote:
> if you're using two packages that both define a diag function/method
> you absolutely _have_ to resolve this using your NAMESPACE.  [Update:
> I see both are methods.  I actually don't know what happens when you
> have the same generic in both packages]
> 

Your response made me look further, with some surprising results.

1. Sequential loading
tmt226% R --vanilla
R version 2.13.0 (2011-04-13)

> library(bdsmatrix)
> tmat <- bdsmatrix(c(3,2,2,4),
    c(22,1,2,21,3,20,19,4,18,17,5,16,15,6,7, 8,14,9,10,13,11,12),
    matrix(c(1,0,1,1,0,0,1,1,0,1,0,10,0, 
           0,1,1,0,1,1,0,1,1,0,1,0,10), ncol=2))
> tmat[1:7,1:7]     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]   22    1    2    0    0    0    0
[2,]    1   21    3    0    0    0    0
[3,]    2    3   20    0    0    0    0
[4,]    0    0    0   19    4    0    0
[5,]    0    0    0    4   18    0    0
[6,]    0    0    0    0    0   17    5> 

> diag(tmat)
 [1] 22 21 20 19 18 17 16 15 14 13 12 10 10

> library(Matrix)
Loading required package: lattice

Attaching package: 'Matrix'

The following object(s) are masked from 'package:base':

    det

> diag(tmat)
 [1] 22 21 20 19 18 17 16 15 14 13 12 10 10

  Things to note: 
         in this case I did not get a message about overwriting the diag
method, 
         it works.  

This was not my experience with ranef(), an S3 generic that coxme, nlme,
and lme4 all define; there whichever library loaded last did not
discover existing methods.  That is, if one loaded nlme after coxme,
then ranef(a coxme object) would not dispatch ranef.coxme.  Our solution
(Doug Bates and I) was to have both coxme and lme4 import ranef and
fixef from the nlme library.
  However, per above it appears to work with S4 generics.
  Can I count on it though?

-------------

Case 2:

tmt229% R --vanilla
R version 2.13.0 (2011-04-13)

> library(coxme)
Loading required package: survival
Loading required package: splines
Loading required package: bdsmatrix
Loading required package: nlme
Loading required package: Matrix
Loading required package: lattice

Attaching package: 'Matrix'

The following object(s) are masked from 'package:base':

    det

Warning message:
replacing previous import ‘diag’ when loading ‘Matrix’ 

> tmat <- bdsmatrix(c(3,2,2,4), 
              c(22,1,2,21,3,20,19,4,18,17,5,16,15,6,7,
                8,14,9,10,13,11,12),
              matrix(c(1,0,1,1,0,0,1,1,0,1,0,10,0,
                       0,1,1,0,1,1,0,1,1,0,1,0,10), ncol=2))
>diag(tmat)
 [1] 22 21 20 19 18 17 16 15 14 13 12 10 10


 Things to note:
     I now get a warning message about diag. Why only here?
     Per the earlier comment I'm not importing all of nlme, just the two
generics
     It still works

(This example isn't reproducable for others: the coxme library on CRAN
does not yet have a Matrix dependency.)



More information about the R-devel mailing list