[Rd] all.equal.list() sometimes fails with unnamed and named components (PR#674)

Kurt Hornik Kurt.Hornik@ci.tuwien.ac.at
Tue, 3 Oct 2000 17:40:47 +0200 (CEST)


>>>>> cberry  writes:

> examples:

> 1) Fails to report that components 2 and 3 differ

> all.equal(list(1,2,3,zap=1),list(1,3,4,zap=2))
> [1] "Component zap: Mean relative  difference: 1


> 2) Incorrectly asserts all are equal when components 2 and 3 differ

>> all.equal(list(1,2,3,zap=1),list(1,3,4,zap=1))
> [1] TRUE

> 3) Removing named component reveals differences:

>> all.equal(list(1,2,3,1),list(1,3,4,1))
> [1] "Component 2: Mean relative  difference: 0.5"      
> [2] "Component 3: Mean relative  difference: 0.3333333"

> 4) Unequal first component reveals differences

>> all.equal(list(2,2,3,zap=1),list(1,3,4,zap=1))
> [1] "Component : Mean relative  difference: 0.5"
> [2] "Component : Mean relative  difference: 0.5"
> [3] "Component : Mean relative  difference: 0.5"
>> all.equal(list(2,2,3,zap=1),list(1,3,4,zap=2))
> [1] "Component : Mean relative  difference: 0.5" 
> [2] "Component : Mean relative  difference: 0.5" 
> [3] "Component : Mean relative  difference: 0.5" 
> [4] "Component zap: Mean relative  difference: 1"
>> 

> 5) Second component IS equal, but:

>> all.equal(list(2,2,3,zap=1),list(1,2,4,zap=2))
> [1] "Component : Mean relative  difference: 0.5" 
> [2] "Component : Mean relative  difference: 0.5" 
> [3] "Component : Mean relative  difference: 0.5" 
> [4] "Component zap: Mean relative  difference: 1"

> --please do not edit the information below--

> Version:
>  platform = sparc-sun-solaris2.7
>  arch = sparc
>  os = solaris2.7
>  system = sparc, solaris2.7
>  status = 
>  major = 1
>  minor = 1.0
>  year = 2000
>  month = June
>  day = 15
>  language = R

> Search Path:
>  .GlobalEnv, Autoloads, package:base

> Chuck Berry

I think the above happens because all.equal.list() is broken.  The fix
is not entirely clear, because I am not sure what we really want.

Anyway, in all of the above examples we compare lists which are named in
the sense that names() is not NULL, but not ``fully'' named in the sense
that any(nchar(names()) == NULL) is TRUE.  In this case, iseq gets set
to nt[c.in.t] which in the above example gives

Browse[1]> nt[c.in.t]
[1] ""    ""    ""    "zap"

Hence in the for(i in iseq) loop we do three comparisons of the first
component, due to subscripting with "".

The obvious idea is that we must use positional indices where we do not
have named ones.

Now for the problem I see in the current logic.  We currently do

   if both lists are named (at least partially) then ... else fi

Maybe we should change this as follows: if either of the two lists has
names, work though the named components.  Warn about the ones not
present in both.  Compare the ones present in both.  Then get rid of all
named components and compare what is left in positional order.

As I said, I am not sure that this is really what we want.

Comments?

-k
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._