37
votes

I would like to understand why, in the the dplyr or magrittr package, and more specifically the chaining function %>% has some trouble with the basic operators +, -, *, and /

Chaining takes the output of previous statement and feeds it as first argument of the next:

1:10 %>% sum
# [55]

Thus how come this doesn't work

1:10 %>%  *2 %>% sum
1:10 %>% .*2 %>% sum

I also found that the following syntax works for adding/substracting, but not multiply or divide. why so?

1:10 %>% +(2) # works OK
1:10 %>% *(2) # nope...

So should I write an anonymous function even to do a *2 operation on my data.frame?

1:10 %>% (function(x) x*2) %>% sum

Thanks, I couldn't find the answer in other SO questions.

2
You want to use the magrittr package here instead of dplyr. dplyr is only for working with data.frames while the pipe operator (%>%) is originally from magrittr. - talat
Just add them normally? - stanekam
Explanation of this behaviour: plus and minus only work here because the parser sees them as unary plus and minus operators, as in -2. So its valid syntax. So it parses okay here, and then magrittr gets to work mangling the evaluation into a binary "-"(x, 2) expression. There's no unary '*' or '/' function, so those ops fail. Once quoted, they become valid syntax again and the corresponding function is gotten. - Spacedman
Eventually I add that this way of doing also works for test operators such as '>', '=='. - agenis

2 Answers

52
votes

Surround the operators with backticks or quotes, and things should work as expected:

1:10 %>%  `*`(2) %>% sum
# [1] 110

1:10 %>%  `/`(2) %>% sum
# [1] 27.5
40
votes

Or use the Aliases in magrittr package, e.g.:

1:10 %>% multiply_by(2)
# [1]  2  4  6  8 10 12 14 16 18 20

1:10 %>% add(2)
# [1]  3  4  5  6  7  8  9 10 11 12

The Aliases include 'words' for boolean operators, extract/replace, and arithmetic operators