Ответ 1
Наиболее вероятным кандидатом является то, что ваши функции содержат ненужные вызовы require(<pkg>)
или library(<pkg>)
. Сообщение об ошибке немного вводит в заблуждение - оно говорит вам, что вы разместили вызовы require
или library
в своем коде, но на самом деле (правильно) не объявили эти вызовы в вашем файле DESCRIPTION
.
Если вы намерены использовать код из этих пакетов в своем собственном пакете, вам не нужны эти вызовы library
/require
; скорее, вам нужно правильно объявить, что вы используете эти пакеты (и как вы их используете) в вашем файле DESCRIPTION
.
Скорее всего, вы хотите "импортировать" пакет и сделать некоторые или все его экспортированные функции/символы доступными для вашего пакета. Вы можете добавить такие пакеты в поле Imports:
в файле DESCRIPTION
- например,
Imports: <pkg>
и аналогичным образом объявите, что вы хотите использовать все экспортированные символы из этого пакета, записав в файле NAMESPACE
import(<pkg>)
Таким образом, все функции в пространстве имен <pkg>
автоматически становятся доступными, и поэтому нет необходимости в require
, что пакет в любом месте вашего кода.
В контексте пакета основное использование require
- это функции, которые вы хотели бы сделать доступными только условно. Например, предположим, что вы пишете функцию, которая обрабатывает очень специфичный метод построения, который требует foo
, но foo
в противном случае не нужен в вашем пакете. Итак, если вы хотите включить код, который условно зависит от пакета foo
, вы можете написать что-то из формы:
if (require("foo")) {
#do stuff
}
а затем вы можете включить foo
в DESCRIPTION
в разделе Suggests:
, а не Imports:
. Другим примером является пакет, используемый при создании виньетки, но никогда не требуется для пользователей вашего пакета.
В сумме: если вы импортируете пакет только для использования функций, экспортируемых в это пространство имен пакетов, вам не нужно library
или require
в любом месте вашего кода пакета.
EDIT: в новых версиях R, R CMD check
может предупредить, если вы используете require
, а вместо этого предложите использовать requireNamespace
. В этом случае вы можете следовать шаблону:
## Use the 'bar' function from package 'foo'
if (requireNamespace("foo", quietly = TRUE)) {
foo::bar()
}