"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
и попросить их сделать более осторожную работу по созданию своего пространства имен (по словам Мартина Моргана в этом связанном ответе ).