2

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

如果对象相同或几乎相同,则检查两个大而复杂的对象的相等性可能需要更长的时间,但代表完全独立的副本。

使用相同()的一些例子:

QuickClass <- R6::R6Class("QuickClass",
  public = list(
   initialize = function(x) {
     private$px <- x
   }
   ),
   active = list(
     x = function(px) {
       if(missing(px)) return(private$px)
       else private$px <- px 
     }
   ),
   private = list(
     px = 0 
   )
)

> a <- QuickClass$new(1)
> identical(a, a)
[1] TRUE
> b <- a
> identical(a, b)
[1] TRUE
> c <- QuickClass$new(2)
> identical(a, c)
[1] FALSE
> d <- QuickClass$new(1)
> identical(a, d)
[1] FALSE

因此,相同的外观可以满足需要,我只想检查是否有更好的方法,例如仅比较对象引用的特定函数,因此可能更快,更直接适用。same() 看起来可以进行逐个字段的比较。

对比子句:这个问题类似于在 R 中,如何检查两个变量名是否引用同一个底层对象?- 但是这个问题已经很老了(R6 之前的课程),答案讨论了使用我宁愿避免的低级技术。

4

1 回答 1

1

id您可以为每个新对象分配一个随机数并比较ids.

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
于 2017-06-20T02:57:05.153 回答