在R中,如何检查两个变量是否引用同一个R6对象?

在R中,如何检查两个变量是否引用同一个R6对象?,r,r6,R,R6,函数似乎给出了正确的答案,但文档中没有明确讨论对象引用。文档中最接近的注释是: 检查两个大型复杂对象的相等性可能需要更长的时间 如果对象相同或接近相同,但表示完全相同 独立副本 使用idential()的一些示例: QuickClass c相同(a、c) [1] 假的 >d相同(a,d) [1] 假的 所以,相同的外观可以完成所需的工作,我只想检查是否有更好的方法,例如,一个特定的函数,它只是比较对象引用,因此可能更快、更直接地适用。idential()看起来可以进行逐字段比较 对比从句:这个

函数似乎给出了正确的答案,但文档中没有明确讨论对象引用。文档中最接近的注释是:

检查两个大型复杂对象的相等性可能需要更长的时间 如果对象相同或接近相同,但表示完全相同 独立副本

使用idential()的一些示例:

QuickClass c相同(a、c)
[1] 假的
>d相同(a,d)
[1] 假的
所以,相同的外观可以完成所需的工作,我只想检查是否有更好的方法,例如,一个特定的函数,它只是比较对象引用,因此可能更快、更直接地适用。idential()看起来可以进行逐字段比较


对比从句:这个问题类似于-但是这个问题很老(R6之前的课程),答案讨论使用我宁愿避免的低级技巧。

你可以为每个新对象分配一个随机的
id
,并比较
id
s

library(R6)

MyClass <- R6Class(
  "MyClass",
  public = list(
    id = NULL,
    initialize = function(){
      self$id <- as.character(sample(1:10^6, 1))
    }
  )
)

MyClass$equal <- function(object1, object2){
  object1$id == object2$id
}

A <- MyClass$new()
B <- MyClass$new()
MyClass$equal(A, A)
# TRUE
MyClass$equal(A, B)
# FALSE
库(R6)

MyClass谢谢,这是一种可能的方法,但是我想知道是否有内置的/R6函数可以进行更基本的比较(比如比较内存位置)。另外,当sample()为两个不同的实例返回相同的数字时,使用随机数可能会导致冲突。但是,如果身份证号码不断增加,使用属性的想法可能会奏效。我同意这种方法有一些缺点。通过使用计数器而不是RNG来保证唯一的ID是完全可能的
all.equal.environment
也是一种可能的选择,尽管它比较的是对象级别而不是参考级别上的实例(因此内存位置无关)
library(R6)

MyClass <- R6Class(
  "MyClass",
  public = list(
    id = NULL,
    initialize = function(){
      self$id <- as.character(sample(1:10^6, 1))
    }
  )
)

MyClass$equal <- function(object1, object2){
  object1$id == object2$id
}

A <- MyClass$new()
B <- MyClass$new()
MyClass$equal(A, A)
# TRUE
MyClass$equal(A, B)
# FALSE