测试两个`data.table`是不是指向相同的内存位置[重复]

Posted

技术标签:

【中文标题】测试两个`data.table`是不是指向相同的内存位置[重复]【英文标题】:Test if two `data.table`s point to the same memory location [duplicate]测试两个`data.table`是否指向相同的内存位置[重复] 【发布时间】:2014-06-28 09:29:56 【问题描述】:

让我们来:

DT1 <- data.table(iris)
DT2 <- DT1 # both reference the same memory location though
DT3 <- copy(DT1)

问题:有没有办法检查DT2 是否一直引用与DT1 相同的内存位置?

类似这样的伪函数:

mem.identical(DT2, DT1) # should return TRUE
mem.identical(DT3, DT1) # should return FALSE

很遗憾,identicalall.equal 不适用于此目的,因为

identical(DT1,DT3) # gives TRUE

只有引入一些变化后,才能使用identical检测差异:

DT1[,Test:=1] # introduces change to DT1 directly, to DT2 indirectly
identical(DT1,DT2) # TRUE - proves that DT2 is linked with DT1
identical(DT1,DT3) # FALSE - DT1 and DT3 are clearly decoupled

【问题讨论】:

这是一个不同的问题,有重复的答案:***.com/a/10913296/403310(我之所以发现它是因为它在 address 的文档中链接) @BenBolker 实际上增加的价值是@GSee 的data.table::address 解决方案,我在其他地方没有找到 【参考方案1】:

您可以为此使用data.table::address

> address(DT1)
[1] "0x10336c230"
> address(DT2)
[1] "0x10336c230"
> address(DT3)
[1] "0x10336cb50"

【讨论】:

(+1),但您可能应该提到这是data.table 库函数.. @DavidArenburg 我认为没有必要,因为问题在标题中包含data.table,它被标记为[data.table],并且创建示例数据的第一行代码是@ 987654326@。 ;-) Hadley 在他的 pryr 包 (github.com/hadley/pryr/blob/master/R/inspect.r) 中还有一个 address 函数,用于相同目的,但由于 data.table 已经加载,因此没有理由加载另一个包。【参考方案2】:

好的,我找到了答案on SO here,使用tracemem

DT1 <- data.table(iris)
DT2 <- DT1
DT3 <- copy(DT1)

identical(tracemem(DT1),tracemem(DT2)) # TRUE
identical(tracemem(DT1),tracemem(DT3)) # FALSE

【讨论】:

请记住,调用tracemem后需要调用untracemem,否则每次DT1、DT2或DT3变化时都会收到消息... 既然你在 SO 上找到了答案,你应该投票关闭(如果你有足够的代表)评论(如果你没有),而不是仅仅复制回答? (我承认我没有看你的答案是否比原来的答案有任何增值......) 好的,下次会做相应的,而不是复制答案,不确定正确的 SO 礼仪。谢谢@BenBolker

以上是关于测试两个`data.table`是不是指向相同的内存位置[重复]的主要内容,如果未能解决你的问题,请参考以下文章

data.table 具有两个字符串列的集合元素,提取唯一的行,每行未排序

java面试题整理

两个 data.table 数据集之间的快速映射

对于多态类的对象,对象的地址和指向对象的指针是不是相同?

Java---Java的面试题

是否可以使用R data.table函数foverlaps来查找两个表中重叠范围的交集?