R Сравнение двух объектов SummarizedExperiment

Мой модульный тест не проходит при сравнении эталонного и ожидаемого SummarizedExperiment объекты. Сообщение об ошибке:

> expect_identical(target, current)
Error: `target` not identical to `current`.
Attributes: < Component “assays”: Class definitions are not identical >

MWE:

ССЫЛКА НА ДАННЫЕ

Код:

load("se-comparison.Rdata")
library(SummarizedExperiment)
library(testthat)

expect_identical(target, current)
# expect_identical() uses attr.all.equal() to compare S4 objects so check this
attr.all.equal(target, current)
# ok, check the attributes
cur <- attributes(current)
tar <- attributes(target)

class(cur$assays)
class(tar$assays)

expect_identical(
  cur$assays,
  tar$assays
)

expect_identical(
  class(cur$assays),
  class(tar$assays)
)

Выход:

> library(SummarizedExperiment)
> library(testthat)
> expect_identical(target, current)
Error: `target` not identical to `current`.
Attributes: < Component “assays”: Class definitions are not identical >
> # expect_identical() uses attr.all.equal() to compare S4 objects so check this
> attr.all.equal(target, current)
[1] "Attributes: < Component “assays”: Class definitions are not identical >"
> # ok, check the attributes
> cur <- attributes(current)
> tar <- attributes(target)
> class(cur$assays)
[1] "ShallowSimpleListAssays"
attr(,"package")
[1] "SummarizedExperiment"
> class(tar$assays)
[1] "ShallowSimpleListAssays"
attr(,"package")
[1] "SummarizedExperiment"
> cur$assays
Reference class object of class "ShallowSimpleListAssays"
Field "data":
List of length 1
names(1): counts
> tar$assays
Reference class object of class "ShallowSimpleListAssays"
Field "data":
List of length 1
names(1): counts
> expect_identical(
+   cur$assays,
+   tar$assays
+ )
Error: cur$assays not identical to tar$assays.
Class definitions are not identical
> expect_identical(
+   class(cur$assays),
+   class(tar$assays)
+ )
>

Есть идеи, почему сравнение не удается?

1 ответ

Не уверен, почему это не удается в целом, но attr.all.equal сравнивает определения классов, возвращаемые getClass метод (если есть). В этом случае, getClass для каждого $assays объект возвращает определение класса, которое отличается fieldPrototypes а также refMethods (строки окружения отличаются). Это вызывает identical терпеть неудачу.

Для сравнения:

str(class(cur$assays))
str(cur$assays$getClass())

Обходным путем будет пропустить проверку атрибутов: expect_equal(target, current, check.attributes = FALSE),

В качестве примечания, это также хорошо работает (обратите внимание, что я использую здесь метод получения для класса SummarizedExperiment вместо $assays):

expect_equal(
  assays(current),
  assays(target)
)
Другие вопросы по тегам