3. Дилемма зависимостей
Преимущества зависимостей Недостатки зависимостей
• Экономия времени на разработке, за счёт переиспользования
чужого кода
• Ваш код становится чувствителен к изменениям в сторонних
пакетах
• При установке вашего пакета, так же будут устанавливаться все
пакетыот которых он зависит, что увеличивает занимаемое им
место на жестком диске
5. Какие компонентыпакета отвечают за зависимости
• Файл DESCRIPTION, позволяет указать какие пакеты будут установлены или
рекомендованы к установке вместе с вашим пакетом
• Поле Imports: указанные пакеты будут установлены вместе с вашим пакетом
• Поле Suggest: указанные пакеты будут рекомендованы к установке
• Поле Depends: указанные пакеты будут установлены и экспортированы вместе с вашим пакетом
• Файл NAMESPACE, управляет экспортом объектов в рабочее окружение
6. Какие компонентыпакета отвечают за зависимости
• Пакеты указанные в поле Imports файла DESCRIPTION не обязательно должны быть
указаны в NAMESPACE
• Но все пакеты и функции перечисленные в файле NAMESPACE, так же обязательно должны
быть указаны в полях Imports или Depends файла DESCRIPTION
7. Файл NAMESPACE
• Директивы файла NAMESPACE
• export(): экспортировать функцию (включая дженерики S3 и S4).
• S3method(): экспортировать метод S3.
• importFrom(): импортировать выбранный объект из другого пространства имен (включая дженерики
S4).
• import(): импортировать все объекты из пространства имен другого пакета.
• useDynLib(): регистрирует процедуры из DLL ( для пакетов с скомпилированным кодом).
8. Рабочий процесс
• Используйте в ваших R файлах специальные roxygen комментарии
• Запустите devtools::document() для генерации NAMESPACE файла
• Либо используйте функцию usethis::use_import_from()
9. Когда стоит экспортировать объекты сторонних пакетов
• Оператор: Вы не можете вызвать оператора из другого пакета через ::, поэтому его
необходимо импортировать. Примеры: оператор объединения NULL %||% из rlang или
пайплайн %>% из magrittr.
• Функция, которую вы часто используете . Если импорт функции делает ваш код более
читабельным, это достаточная причина для ее импорта. Это буквально уменьшает
количество символов, необходимых для вызова внешней функции.
• Функция, которую вы вызываете в жестком цикле с ::. Поиск объекта вызванного через два
двоеточия составляет порядка 100 нс, поэтому оно будет иметь значение только в том
случае, если вы вызываете функцию миллионы раз.
10. Пакет указан в Imports
• В коде пакета, т.е. в папке R/ обращайтесь к функциям из указанных в поле Imports пакетов
package::function()
• В тестах обращайтесь к функциям из указанных в поле Imports пакетов package::function().
Но если вы импортировали определенную функцию отдельно или как часть всего
пространства имен, вы можете просто вызвать ее непосредственно в тестовом коде.
• Если вы используете пакет, который указанный в Imports в одном из ваших примеров или
виньеток, вам нужно будет либо прикрепить пакет с помощью, library(package) либо
использовать package::function().
11. Пакет указан в Suggests
• В коде пакета, т.е. в папке R/ вы должны проверить наличие установленного пакета с
помощью базовой функции requireNamespace(), или функций из пакета rlang: is_installed() и
check_installed().
• В тестах вы можете использовать функцию testthat::skip_if_not_installed() для пропуска
тестов, если у пользовтаеля не установлены необходимые для их выполнения пакетов.
• Для использования пакетов указанных в Suggest в виньетках или примерах функций
используйте функции require() или requireNamespace(), для проверки доступен ли
необходимый пакет.
12. Пакет указан в Depends
• В коде пакета, т.е. в папке R/ и в тестах обращайтесь к функциям из указанных в поле
Imports пакетов package::function().
• В виньетках и примерах не требуется отдельно подключать через library() пакеты
указанные в поле Depends.
13. Импорт и экспорт S3 методов
• Экспортируете основную дженерик функцию через директиву export()
• Регистрируете её методы написанные под обработку объектов различных классов с
помощью директивы S3method()