[R] stopifnot with logical(0)
Duncan Murdoch
murdoch.duncan at gmail.com
Sat Dec 12 16:57:28 CET 2015
On 12/12/2015 9:08 AM, Hadley Wickham wrote:
> On Sat, Dec 12, 2015 at 3:54 AM, Martin Maechler
> <maechler at stat.math.ethz.ch> wrote:
>>>>>>> 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}.
>
> 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)))
identical() is a little pickier than people might think:
> identical(dim(matrix(0, 3,4)), c(3,4))
[1] FALSE
> identical(dim(matrix(0, 3,4)), c(3L,4L))
[1] TRUE
Duncan Murdoch
More information about the R-help
mailing list