Подтвердить что ты не робот

Как я могу запретить "r" библиотеку или "требовать" вызовы не объявленные "предупреждения при разработке пакета?

Я разрабатываю пакет, который зависит от пакета foo, а в моем коде пакета есть вызов функции, экспортированной из foo. Я включил имя пакета в NAMESPACE с объявлением import(foo), а также в строке Imports: в файле DESCRIPTION. Однако при запуске R CMD check:

появляется следующее предупреждение:
r 'library' or 'require' calls not declared from: 'foo'

Что мне не хватает?

В есть аналогичный вопроs > Загрузка зависимых пакетов с использованием .onLoad, но, похоже, не обсуждается это конкретное предупреждение.

4b9b3361

Ответ 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()
}

Ответ 2

FYI, это плохая форма для импорта всех функций пакета (если вы их не используете):

@import package 

Лучше всего просто

package::thisOne()

Если вам это нужно, или

@importFrom package thisOne

Если вы повторно используете определенную функцию