Подтвердить что ты не робот

Загрузите пакет только в случае необходимости в пакете R

У меня есть пакет, который содержит целую кучу разных функций (см. Что делать с несовершенными, но полезными функциями?). Поскольку функции не имеют особого отношения, они зависят от целой группы других пакетов. Часто во всем пакете будет только одна функция, которая использует другой пакет. Тем не менее, если я использую импорт, предложение или зависит от файла DESCRIPTION, весь список пакетов будет загружаться каждый раз, когда будет загружен мой пакет, даже если очень немногие из них нужны любому пользователю.

Можно ли просто загружать зависимости только тогда, когда используется определенная функция? Я мог бы позвонить в library() внутри самой функции, но это кажется плохой практикой, поскольку она не сообщает системе управления пакетами ничего, и поэтому пользователь может ее не устанавливать.

4b9b3361

Ответ 1

Вы можете использовать предложения, а в функции, которая нуждается в пакете, вы можете добавить код в require() указанный пакет, а если он недоступен, выведите ошибку. Пример, который я знаком с веганским пакетом, имеет в своем ОПИСАНИИ

Depends: permute
Suggests: MASS, mgcv, lattice, cluster, scatterplot3d, rgl, tcltk

и при загрузке пакета мы имеем:

R> require(vegan)
Loading required package: vegan
Loading required package: permute
This is vegan 1.90-0

и sessionInfo() сообщают, что ни один из предлагаемых пакетов еще не загружен/не прикреплен и т.д.:

R> sessionInfo()
R version 2.13.1 Patched (2011-07-29 r56550)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_GB.utf8       LC_NUMERIC=C             
 [3] LC_TIME=en_GB.utf8        LC_COLLATE=en_GB.utf8    
 [5] LC_MONETARY=C             LC_MESSAGES=en_GB.utf8   
 [7] LC_PAPER=en_GB.utf8       LC_NAME=C                
 [9] LC_ADDRESS=C              LC_TELEPHONE=C           
[11] LC_MEASUREMENT=en_GB.utf8 LC_IDENTIFICATION=C      

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] vegan_1.90-0  permute_0.5-0

loaded via a namespace (and not attached):
[1] tools_2.13.1

Ответ 2

В общем, я стараюсь избегать использования require() в пакетах. В качестве предложения, работа с пространством имен (что не сложно) и использование Imports: упомянутые там пакеты не загружены. Вы можете импортировать только одну функцию из другого пакета:

  • с использованием объявления importFrom в файле пространства имен. importFrom(foo, x, y) сообщает, что функции x и y из пакета foo должны быть импортированы.
  • используя оператор двойного двоеточия в вашем коде: foo::bar импортирует функцию bar из пакета foo. например. plyr::ddply(...) получит доступ к функции ddply без загрузки пакета
  • или оператор тройного двоеточия в случае объектов, которые не экспортируются (foo:::bar)

Во всех трех случаях пакеты следует указывать в Импортировании. См. Также соответствующую главу 1.6 и другие в Написание расширений V.

EDIT: Как отметил @Gavin, все это работает только при импорте из пакета с собственным пространством имен. Из следующей версии R на (2.14?) Все пакеты должны иметь пространство имен.