ROBUSTNESS: x || y and x && y to give warning/error if length(x) != 1 or length(y) != 1
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