Я пытаюсь инициализировать и сохранить некоторую информацию о пакете при первой загрузке пакета и нашел много полезной информации о способах сделать это в Как сохранить определенную информацию о пакете в 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)
setLoadAction
по причинам, изложенным на странице справки и в комментариях Джона Чемберса в эта тема - person Martin Morgan   schedule 26.04.2014setLoadAction
действительно решает проблему! Я также поэкспериментировал еще и обнаружил, что использование.onAttach
вместо.onLoad
также работает. Знаете ли вы, каков рекомендуемый подход? (.onAttach
противsetLoadAction
?) - person sebkopf   schedule 26.04.2014