On Sat, Dec 12, 2015 at 1:51 PM, Martin Maechler <maech...@stat.math.ethz.ch> wrote: >>>>>> Hadley Wickham <h.wick...@gmail.com> >>>>>> on Sat, 12 Dec 2015 08:08:54 -0600 writes: > > > On Sat, Dec 12, 2015 at 3:54 AM, Martin Maechler > > <maech...@stat.math.ethz.ch> wrote: > >>>>>>> Henrik Bengtsson <henrik.bengts...@gmail.com> on > >>>>>>> Fri, 11 Dec 2015 08:20:55 -0800 writes: > >> > >> > On Fri, Dec 11, 2015 at 8:10 AM, David Winsemius > >> <dwinsem...@comcast.net> wrote: > >> >> > >> >>> On Dec 11, 2015, at 5:38 AM, Dario Beraldi > >> <dario.bera...@gmail.com> wrote: > >> >>> > >> >>> Hi All, > >> >>> > >> >>> I'd like to understand the reason why > >> stopifnot(logical(0) == x) doesn't >>> (never?) throw an > >> exception, at least in these cases: > >> >> > >> >> The usual way to test for a length-0 logical object is > >> to use length(): > >> >> > >> >> x <- logical(0) > >> >> > >> >> stopifnot( !length(x) & mode(x)=="logical" ) > >> > >> > I found > >> > >> > stopifnot(!length(x), mode(x) == "logical") > >> > >> > more helpful when troubleshooting, because it will tell > >> you whether > it's !length(x) or mode(x) == "logical" > >> that is FALSE. It's as if you > wrote: > >> > >> > stopifnot(!length(x)) > stopifnot(mode(x) == "logical") > >> > >> > /Henrik > >> > >> Yes, indeed, thank you Henrik --- and Jeff Newmiller > >> who's nice humorous reply added other relevant points. > >> > >> As author stopifnot(), I do agree with Dario's "gut > >> feeling" that stopifnot() "somehow ought to do the right > >> thing" in cases such as > >> > >> stopifnot(dim(x) == c(3,4)) > >> > >> which is really subtle version of his cases {But the gut > >> feeling is wrong, as I argue from now on}. > > > Personally, I think the problem there is that people > > forget that == is vectorised, and for a non-vectorised > > equality check you really should use identical: > > > stopifnot(identical(dim(x), c(3,4))) > > You are right "in theory" but practice is less easy: > identical() tends to be too subtle for many users ... even > yourself (;-), not really of course!), Hadley, in the above case: > > Your stopifnot() would *always* stop, i.e., signal an error > because typically all dim() methods return integer, and c(3,4) > is double. > So, if even Hadley gets it wrong so easily, I wonder if its good > to advertize to always use identical() in such cases. > I indeed would quite often use identical() in such tests, and > you'd too and would quickly find and fix the "trap" of course.. > So you are mostly right also in my opinion...
Ooops, yes - but you would discover this pretty quickly if you weren't coding in a email client ;) I wonder if R is missing an equality operator for this case. Currently: * == is suboptimal because it's vectorised * all.equal is suboptimal because it returns TRUE or a text string * identical is suboptimal because it doesn't do common coercions Do we need another function (equals()?) that uses the same coercion rules as == but isn't vectorised? (Like == it would only work with vectors, so you'd still need identical() for (e.g.) comparing environments) Hadley -- http://had.co.nz/ ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.