Обложка канала

R4marketing | канал Алексея Селезнёва | Язык R

Автор канала Алексей Селезнёв, руководитель отдела аналитики в Netpeak, автор R пакетов: ryandexdirect, rfacebookstat и др. В канале публикуются статьи, доклады, новости, заметки по языку R.

R4marketing | канал Алексея Селезнёва | Язык R

4 года назад
Открыть в
​​Как использовать в своём пакете, не экспортируемые объекты из других пакетов Данная заметка будет полезна разработчикам пакетов, которые планирую публикацию своих разработок на 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