В руководстве « Writing R Extensions » содержатся следующие рекомендации о том, когда использовать импорт или зависимость:
Общие правила
- Пакеты, чье пространство имен требуется только для загрузки пакета с использованием библиотеки (pkgname), должны быть указаны в поле «Импорт», а не в поле «Зависит».
- Пакеты, которые необходимо подключить для успешной загрузки пакета с использованием библиотеки (pkgname), должны быть указаны только в поле «Зависит».
Может кто-нибудь дать немного больше ясности по этому поводу? Как я могу узнать, когда мой пакет нуждается только в загруженных пространствах имен по сравнению с тем, когда мне нужно присоединить пакет? Каковы примеры обоих? Я думаю, что типичный пакет - это просто набор функций, которые иногда вызывают функции в других пакетах (где некоторая часть работы уже была закодирована). Этот сценарий 1 или 2 выше?
редактировать
Я написал сообщение в блоге с разделом по этой конкретной теме (поиск «Imports v Depends»). Визуальные эффекты облегчают понимание.
Ответы:
"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
и попросить их сделать более осторожную работу по созданию своего пространства имен (по словам Мартина Моргана в этом связанном ответе ).источник
Imports
иDepends
требованиями версии WRT и проверкой примеров в.Rd
файлах действительно тонкие и стоит знать.Imports: ggplot2
, почему мой пакет не находитautoplot
функцию? Очевидно,Depends
прикрепляет библиотеку пакетовggplot2
и поэтому нет проблем. Например, у меня есть функция,autoplot.myFunction()
которая использует@import ggplot2
тег, и мой пакет имеет,Imports: ggplot2
но я получаю сообщение об ошибке:Error in eval(expr, envir, enclos) : could not find function "autoplot"
когда я пытаюсь использовать его.Depends
и , он действительно спрашивал о том, что означает «импорт» функции (а не «зависимость» от нее). Поскольку на этот последний вопрос я пытался ответить (и - я подозреваю, что большинство людей, ищущих этот ответ, хотят знать), я оставлю ответ без изменений.Imports
DESCRIPTION
Хэдли Уикхем дает простое объяснение ( http://r-pkgs.had.co.nz/namespace.html ):
источник
Камеры в SfDA говорят, что следует использовать «Imports», когда этот пакет использует механизм «пространства имен», и поскольку теперь все пакеты должны иметь их, тогда ответом может быть всегда использование «Imports». В прошлом пакеты можно было загружать, не имея фактически пространства имен, и в этом случае вам нужно было бы использовать Зависит.
источник
<namespace:packageName>
, как часть<imports:packageName>
. Дальнейшего вызоваlibrary()
не требуется, и R не уведомит вас на консоли во время загрузки пакета, еслиImport
пакет ed не найден.Вот простой вопрос, который поможет вам решить, какой из них использовать:
Требует ли ваш пакет, чтобы конечный пользователь имел прямой доступ к функциям другого пакета?
Единственный раз, когда вы должны использовать «Зависит», это когда ваш пакет является дополнением или компаньоном к другому пакету, когда ваш конечный пользователь будет использовать функции из вашего пакета и пакета «Зависит» в своем коде. Если ваш конечный пользователь будет взаимодействовать только с вашими функциями, а другой пакет будет выполнять только скрытую работу, используйте вместо этого «Импорт».
Предостережение в том, что если вы добавляете пакет в 'Imports', как обычно, ваш код должен будет ссылаться на функции из этого пакета, используя полный синтаксис пространства имен, например
dplyr::mutate()
, вместо justmutate()
. Это делает код немного неудобнее для чтения, но это небольшая цена за лучшую гигиену упаковки.источник