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
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._