# Syntax: Operator Syntax and Precedence

## Description

Outlines R syntax and gives the precedence of operators.

## Details

The following unary and binary operators are defined. They are listed in precedence groups, from highest to lowest.

 `:: :::` access variables in a namespace `\$ @` component / slot extraction `[ [[` indexing `^` exponentiation (right to left) `- +` unary minus and plus `:` sequence operator `%any%` special operators (including `%%` and `%/%`) `* /` multiply, divide `+ -` (binary) add, subtract `< > <= >= == !=` ordering and comparison `!` negation `& &&` and `| ||` or `~` as in formulae `-> ->>` rightwards assignment `<- <<-` assignment (right to left) `=` assignment (right to left) `?` help (unary and binary)

Within an expression operators of equal precedence are evaluated from left to right except where indicated. (Note that `=` is not necessarily an operator.)

The binary operators `::`, `:::`, `\$` and `@` require names or string constants on the right hand side, and the first two also require them on the left.

## Note

There are substantial precedence differences between R and S. In particular, in S `?` has the same precedence as (binary) `+ -` and `& && | ||` have equal precedence.

## References

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.

`Arithmetic`, `Comparison`, `Control`, `Extract`, `Logic`, `NumericConstants`, `Paren`, `Quotes`, `Reserved`.
 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15``` ```## Logical AND ("&&") has higher precedence than OR ("||"): TRUE || TRUE && FALSE # is the same as TRUE || (TRUE && FALSE) # and different from (TRUE || TRUE) && FALSE ## Special operators have higher precedence than "!" (logical NOT). ## You can use this for %in% : ! 1:10 %in% c(2, 3, 5, 7) # same as !(1:10 %in% c(2, 3, 5, 7)) ## but we strongly advise to use the "!( ... )" form in this case! ## '=' has lower precedence than '<-' ... so you should not mix them ## (and '<-' is considered better style anyway): ## Consequently, this gives a ("non-catchable") error x <- y = 5 #-> Error in (x <- y) = 5 : .... ```