On 06/05/2015 10:52 AM, Martin Maechler wrote:
Christophe Genolini <cgeno...@u-paris10.fr>
     on Fri, 5 Jun 2015 00:36:42 -0700 writes:

     > Hi all,
     > There is a compatibility issue between the package 'lme4' and my package
     > 'kml'. I define the "[" operator. It works just fine in my package (1). 
If I
     > try to use the lme4 package, then it does no longer work (2). Moreover, 
it
     > has some kind of strange behavior (3). Do you know what is wrong? Any 
idea
     > of how I can correct that?

     > Here is a reproductible example, and the same code with the result 
follows.

     > Thanks for your help
     > Christophe

   [ ... I'm providing slightly different code below .... ]

--- 8< ----------------- Execution of the previous code -------------------

library(kml)
Le chargement a nécessité le package : clv
Le chargement a nécessité le package : cluster
Le chargement a nécessité le package : class
Le chargement a nécessité le package : longitudinalData
Le chargement a nécessité le package : rgl
Le chargement a nécessité le package : misc3d
dn <- gald(1)

  ###########
### (1) the "[" operator works just fine

dn["traj"]
       t0   t1    t2    t3    t4   t5   t6    t7    t8    t9   t10
i1 -3.11 4.32  2.17  1.82  4.90 7.34 0.83 -2.70  5.36  4.96  3.16
i2 -7.11 1.40 -2.40 -2.96  4.31 0.50 1.25  0.52 -0.04  7.55  5.50
i3  2.80 6.23  6.08  2.87  2.58 2.88 6.58 -2.38  2.30 -1.74 -3.23
i4  2.24 0.91  6.50 10.92 11.32 7.79 7.78 10.69  9.15  1.07 -0.51

  ###########
### (2) using 'lme4', it does no longer work

library(lme4)
Le chargement a nécessité le package : Matrix
Le chargement a nécessité le package : Rcpp
dn["traj"]
Error in x[i, j] :
   erreur d'évaluation de l'argument 'j' lors de la sélection d'une méthode
pour la fonction '[' : Erreur : l'argument "j" est manquant, avec aucune
valeur par défaut

  ###########
### (3) If I define again the "[", it does not work the first time I call
it, but it work the second time!
setMethod("[",
+   signature=signature(x="ClusterLongData", i="character", j="ANY",drop="ANY"),
+   definition=function (x, i, j="missing", ..., drop = TRUE){

Your file has two definitions of

  setMethod("[", c("ClusterLongData", ...

I deleted the first one.

The second definition had

    signature=signature(x="ClusterLongData", i="character", j="ANY",drop="ANY"),

whereas probably you mean to say that you'll handle

    signature=signature(x="ClusterLongData", i="character",
                        j="missing", drop="ANY")

The next line says

    definition=function (x, i, j="missing", ..., drop = TRUE){

which provides a default value for 'j' when j is not provided by the user. Thus later when you say

   x[i, j]

you are performing dn["traj", "missing"] when probably you meant

  x[i, , drop=drop]

Making these changes, so the definition is

setMethod(
    "[",
    signature=signature(x="ClusterLongData", i="character", j="missing",
      drop="ANY"),
    definition=function (x, i, j, ..., drop = TRUE){
        if (is.numeric(i)) {
            stop("[ClusterLongData:getteur]: to get a clusters list, use 
['ci']")
        }else{}
        if (i %in% c("criterionValues", "criterionValuesAsMatrix")){
            j <- x['criterionActif']
        }else{}
        if (i %in% c(CRITERION_NAMES, "criterionActif", CLUSTER_NAMES,
                     "criterionValues", "criterionValuesAsMatrix", "sorted",
                     "initializationMethod")) {
            x <- as(x, "ListPartition")
        }else{
            x <- as(x, "LongData")
        }
        x[i, , drop=drop]
    })

Allows operations to work correctly.

> library(kml)
Loading required package: clv
Loading required package: cluster
Loading required package: class
Loading required package: longitudinalData
Loading required package: rgl
Loading required package: misc3d
> library(Matrix)
> x = gald(1)["traj"]
> x
      t0    t1    t2    t3    t4    t5    t6    t7    t8    t9   t10
i1 -3.18 -1.19 -1.17  1.56 -0.70  1.78 -0.95 -2.00 -5.05  1.05  2.84
i2  3.51  1.72  6.97  6.09  7.81  8.33  9.54 14.38 16.14 12.82 13.86
i3  9.60 11.59  9.09  6.31  9.24  7.69  4.26 -0.80  2.70  1.63  1.21
i4 -0.54  3.80  6.05 10.41 12.60 12.32 10.33 11.05  7.89  5.21  0.67

It's hard to tell whether is an issue with the methods package, or just that Matrix offered a better nearest 'method' than those provided by kml / longitudinalData.



+       x <- as(x, "LongData")
+       return(x[i, j])
+     }
+ )
[1] "["

### No working the first time I use it
dn["traj"]
Error in dn["traj"] :
   l'argument "j" est manquant, avec aucune valeur par défaut

### But working the second time
dn["traj"]
       t0   t1    t2    t3    t4   t5   t6    t7    t8    t9   t10
i1 -3.11 4.32  2.17  1.82  4.90 7.34 0.83 -2.70  5.36  4.96  3.16
i2 -7.11 1.40 -2.40 -2.96  4.31 0.50 1.25  0.52 -0.04  7.55  5.50
i3  2.80 6.23  6.08  2.87  2.58 2.88 6.58 -2.38  2.30 -1.74 -3.23
i4  2.24 0.91  6.50 10.92 11.32 7.79 7.78 10.69  9.15  1.07 -0.51

I have made some investigations, but have to stop for now, and
leave this hopefully to others knowledgable about S4 method
dispatch, etc :

1) I am confident to say that you have uncovered an "unfelicity if
   not a bug" in R.

2) I am also pretty confident that the "[" methods that you
   define in 'kml' and in the package '

3) Diagnosing is not easy: As you have shown yourself above,
   in some situations the bug "bites" and if you repeat the *same*
   code, things work.

   This is related to the fact that S4 methods are __cached__
   (so next time they are found more quickly) under some
   circumstances, and the cache is cleared under other such circumstances.

3b) Actually, I am sure that we have seen +/- the same problem many
     months ago, in other contexts but did not get "down to it";
     and at the moment, I cannot quickly find where to look for
     the problem there...


##--- 8< ------------Commented (incl output) reproducible code--------------
library(kml)

### Creating some data
dn <- gald(1)
(dnt <- dn["traj"])

showMethods("[")
## Function: [ (package base)
## x="ClusterLongData", i="character"
## x="ListPartition", i="ANY"
## x="LongData", i="ANY"
## x="LongData", i="character"
##     (inherited from: x="LongData", i="ANY")
## x="LongData3d", i="ANY"
## x="nonStructure", i="ANY"
## x="ParChoice", i="ANY"
## x="ParKml", i="ANY"
## x="ParLongData", i="ANY"
## x="Partition", i="ANY"
## x="ParWindows", i="ANY"

### using Matrix  (or lme4, which 'Depends' on Matrix; hence same effect)
library(Matrix)
dn["traj"]
## Error in x[i, j] :
##   error in evaluating the argument 'j' in selecting a method for function '[': Error: 
argument "j" is missing, with no default
traceback()
## 3: x[i, j]
## 2: dn["traj"]
## 1: dn["traj"]
(ms <- methods(`[`)) ## 81 methods

##---- MM: debugging :
trace("[", browser, signature=c("ClusterLongData", "character", "missing",   
"missing"))
trace("[", browser, signature=c("LongData",        "character", "character", 
"missing"))
dn["traj"]
## -> you get into the browser, just press   "c"   twice (once for each "trace")
## ==> it works !!

## Remove the tracing :
untrace("[", signature=c("ClusterLongData", "character", "missing",   
"missing"))
untrace("[", signature=c("LongData",        "character", "character", 
"missing"))
dn["traj"]
## Error in dn["traj"] : argument "j" is missing, with no default

## Debugging only the *inner* function:
trace("[", browser, signature=c("LongData",        "character", "character", 
"missing"))
dn["traj"]
## Error ....
untrace("[", signature=c("LongData",        "character", "character", 
"missing"))

## Debugging only the *outer* function:
trace("[", browser, signature=c("ClusterLongData", "character", "missing",   
"missing"))
dn["traj"] ## -> debugger, press 'c'
## it works!
##       t0    t1    t2   t3   t4   t5   t6    t7    t8    t9   t10
## i1  7.38  4.80  4.80 0.73 0.58 2.22 0.55 -1.05  0.79  5.20  4.43
## i2  1.55  2.01 -0.29 2.12 4.44 7.33 9.09  4.76 12.18  5.92  8.06
## i3 13.60 14.72 10.15 9.25 8.70 8.34 6.71  5.84  3.44  2.10  2.17
## i4 -7.49 -1.80  0.08 2.51 6.61 4.56 8.96  3.05  3.41 -2.62 -4.09
untrace("[", signature=c("ClusterLongData", "character", "missing",   
"missing"))

##--- {end of reproducible code} --------------

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
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.



--
Computational Biology / Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N.
PO Box 19024 Seattle, WA 98109

Location: Arnold Building M1 B861
Phone: (206) 667-2793

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
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