【问题标题】:In R, how can I check if two variables reference the same R6 object?在 R 中,如何检查两个变量是否引用同一个 R6 对象?
【发布时间】:2017-04-14 07:23:38
【问题描述】:

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

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

使用 distinct() 的一些例子:

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() 看起来可以进行逐个字段的比较。

对比条款:这个问题类似于In R, how can I check if two variable names reference the same underlying object? - 但是这个问题已经很老了(R6 之前的课程),并且答案讨论了使用我宁愿避免的低级技术。

【问题讨论】:

    标签: r r6


    【解决方案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
    

    【讨论】:

    • 谢谢,这是一种可能的方法,但是我想知道是否有内置/R6 函数可以进行更基本的比较(例如比较内存位置)。另外,当 sample() 为两个不同的实例返回相同的数字时,我认为使用随机数可能会导致冲突。但是使用属性的想法可能会起作用,例如如果身份证号码不断增加。
    • 我同意这种方法有一些缺点。通过使用计数器而不是 RNG 来保证唯一的 id 是完全可能的。 all.equal.environment 也是一个可能的选择,尽管它在对象级别而不是参考级别上比较实例(因此内存位置无关紧要)
    猜你喜欢
    • 1970-01-01
    • 2021-02-26
    • 2011-11-11
    • 1970-01-01
    • 2017-01-20
    • 2012-06-30
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多