我最近了解了优雅的 R 包 data.table
.我很想知道J
功能在那里实现。此函数绑定(bind)到函数 [.data.table
,它在全局环境中不存在。
我下载了源代码,但找不到此 J
的定义在那里的任何地方发挥作用。我找到了lockBind(".SD", ...)
,但不是 J
.知道这个功能是如何实现的吗?
非常感谢。
最佳答案
J()
以前是导出的,但从 1.8.8 开始就没有了。这是来自 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[...]
.
使用 R 的惰性求值,
J(.)
被检测到并简单地替换为 list(.)
使用(不可见的)非导出函数 .massagei
.也就是说,当你这样做时:
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
必须发生。
关于r - data.table 中的 J() 函数是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22001945/