Prof Brian Ripley writes:
To: Kurt.Hornik@ci.tuwien.ac.at
Cc: cberry@tajo.ucsd.edu, r-devel@stat.math.ethz.ch
Subject: Re: [Rd] all.equal.list() sometimes fails with unnamed and named
From: Peter Dalgaard BSA <p.dalgaard@biostat.ku.dk>
Date: 03 Oct 2000 18:05:50 +0200
Kurt Hornik <Kurt.Hornik@ci.tuwien.ac.at> writes:
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?
I think you might be right, and also that this is an easy thing to
implement. Then we'd have
all.equal(list(a=1,b=2,3,4),list(3,b=2,4,a=1)) == TRUE
Right?
Probably not. Lists do have orderings: they are not sets but generic
vectors.
all.equal(list(a=1,b=2,3,4),list(3,b=2,4,a=1))
[1] "Names: 2 string mismatches"
attr(, "continue"):
[1] T
all.equal(list(a=1,b=2,3,4), list(a=1,b=2,4,3))
That's not what current versions of S-PLUS give, as one might hope.
..which does look like a "compatible bug"
Hmm. Maybe one wants positional matching in any case? But then, what
is the named-component extraction about??
I think that both the names and components should match exactly (the
components recursively). Unfortunately the named-component extraction
is partial matching (at least, sometimes) so the ordering of the names
always matters. (There's an S/R difference here I keep forgetting to
write down. I think it is
x <- list(aa=1, bb=2)
x["a"]
which gives in S
$aa:
[1] 1
and in R
$"NA"
NULL
so S always partial matches, but R does not always.)