[R] Can we get rid of && and ||?
Bill Venables
Bill.Venables at cmis.csiro.au
Thu Apr 13 14:16:52 CEST 2000
At 12:24 PM 13/4/2000 +0200, GB wrote:
>
>I have some doubts about the implementation of the operators '&&' and
>'||'. I only discuss '&&' here. The reason: One of my students tried
>(slightly simplified here)
>
>> x <- c(0.5, 1.2, -0.8, 0.7)
>> y <- x[(x > 0) && (x < 1)]
>> y
>[1] 0.5 1.2 -0.8 0.7
Notice that (x > 0) && (x < 1) is a scalar logical (here TRUE). The vector is
reproduced because of the recycling rule.
>
>This was not his intention. He wanted
>
>> y <- x[(x > 0) & (x < 1)]
>> y
>[1] 0.5 0.7
..my guess is he learned something pretty thoroughly, then!
>
>I suggested that his first attempt should render a "syntax error", since
>'&&' only applies to scalar logicals. However, upon reading
>the documentation, I found that 'a && b' is in fact equivalent to
>'a[1] & b[1]' (with one exception).
>
>Therefore, '&&' seems to be of little use in R programming. You can
>almost always use '&' instead (This is in sharp contrast to the use of
>& and && in the C programming language). I can only see one
>advantage (admittedly important, though) with '&&'. In
>
>if (is.numeric(x) && min(x) > 0) ..... (Found in MASS3, p. 94)
>
>you avoid 'min(x)' to be evaluated if x is non-numeric. This doesn't
>work with '&', because then both expressions are evaluated before the
>comparison.
This looks like a "go with the flow" argument: if the user expects something
to work that way, make it do so. I have to disagree, very strongly.
>
>Provided there are no other differences, I suggest that either
>
>a) '&&' is made obsolete, and '&' is 'improved' so that b in
> 'a & b' is evaluated only if some component of a is TRUE, or
I think you miss the point quite seriously. Under the present semantics
in 'a & b' *both* a and b are *guaranteed* unconditionally to be evaluated,
and in a lazy evaluation language, especially, that unconditional evaluation
can be vital. With 'a && b' (a) the result is guaranteed to be scalar and
(b) b is only *conditionally* evaluated (as you know, of course, but I must
emphasize it nevertheless).
Viewed in this light 'a & b' and 'a && b' are both syntactically and
semantically quite different. Programmers should get to realise that,
after which you start to read code with a better understanding of the
implications. If you blurred the distinction between & and && you would
make code less readible (to the informed reader, at least) and make the
interpreter more complex for no good purpose.
>
>b) a warning (or syntax error) is given if '&&' is used with at least
> one non-scalar argument.
Well it cannot be a syntax error since the properties of the arguments,
a and b, are unknown at parse time (and may be different on different
evalutations).
A warning would be useful, though, and in line with what happens "elsewhere".
>
>Any objections?
Yep, plenty.
Bill Venables.
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
More information about the R-help
mailing list