Here is source code for help(Syntax) from S+, which I think follows closely the original S help file: .Ix precedence The following \f6infix\fP operators are recognized by the parser. They are listed in decreasing precedence. In the event of ties, evaluation is from left to right. .sp .in +.5i .nf .ta 1.5i,3.5iR `$' component selection \fBHIGH\fP `@' slot selection `[ [[' subscripts, elements `^' exponentiation `-' unary minus `:' sequence operator `%'\f2anything\fP`%' special operator `* /' multiply, divide `+ - ?' add, subtract, documentation `< > <= >=' ` == !=' comparison `!' not `& | && ||' and, or `\~' formulas `<<-' permanent assignment to working data `<-' `->' `=' assignment \fBLOW\fP .sp .in -.5i .fi
All logical operators have lower precedence than any comparison operator and all comparison operators are lower than any arithmetic operators. The former means that '! a >= b' is parsed as !(a>=b) and not the (!a)>=b that C would make it. Perhaps the difference arose because didn't have real boolean variables and S did. (Also, contrary to the original assertion, '%anything%' is in the middle of the arithmetic operators, above '*' and below ':'.) Bill Dunlap TIBCO Software wdunlap tibco.com On Tue, May 6, 2014 at 10:01 AM, peter dalgaard <pda...@gmail.com> wrote: > > On 06 May 2014, at 18:20 , Hadley Wickham <h.wick...@gmail.com> wrote: > >>>> BTW, that %in% has precedence over arithmetic operations is surprising, >>>> error-prone, and doesn't cover any reasonable use case (who needs to >>>> multiply the logical vector returned by %in% by some value?) but that's >>>> another story: >>> >>> The point here is that the %foo% operators all have the _same_ precedence. >>> In principle, they can be user-coded, and there is no way to express what >>> precedence is desirable. It may turn out slightly weird for %in%, but think >>> of what would happen if %*% had lower precedence than addition. >> >> This is getting way off topic, but I find the precedence of ! to be >> more surprising: >> >>> !F + !F >> [1] FALSE >> >> i.e. that's interpreted as !(F + !F) not (!F) + (!F). > > Yes, UNOT has lower precedence than arithmetic and comparison ops in gram.y. > So > >> !2<3 > [1] FALSE >> !2+2==4 > [1] FALSE > > I suspect that that is as old as original sin (i.e., inherited from S). > Anyone have the Blue Book to hand to verify? It's easy enough to change, but > the sky would likely fall down on our heads if we tried... > > Also surprising: > >> quote(!2+!2) > !2 + (!2) > > where it is somewhat perplexing what the parentheses are supposed to be good > for. > > >> >> Hadley >> >> -- >> http://had.co.nz/ > > -- > Peter Dalgaard, Professor > Center for Statistics, Copenhagen Business School > Solbjerg Plads 3, 2000 Frederiksberg, Denmark > Phone: (+45)38153501 > Email: pd....@cbs.dk Priv: pda...@gmail.com > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel