The Most Unexpected Discovery of An R Language Feature

… in a most unusual way

Yihui Xie 2017-12-16

Two months ago while I was trying to upgrade the highlight.js library in the rmarkdown package (PR #1178), I read the source code of the R syntax highlighter in our fork of highlight.js (created by Joe Cheng, our CTO), and these lines caught my attention:

{
  // ..1, ..2, etc.
  className: 'keyword',
  begin: "\\.\\.\\d+(?![\\w.])",
  end: hljs.IMMEDIATE_RE,
  relevance: 10
}

I didn’t know what “..1, ..2, etc” meant when I first saw it, and wondered why they were keywords. Later I wanted to check what the reserved keywords were in R, so I took a look at the help page ?reserved, and noticed this sentence:

... and ..1, ..2 etc, which are used to refer to arguments passed down from a calling function.

I never knew that. Basically ..N is like $N in shell scripts (and ... is like $@), and we can refer to the N-th argument in the ... argument, e.g.,

f = function(...) {
  list(..1, ..2, ..3)
}
f(9, 1, 2, 1, 4)

As I wrote last week, I never finished reading any R tutorials, books, or manuals when I learned R, so I missed this ..N syntax in the “Introduction to R” manual, and eventually discovered it in a most unusual way (in a JavaScript syntax highlighter).

Again, I don’t know base R. It still constantly surprises me after 13 years.