The combination of first-class environments, lexical scoping, and metaprogramming gives us a powerful toolkit for translating R code into other languages. One fully-fledged example of this idea is dbplyr, which powers the database backends for dplyr, allowing you to express data manipulation in R and automatically translate it into SQL. You can see the key idea in
translate_sql() which takes R code and returns the equivalent SQL:
library(dbplyr) translate_sql(x ^ 2) #> <SQL> POWER(`x`, 2.0) translate_sql(x < 5 & !is.na(x)) #> <SQL> `x` < 5.0 AND NOT(((`x`) IS NULL)) translate_sql(!first %in% c("John", "Roger", "Robert")) #> <SQL> NOT(`first` IN ('John', 'Roger', 'Robert')) translate_sql(select == 7) #> <SQL> `select` = 7.0
Translating R to SQL is complex because of the many idiosyncrasies of SQL dialects, so here I’ll develop two simple, but useful, domain specific languages (DSL): one to generate HTML, and the other to generate mathematical equations in LaTeX.
If you’re interested in learning more about domain specific languages in general, I highly recommend Domain Specific Languages (Fowler 2010). It discusses many options for creating a DSL and provides many examples of different languages.
This chapter pulls together many techniques discussed elsewhere in the book. In particular, you’ll need to understand environments, expressions, tidy evaluation, and a little functional programming and S3. We’ll use rlang for metaprogramming tools, and purrr for functional programming.
Fowler, Martin. 2010. Domain-Specific Languages. Pearson Education. http://amzn.com/0321712943.