[Rd] Wierd problem comparing numeric values and list using == (PR#1073)

John Chambers jmc@research.bell-labs.com
Mon, 27 Aug 2001 08:44:22 -0400


Peter Dalgaard BSA wrote:
> 
> gregory_r_warnes@groton.pfizer.com writes:
> 
> > Under R 1.3.0 on Solaris and Windows NT  there seems to be a bug in == when
> > applied to elements of a list, particularly when one of the elements is of
> > mode integer:
> >
> >       > list(1) == list(1)
> >       [1] FALSE
> >       > 1 == list(1)
> >       [1] TRUE
> >       > as.integer(1)==list(as.integer(1))
> >       [1] FALSE
> >       > as.integer(1)==list(as.double(1))
> >       [1] FALSE
> >       > list(as.integer(1))==list(as.integer(1))
> >       [1] FALSE
> >       > list(as.integer(1))==as.integer(1)
> >       [1] FALSE
> >       > list(as.double(1))==list(as.double(1))
> >       [1] FALSE
> >
> > However, these cases work:
> >
> >       > as.double(1)==list(as.integer(1))
> >       [1] TRUE
> >       > list(as.integer(1))==as.double(1)
> >       [1] TRUE
> >
> > Replacing the bare integer/double with a vector constructed with c() doesn't
> > change the results, and comparing between vectors created with c() appears
> > correct.
> 
> It is not entirely clear what we *should* be doing here. S (-PLUS 3.4)
> is at least consistent:
> 
> > list(1) == list(1)
> Error in list(1) == list(1): == operation on mode "list" undefined
> Dumped
> >  1 == list(1)
> Error in 1 == list(1): == operation on mode "list" undefined
> Dumped
> > as.integer(1)==list(as.integer(1))
> Error in as.integer(1) == list(as.integer(1)): == operation on mode "list"
>         undefined
> Dumped
> ...
> 
> so one might argue that you shouldn't do that in the first place...
> (or that the bug is that we do not expressly forbid doing this.)
> 
>         -p
> 
> --
>    O__  ---- Peter Dalgaard             Blegdamsvej 3
>   c/ /'_ --- Dept. of Biostatistics     2200 Cph. N
>  (*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
> ~~~~~~~~~~ - (p.dalgaard@biostat.ku.dk)             FAX: (+45) 35327907

As of 1.4, we will have the `identical' function, which is the right way
to do such comparisons in any case.

So I'd vote for making a use of the comparison operators an error unless
the type is correct (or there is a method defined).  There is even code
in relop.c (commented out) that looks like the right test.  Any
objections?

John

-- 
John M. Chambers                  jmc@bell-labs.com
Bell Labs, Lucent Technologies    office: (908)582-2681
700 Mountain Avenue, Room 2C-282  fax:    (908)582-3340
Murray Hill, NJ  07974            web: http://www.cs.bell-labs.com/~jmc
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
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
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._