"Imports"
є безпечнішим, ніж "Depends"
(а також робить пакет, використовуючи його "кращим громадянином" стосовно інших пакетів, які використовують"Depends"
).
А "Depends"
директива спроба гарантувати , що функція з іншого пакета можна, прикріпивши інший пакет до основного шляху пошуку (тобто список середовищ , повернутих search()
). Ця стратегія, однак, може бути зірвана, якщо інший пакет, завантажений пізніше, розміщує ідентично названу функцію раніше на шляху пошуку. Чемберс ( в SoDA ) використовує приклад функції "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
і попросіть їх зробити більш ретельну роботу зі створення свого простору імен (словами Мартіна Моргана у цій відповіді ).