From h@wickh@m @ending from gm@il@com  Thu Aug 30 20:15:21 2018
From: h@wickh@m @ending from gm@il@com (Hadley Wickham)
Date: Thu, 30 Aug 2018 13:15:21 -0500
Subject: [Rd] ROBUSTNESS: x || y and x && y to give warning/error if
 length(x) != 1 or length(y) != 1
In-Reply-To: <23432.5145.624837.968060@stat.math.ethz.ch>
References: <CAFDcVCSEqHvfhD358GD3Fgz6FjuOiMiYHswz+pyTnAEoV0CyZw@mail.gmail.com>
 <CAO1zAVaCyKOQLFi2161PB3ycHbr72ue3EtTa189Lz-C+rO1_0w@mail.gmail.com>
 <c5c5721f-65fb-39f0-c7e9-77bb413fbb03@kogentum.hu>
 <CAO1zAVYgQyKP3AbyB_AdTPKogWGQs=cC+YaTtLuG2OSahzvrVA@mail.gmail.com>
 <23432.5145.624837.968060@stat.math.ethz.ch>
Message-ID: <CABdHhvHvjHNdD3XkU=qA8CzxnL6VFritQ2tPy7JrY8VfbnR4rg@mail.gmail.com>

On Thu, Aug 30, 2018 at 10:58 AM Martin Maechler
<maechler at stat.math.ethz.ch> wrote:
>
> >>>>> Joris Meys
> >>>>>     on Thu, 30 Aug 2018 14:48:01 +0200 writes:
>
>     > On Thu, Aug 30, 2018 at 2:09 PM D?nes T?th
>     > <toth.denes at kogentum.hu> wrote:
>     >> Note that `||` and `&&` have never been symmetric:
>     >>
>     >> TRUE || stop() # returns TRUE stop() || TRUE # returns an
>     >> error
>     >>
>     >>
>     > Fair point. So the suggestion would be to check whether x
>     > is of length 1 and whether y is of length 1 only when
>     > needed. I.e.
>
>     > c(TRUE,FALSE) || TRUE
>
>     > would give an error and
>
>     > TRUE || c(TRUE, FALSE)
>
>     > would pass.
>
>     > Thought about it a bit more, and I can't come up with a
>     > use case where the first line must pass. So if the short
>     > circuiting remains and the extra check only gives a small
>     > performance penalty, adding the error could indeed make
>     > some bugs more obvious.
>
> I agree "in theory".
> Thank you, Henrik, for bringing it up!
>
> In practice I think we should start having a warning signalled.
> I have checked the source code in the mean time, and the check
> is really very cheap
> { because it can/should be done after checking isNumber(): so
>   then we know we have an atomic and can use XLENGTH() }
>
>
> The 0-length case I don't think we should change as I do find
> NA (is logical!) to be an appropriate logical answer.

Can you explain your reasoning a bit more here? I'd like to understand
the general principle, because from my perspective it's more
parsimonious to say that the inputs to || and && must be length 1,
rather than to say that inputs could be length 0 or length 1, and in
the length 0 case they are replaced with NA.

Hadley

-- 
http://hadley.nz



[Rd] ROBUSTNESS: x || y and x && y to give warning/error if length(x) != 1 or length(y) != 1
Hadley Wickham