Make Teaching R Quasi-Quotation Easier

[This article was first published on R – Win-Vector Blog, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

To make teaching R quasi-quotation easier it would be nice if R string-interpolation and quasi-quotation both used the same notation. They are related concepts. So some commonality of notation would actually be clarifying, and help teach the concepts. We will define both of the above terms, and demonstrate the relation between the two concepts.

String-interpolation

String-interpolation is the name for substituting value into a string. For example:

library("wrapr")

variable <- as.name("angle")

sinterp(
  'variable name is .(variable)'
)
## [1] "variable name is angle"

Notice the ".(variable)" portion was replaced with the actual variable name "angle". For string interpolation we are intentionally using the ".()" notation that Thomas Lumley’s picked in 2003 when he introduced quasi-quotation into R (a different concept than string-interpolation, but the topic of our next section).

String interpolation is a common need, and there are many R packages that supply variations of such functionality:

Quasi-quotation

A related idea is "quasi-quotation" which substitutes a value into a general expression. For example:

angle = 1:10
variable <- as.name("angle")

evalb(
  
  plot(x = .(variable), 
       y = sin(.(variable)))
  
  )
Unnamed chunk 2 1

Notice how in the above plot the actual variable name "angle" was substituted into the graphics::plot() arguments, allowing this name to appear on the axis labels.

evalb() is is a very simple function built on top of base::bquote():

print(evalb)
## function(..., where = parent.frame()) {
##   force(where)
##   exprq <- bquote(..., where = where)
##   eval(exprq,
##        envir = where,
##        enclos = where)
## }
## <bytecode: 0x7fa0181b4470>
## <environment: namespace:wrapr>

All evalb() does is: call bquote() as intended. A way to teach this is to just call bqoute() alone.

bquote(
  
  plot(x = .(variable), 
       y = sin(.(variable)))
  
  )
## plot(x = angle, y = sin(angle))

And we see the un-executed code with the substitutions performed.

There are many R quasi-quotation systems including:

If you don’t want to wrap your plot() call in evalb() you can instead pre-adapt the function. Below we create a new function plotb() that is intended as shorthand for eval(bquote(plot(...))).

plotb <- bquote_function(graphics::plot)

plotb(x = .(variable), 
      y = sin(.(variable)))
Unnamed chunk 5 1

Conclusion

When string-inerpolation and quasi-quotation use the same notation we can teach them quickly as simple related concepts.

To leave a comment for the author, please follow the link and comment on their blog: R – Win-Vector Blog.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)