How is J() function implemented in data.table?

后端 未结 1 526
慢半拍i
慢半拍i 2020-12-06 06:06

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

相关标签:
1条回答
  • 2020-12-06 06:53

    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 outside DT[...], but will still work inside DT[...]; i.e., DT[J(...)] is fine. As warned in v1.8.2 (see below in this file) and deprecated with warning() in v1.8.4. This resolves the conflict with function J() in package XLConnect (#1747) and rJava (#2045). Please use data.table() directly instead of J(), outside DT[...].

    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.

    0 讨论(0)
提交回复
热议问题