[R] stopifnot with logical(0)

Martin Maechler maechler at stat.math.ethz.ch
Sat Dec 12 10:54:11 CET 2015

>>>>> Henrik Bengtsson <henrik.bengtsson at gmail.com>
>>>>>     on Fri, 11 Dec 2015 08:20:55 -0800 writes:

    > On Fri, Dec 11, 2015 at 8:10 AM, David Winsemius <dwinsemius at comcast.net> wrote:
    >>> On Dec 11, 2015, at 5:38 AM, Dario Beraldi <dario.beraldi at 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}.

Someone writing the above would want stopifnot() to stop in the
case where x is a simple vector instead of a
matrix/data.frame/... with dimensions c(3,4) ... but it will not
because, as Bill or Jeff explained,  "the empty set is always
true", and so yes indeed,  you have to care about length-0
expressions in stopifnot().

Indeed, in the past, I had thought of  "improving" stopifnot()
by giving a warning or even stop()  for  logical(0)  expressions,
but I quickly dismissed that idea after some experiments.

My conclusion: Breaking such a fundamental lemma of logic as 
  "the empty set is always true"
will lead to all kinds of illogical situations ... so don't do that! 

Martin Maechler,
ETH Zurich

More information about the R-help mailing list