"Imports"безопаснее, чем "Depends"(а также делает пакет, использующий его, «лучшим гражданином» по сравнению с другими пакетами, которые его используют "Depends").
А "Depends"директива попытка гарантировать , что функция из другого пакета можно, прикрепив другой пакет к основному пути поиска (то есть список сред , возвращенных search()). Эта стратегия, однако, может быть сорвана, если другой пакет, загруженный позже, поместит функцию с одинаковым именем ранее в путь поиска. Камеры ( в соде ) использует пример функции "gam", которая находится в обоих gamи mgcvпакетах. Если были загружены два других пакета, один из которых зависит, gamа другой mgcv- от функции, найденной вызовами, gam()будет зависеть от порядка, в котором они были присоединены эти два пакета. Не хорошо.
"Imports"Директива должна быть использована для любого поддерживающего пакета, функции которого должны быть помещены в <imports:packageName>(поиск сразу после <namespace:packageName>), а не на регулярной пути поиска. Если какой-либо из пакетов в приведенном выше примере использует "Imports"механизм (который также требует importили importFromдирективы в NAMESPACEфайле), ситуация может быть улучшена двумя способами. (1) Пакет сам получит контроль над тем, какая mgcvфункция используется. (2) Если очистить основной путь поиска от импортированных объектов, это даже не нарушит зависимость другого пакета от другой mgcvфункции.
Вот почему использование пространств имен является такой хорошей практикой, почему теперь оно обеспечивается CRAN, и (в частности) почему использование "Imports"безопаснее, чем использование "Depends".
Отредактировано, чтобы добавить важное предупреждение:
К сожалению, из приведенного выше совета есть одно общее исключение: если ваш пакет основан на пакете, Aкоторый сам находится "Depends"в другом пакете B, ваш пакет, вероятно, необходимо будет прикрепить Aс помощью "Dependsдирективы.
Это потому, что функции в пакете Aбыли написаны с ожиданием, что пакет Bи его функции будут присоединены к search()пути .
"Depends"Директива будет загружать и приложить пакет A, в котором точки пакета A«s собственная "Depends"будет, в цепной реакции, потому что пакет директива Bдолжна быть загружен и прилагается также. Функции в пакете Aсмогут найти функции в пакете, Bна которые они полагаются.
"Imports"Директива будет загружаться , но не приложить пакет Aи будет ни груз , ни присоединять пакет B. (в "Imports"конце концов, ожидается, что разработчики пакетов используют механизм пространства имен, и этот пакет Aбудет использовать "Imports"для указания на любые функции, к Bкоторым ему необходим доступ.) Вызовы вашими функциями для любых функций в пакете, Aкоторые полагаются на функции в пакете B, следовательно потерпеть неудачу.
Единственные два решения:
- Сделайте, чтобы ваш пакет приложил пакет,
Aиспользуя "Depends"директиву
- Лучше, в конце концов, связаться с сопровождающим пакета
Aи попросить их сделать более осторожную работу по созданию своего пространства имен (по словам Мартина Моргана в этом связанном ответе ).