【问题标题】:How is J() function implemented in data.table?data.table 中的 J() 函数是如何实现的?
【发布时间】:2014-03-26 22:52:07
【问题描述】:

我最近了解了优雅的 R 包data.table。我很想知道J 函数是如何在那里实现的。该函数与函数[.data.table绑定,全局环境中不存在。

我下载了源代码,但在任何地方都找不到这个J 函数的定义。我找到了lockBind(".SD", ...),但没有找到J。知道这个功能是如何实现的吗?

非常感谢。

【问题讨论】:

标签: r data.table


【解决方案1】:

J() 以前是导出的,但从 1.8.8 开始就没有了。这是来自1.8.8的注释:

o J() 别名现已被删除DT[...] 外部,但仍可在DT[...] 内部工作;即,DT[J(...)] 很好。正如 v1.8.2 中的警告(请参阅此文件中的下文)并在 v1.8.4 中以 warning() 弃用。这解决了与 XLConnect (#1747) 和 rJava (#2045) 包中的函数 J() 的冲突。请在DT[...]之外直接使用data.table()而不是J()

使用 R 的 惰性评估J(.) 被检测到,并使用(不可见的)非导出函数 .massagei 简单地替换为 list(.)

也就是说,当你这样做时:

require(data.table)
DT = data.table(x=rep(1:5, each=2L), y=1:10, key="x")
DT[J(1L)]

检查i (= J(1L)) 的类型并执行此行:

i = eval(.massagei(isub), x, parent.frame())

isub = substitute(i).massagei 只是:

.massagei = function(x) {
    if (is.call(x) && as.character(x[[1L]]) %chin% c("J","."))
        x[[1L]] = quote(list)
    x
}

基本上,data.table:::.massagei(quote(J(1L))) 被执行,它返回 list(1L),然后转换为 data.table。从那里,很明显join 必须发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 2012-08-14
    • 2015-01-05
    • 2018-08-01
    • 2015-06-02
    相关资源
    最近更新 更多