загрузить/удалить пользовательский блок при загрузке/выгрузке пакета: передовая практика?

В пакете, который я разрабатываю, мне нужно определить новый блок: уровень полета (FL), эквивалентный 100 футам.

Пакет units обеспечивает следующие возможности:

units::install_conversion_constant("FL", "ft", 100)

Чтобы сделать тестовый пакет (devtools::test()) и проверка пакета (devtools::test()), оба работают для моих модульных тестов с использованием этого пользовательского элемента, я обнаружил, что мне нужно зарегистрировать его в загрузке пакета фаза.

Вот что я сделал:

В zzz.R (новые файлы, как на "Когда вам нужно побочные эффекты" раздела):

# register flight levels (FL) as a unit when loading this package
.onLoad <- function(libname, pkgname) {
  # install user-define unit for flight level
  units::install_conversion_constant("FL", "ft", 100)

  invisible()
}

# register flight levels (FL) as a unit when loading this package
.onUnload <- function(libname, pkgname) {
  # uninstall user-define unit for flight level
  units::remove_symbolic_unit("FL")

  invisible()
}

Если это не devtools::test() и установка кода регистрации устройства в каком R/unit-conversion.R файле R/unit-conversion.R делает devtools::test() успешным, но devtools::check() не работает.

Является ли решение выше правильного подхода для регистрации (и удалить [если это тоже будет сделано?]) Новый блок в пакете?

Ответ 1

Это почти идеальное место для вашего пакета. Я говорю почти потому, что есть исключение из каждого правила. Прочтите раздел ниже для получения более подробной информации и рекомендации по передовой практике из руководства по эксплуатации R

https://stat.ethz.ch/R-manual/R-devel/library/base/html/ns-hooks.html

Хорошая практика Загрузка пространства имен должна, по возможности, быть тихой, с сообщениями запуска, предоставленными.onAttach. Эти сообщения (и любые существенные из.onLoad) должны использовать packageStartupMessage, чтобы их можно было отключить, где они были бы отвлекающими.

Не должно быть вызовов в библиотеку и не требуется в этих перехватах. Способ загрузки пакета другими пакетами осуществляется через поле Depends в файле DESCRIPTION: это гарантирует, что зависимость документирована, а пакеты загружены в правильном порядке. Загрузка пространства имен не должна изменять путь поиска, поэтому вместо привязки пакета зависимость пространства имен от другого пакета должна быть достигнута путем (выборочно) импорта из другого пространства имен пакетов.

Использование библиотеки с аргументом помогает отображать основную информацию о пакете, должно использовать формат для объекта информации об вычислительном пакете и передавать его в пакетStartupMessage.

Не должно быть никаких вызовов установленным.пакетам в код запуска: он потенциально очень медленный и может не работать в версиях R до 2.14.2, если установка пакета происходит параллельно. См. Справочную страницу для альтернатив.

Скомпилированный код должен быть загружен (например, через library.dynam) в.onLoad или директивой useDynLib в файле NAMESPACE, а не в.onAttach. Аналогично, скомпилированный код не следует выгружать (например, через library.dynam.unload) в.Last.lib или.onDetach, только в.onUnload.