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