gpt4 book ai didi

r - data.table 中的 J() 函数是如何实现的?

转载 作者:行者123 更新时间:2023-12-04 00:56:15 26 4
gpt4 key购买 nike

我最近了解了优雅的 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 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[...].



使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com