Почему отношения наследования классов R5 не определены во время пакета R .onLoad()?

Я пытаюсь инициализировать и сохранить некоторую информацию о пакете при первой загрузке пакета и нашел много полезной информации о способах сделать это в Как сохранить определенную информацию о пакете в R и Как запустить код при загрузке пакета. Однако одна функция, которую я хочу вызвать во время загрузки пакета, проверяет отношения наследования нескольких классов, определенных в пакете, но возвращает результаты, отличные от ожидаемых. Я могу придумать разные способы обойти эту проблему, но я пытаюсь понять, что я делаю неправильно, и надеялся, что кто-нибудь сможет мне это объяснить.

Ниже приведен минимальный пример исходного кода пакета для воспроизведения проблемы.

# package reference classes
setClass("myclass", representation(value = "numeric"), 
                    prototype = prototype(value = 42))
setClass("myderivedclass", contains = "myclass")

# package on load function
.onLoad <- function(lib, pkg){  
    if (!extends("myderivedclass", "myclass")) {
        warning("something's not right")
    }
}

Теперь во время пакета .onLoad extends("myderivedclass", "myclass") оценивается как FALSE (вызывая предупреждение), но, конечно, после загрузки пакета он оценивается как TRUE, чего я и ожидал. Инициализация объектов любым классом во время .onLoad работает нормально, так что определения классов еще не загружены.

Большое спасибо за любую помощь в том, как я должен проводить такой тест во время .onLoad, или за то, что я мог неправильно понять здесь о наследовании.

Информация о сеансе:

> sessionInfo()
R version 3.1.0 (2014-04-10)
Platform: x86_64-apple-darwin10.8.0 (64-bit)

person sebkopf    schedule 26.04.2014    source источник
comment
Я думаю, что вы хотите использовать setLoadAction по причинам, изложенным на странице справки и в комментариях Джона Чемберса в эта тема   -  person Martin Morgan    schedule 26.04.2014
comment
Спасибо, использование setLoadAction действительно решает проблему! Я также поэкспериментировал еще и обнаружил, что использование .onAttach вместо .onLoad также работает. Знаете ли вы, каков рекомендуемый подход? (.onAttach против setLoadAction ?)   -  person sebkopf    schedule 26.04.2014
comment
Поскольку Чемберс (создатель языка S, S4 и системы эталонных классов) говорит использовать setLoadAction, я бы воспринял это как рекомендацию!   -  person Martin Morgan    schedule 26.04.2014
comment
хорошая мысль, хороший совет, еще раз спасибо   -  person sebkopf    schedule 26.04.2014


Ответы (1)


Для полноты картины вот как это работало с setLoadAction вместо .onLoad

setLoadActions(function(ns) {
    if (!extends("myderivedclass", "myclass")) {
        warning("something's not right")
    } else {
        message("everything all right")
    }
}) 

Таким образом, extends("myderivedclass", "myclass")правильно оценивается как TRUE во время загрузки пакета.

person sebkopf    schedule 26.04.2014