R Лучшая практика S4: слот с вектором объектов S4

Как правильно сделать следующее:

У меня есть класс SpectraSet со слотами parentSpectrum, childSpectra, name (для простоты)

имя символа()

parentSpectrum должен содержать один объект класса ParentSpec (поэтому он имеет тип ParentSpec)

childSpectra должен содержать n объектов класса ChildSpec. Однако я не могу сделать его типа ChildSpec, потому что векторы могут содержать только атомарные типы. Какова наилучшая практика в этом случае? Я могу сделать это list() и ввести проверку в проверке достоверности, но есть ли что-нибудь лучше?


person meow    schedule 07.11.2014    source источник


Ответы (1)


Вот связанные ответы, которые я предоставил в прошлом.

Обычно лучше переосмыслить дизайн класса, чтобы ChildSpec по своей сути был вектором - как минимум, поддерживает length() и подмножество [, [[. Ваша проблема, описанная выше, исчезает, дизайн согласуется с векторизованной ориентацией R, и, вероятно, общие операции эффективны.

Альтернативой внедрению вашего собственного списка с проверкой типов (что на самом деле является другой альтернативой) является повторное использование инфраструктуры из Biocdonductor класс S4Vectors

.X = setClass("X", representation(x="numeric"))
.XList = setClass("XList", contains="SimpleList",
    prototype=prototype(elementType="X"))

И в действии

> xl = .XList(listData=list(.X(x=1), .X(x=2)))
> xl
XList of length 2
> xl[[2]]
An object of class "X"
Slot "x":
[1] 2
person Martin Morgan    schedule 07.11.2014
comment
Хм, не уверен, что такой подход (думая о ChildSpectra вместо ChildSpectrum) возможен в моем случае, поскольку я получаю ChildSpec от существующего класса Spectrum в другом пакете (MSnbase Spectrum2). Кроме того, каждый спектр уже является объектом нескольких векторов n-длины (которые можно экспортировать как кадр данных) плюс дополнительные свойства 1-длины. Я все еще должен обернуть голову вокруг этого. - person meow; 10.11.2014