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)
)