【发布时间】:2015-04-02 17:49:09
【问题描述】:
我在 R 中使用 data.table 包。除其他外,data.table 会导致表通过引用传递。 Data.table 还支持通过引用插入或删除列,所以你可以做这样的事情......
library('data.table')
AddSquares<-function(DT){
DT[,x2:=(x*x)]
}
DT<-data.table(x=1:3)
AddSquares(DT)
DT
x x2
1: 1 1
2: 2 4
3: 3 9
x2 是在 DT byRef 中创建的,因此我不必返回修改后的表。容易小便。不幸的是,data.table 不支持插入或删除 rows byRef,所以会发生以下情况......
StripEvens<-function(DT){
DT <- DT[x %% 2 != 0]
}
StripEvens(DT)
DT
x x2
1: 1 1
2: 2 4
3: 3 9
<- 运算符按值工作,因此它在函数内创建 DT 的副本。如果我不从该函数返回 DT,那么当函数调用结束时它会被“销毁”。如果我确实返回 DT,那么我可以取回一个看起来像我想要的方式的表格,但我已经通过制作一个副本来做到这一点,这也可能是传递 byVal。
所以问题来了。一旦 DT 被传递到我的函数 byRef 中,我如何让 R 继续在 DT byRef 上工作?等效地,如何使 R 将函数内部的 DT 视为对函数外部 DT 引用的同一对象的引用?这甚至可能吗?
【问题讨论】:
标签: r memory data.table pass-by-reference