Как изменить объект S3, чтобы сделать его сопоставимым? - PullRequest
2 голосов
/ 26 августа 2011

Я использую 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 Ответ

3 голосов
/ 27 августа 2011

Немного интерактивного исследования с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...