如何重塑S3对象以使其具有可比性?

时间:2011-08-26 19:55:44

标签: unit-testing r

我使用test_that进行单元测试,我正在尝试比较两个对象。在某些情况下,无论内容如何,​​似乎两个对象永远不会相同(expect_identical),但如果它们属于同一类,则可以相等(expect_equal)。我确定它与类的构造方式有关(我正在使用R.oo)

那么......是否有可能重塑/压平/重构一个对象(可能是一个列表?),以便提取原始数据,从而使两个对象具有可比性?我意识到这可能是一项不可能完成的任务。我对R中的环境知之甚少。

修改
这是一个例子:

library(R.oo)
library(testthat)

setConstructorS3( "MyClass" , function( )
{
    extend( Object() , "MyClass" ,
            .param1 = rnorm(10)
          )
} )

test1 = MyClass()
test2 = MyClass()
expect_identical(test1, test2) # error: Objects equal but not identical
expect_equal( test1, test2) # no error reported

1 个答案:

答案 0 :(得分:3)

str的一些互动探索引导我:

as.list.Object <- function(x, ...) {
  vars <- as.list(attr(x, ".env"), all = TRUE)

  vars[substr(names(vars), 1, 3) != "..."]  
}

all.equal.Object <- function(target, current, ...) {
  all.equal(as.list(target), as.list(current), ...)
}

expect_equal(test1, test2)
# Error: test1 not equal to test2
# Component 1: Mean relative difference: 1.056427