Search code examples
rtidyverserlang

What is the "embracing operator" `{{ }}`?


I just came across the "embracing operator" {{ }} in section 2.2.3 of the tidyverse style guide.

What does the embracing operator {{ }} do in R?


Solution

  • It's called curly-curly operator (see ?"{{}}").

    It's useful when passing an argument that has to be substituted in place before being evaluated in another context.

    See this simple example (although a bit awkward as we could simple quote the "cyl" when calling the function here):

    library(dplyr)
    
    # does not work
    get_var <- function(data, column) {
      data %>% select(column)
    }
    
    get_var(mtcars, cyl)
    #> Error: object 'cyl' not found
    
    # works
    get_var <- function(data, column) {
      data %>% select({{ column }})
    }
    
    get_var(mtcars, cyl)
    #>                     cyl
    #> Mazda RX4             6
    #> Mazda RX4 Wag         6
    #> Datsun 710            4
    #> Hornet 4 Drive        6
    #> Hornet Sportabout     8
    #> ...
    

    Created on 2020-07-08 by the reprex package (v0.3.0)

    Or maybe a better example:

    library(dplyr)
    
    # does not work
    get_var <- function(data, column, value) {
      data %>% filter(column == value)
    }
    
    get_var(mtcars, cyl, 6)
    #> Error: Problem with `filter()` input `..1`.
    #> x object 'cyl' not found
    #> i Input `..1` is `column == value`.
    
    # works
    get_var <- function(data, column, value) {
      data %>% filter({{ column }} == value)
    }
    
    get_var(mtcars, cyl, 6)
    #>                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
    #> Mazda RX4      21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
    #> Mazda RX4 Wag  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
    #> Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
    #> Valiant        18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
    #> Merc 280       19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
    #> Merc 280C      17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
    #> Ferrari Dino   19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
    

    Created on 2020-07-08 by the reprex package (v0.3.0)