My question is where does the piping operator of magrittr
package %>%
come in the order of operations?
I have a problem simmilar to the following:
set.seed(10)
df <- data.frame(a=rnorm(3),b=rnorm(3),c=rnorm(3))
df/rowSums(df) %>% round(.,3)
This results in the following non rounded figures:
a b c 1 -0.0121966 0.119878 0.8922125
To get the rounded figures I need to put df/rowSums(df)
between brackets.
I experimented with the +
,-
,*
,/
and ^
and from the results I found the order of operation is as follow:
Is that right or there is something wrong with my understanding of the piping operator?
The help page you are looking for is ?Syntax
. (Don't feel bad for not being able to find this, it took me about six guesses at search keywords.) I'm going to quote its entire operator precedence table here:
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)
So magrittr's pipe operators, like all the operators of the form %whatever%
, do indeed have precedence greater than multiply and divide but lower than exponentiation, and this is guaranteed by the language specification.
NOTE: As of R 4.1.0 the new pipe operator |>
has the same precedence as other special operators (so the same as the magrittr pipe operator)
I don't think the expression you showed is a good place to use %>%
piping. Why not just write
round(df/rowSums(df), 3)
which has the evaluation order you want, and is (IMNSHO) easier to read as well?