[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
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._