Как использовать в своём пакете, не экспортируемые объекты из других пакетов
Данная заметка будет полезна разработчикам пакетов, которые планирую публикацию своих разработок на CRAN.
Что такое не экспортируемые объекты
Пакеты обычно включают в себя два типа функций:
● экспортируемые - те, которые становятся доступны пользователю после подключения пакета, или по обращению через двойное двоеточие (pkg::fun()).
● не экспортируемые - функции, которые не экспортируются даже после подключения пакета, к ним можно получить доступ через тройное двоеточие (pkg:::fun()).
Не экспортируемые объекты зачастую направлены на внутренние нужды пакета, и в 99% случаев доступ к ним не нужен конечным пользователям пакетов.
Пример такой функции
Любители dplyr наверняка знакомы с функцией where(). Она используется когда вам необходимо получить, например объекты одного типа.
where(is.numeric())
Я довольно часто использую dplyr в своих пакетах, и не редко использую функцию where(), но это не экспортируемая функция.
С какой ошибкой вы столкнётесь пытаясь использовать не экспортируемый объект
При прогоне пакета через авто тесты вы можете увидеть предупреждение:
dependencies in R code ... NOTE
Unexported object imported by a ':::' call: 'package:::function'
See the note in ?`:::` about the use of this operator.
Это как раз о том, что вы используете не экспортируемый объект, и политикой CRAN это не приветствуется.
Как добавить импорт не экспортируемого объекта в свой пакет
Есть несколько приёмов, на практике с описанной проблемой я встречался дважды, первый раз когда пытался экспортировать функцию where() из tidyselect, на GitHub разработчики tidyselect рекомендуют поместить следующую конструкцию внутрь функции .onLoad.
utils::globalVariables("where")
Также с похожей проблемой я столкнулся при экспорте is_response(), из пакета httr2, тут нашел немного другой вариант, вставить следующий вызов в любое место R кода вашего пакета.
is_response <- getFromNamespace("is_response", "httr2")
Также в обоих случаях вам необходимо добавить импорт пакета utils в файлы NAMESPACE и DESCRIPTION вашего пакета.
#заметки_по_R