# [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

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

```