I recently learned about the elegant R package data.table. I am very curious to know how the J function is implemented there. This function is boun
J() used to be exported before, but not since 1.8.8. Here's the note from 1.8.8:
o The
J()alias is now removed outsideDT[...], but will still work insideDT[...]; i.e.,DT[J(...)]is fine. As warned in v1.8.2 (see below in this file) and deprecated withwarning()in v1.8.4. This resolves the conflict with functionJ()in packageXLConnect(#1747) andrJava(#2045). Please usedata.table()directly instead ofJ(), outsideDT[...].
Using R's lazy evaluation, J(.) is detected and simply replaced with list(.) using the (invisible) non-exported function .massagei.
That is, when you do:
require(data.table)
DT = data.table(x=rep(1:5, each=2L), y=1:10, key="x")
DT[J(1L)]
i (= J(1L)) is checked for its type and this line gets executed:
i = eval(.massagei(isub), x, parent.frame())
where isub = substitute(i) and .massagei is simply:
.massagei = function(x) {
if (is.call(x) && as.character(x[[1L]]) %chin% c("J","."))
x[[1L]] = quote(list)
x
}
Basically, data.table:::.massagei(quote(J(1L))) gets executed which returns list(1L), which is then converted to data.table. And from there, it's clear that a join has to happen.