September 11, 2019

Fair warning: This post is about an interesting feature of the R language, it likely won’t help in your data analysis, wrangling or dataviz… but that doesn’t stop it from being at least quite interesting.

Earlier today we were spelunking through the `add_tally()`

function from `{dplyr}`

and came across this wonderful line of code:

`mutate(x, `:=`(!!name, !!n))`

That’s an example of using **prefix notation** for something that we would normally write with **infix notation**. Let’s compare the two:

**infix notation**

`mutate(x, !!name := !!n)`

**prefix notation**

`mutate(x, `:=`(!!name, !!n))`

Hadley Wickham makes clear in his Advanced R book that most functions in R are written in prefix notation, e.g. `paste("hello", "world")`

and `rep("hello world", 4)`

. There are only a small number of built in functions that have a infix operator, and most of them are arithmetic operators.

Now we know how to re-write an infix operator in prefix notation, we can do something fairly special; we can swap the operator programmatically. Let’s create a function where we can change the arithmetic operator applied to the first two weird numbers:

`swappable_operator <- function(prefix){prefix(70, 836)}`

Now we can give any of the infix operators as the argument for our function:

```
swappable_operator(`+`)
## [1] 906
swappable_operator(`-`)
## [1] -766
swappable_operator(`*`)
## [1] 58520
```

That’s quite fun, but there’s not that much benefit to writing R code like this. However, in some other programming languages the ability to use prefix notation is incredibly useful. From 2012 - 2015 I was a Mathematica consultant for Wolfram Research and would use the following construction at least every other day:

```
(*This is Wolfram Language code, NOT R*)
Accumulate@{1,2,4,16}
```

If anyone does have a good application for this prefix operator, please do let me know by replying to my tweet:

Did you know that #rstats has prefix notation via the backtick?

— finding youR way (@rfindingyourway) September 11, 2019

We only just discovered this today when spelunking through the code for add_tally() in {dplyr} 🧐 pic.twitter.com/doRXUnlu24