Я хотел бы использовать оператор канала, %>%
представленный в magrittr
пакете, в пакете, который я написал сам, для цепочки dplyr
преобразований данных. magrittr
отображается как Import
в DESCRIPTION
файле. После загрузки моего собственного пакета и тестирования функции, использующей оператор канала, я получаю следующее сообщение об ошибке:
Ошибка в имени функции (параметр,: не удалось найти функцию "%>%"
Изменение %>%
на magrittr::%>%
в исходном коде функции также не помогает, потому что пакет больше не может быть собран.
r
namespaces
magrittr
Александр Кет
источник
источник
Ответы:
Он должен был работать правильно, если бы вы
magrittr
указали вDepends
. Однако это не рекомендуется . Вместо этого, вы оставляетеmagrittr
вImports
и добавьте следующую строкуNAMESPACE
:Я предлагаю читать расширения Написание R . Ваш вопрос освещен в пунктах 1.1.3 и 1.5.1.
источник
roxygen2
, вы можете добавить,#' importFrom magrittr "%>%"
чтобы NAMESPACE заполнялась автоматически во времяroxygenize()
.#' @importFrom magrittr "%>%"
%>%
внутри вашего пакета. Если ваш API требует, чтобы пользователи связали функции с помощью%>%
, им все равно придется явно загружатьmagrittr
. Один из способов решить эту проблему - повторно экспортировать функцию. Вот пример того, как это сделать.Теперь есть более простой способ поддерживать канал в ваших пакетах. Замечательный пакет
usethis
имеет функциюuse_pipe()
. Вы запускаете эту функцию один раз, и она обрабатывает все. Вот какuse_pipe()
функция описана вusethis
документации:источник
use_pipe()
в код, который используете для сборки пакета? Например, я бегу:usethis::use_description(usethis_description); usethis::use_build_ignore(directories); usethis::use_build_ignore(paste0(pkg_name, ".Rproj")); if (file.exists(file.path(pkg_path, "NAMESPACE"))) { file.remove(file.path(pkg_path, "NAMESPACE")) }; devtools::document(pkg_path); devtools::check(pkg_path); devtools::load_all(pkg_path); devtools::install(pkg_path)
. Мог бы я просто добавитьuse_pipe()
в начале?usethis
функции один раз при разработке пакета. Затем эти функции добавляют необходимые части в инструкции по сборке и все остальное.Еще одно решение - использовать
roxygen
пакет. Он реализован как частьdevtools
пакета. Послеdevtools
установки приложениеdevtools::document()
обновит ваше приложениеNAMESPACE
для вас. Он также автоматически создает файлы .Rd с документацией, что очень удобно.Все, что вам нужно сделать, это добавить специальный комментарий в формате
#' @import packagename
к файлу для импорта всех функций из этого пакета или#' @importFrom packagename functionname
для импорта функции. Вы можете иметь столько комментариев, сколько хотите, в ваших файлах, поэтому вы можете иметь их набор в верхней части каждого файла или с каждой из ваших функций, для которых требуется внешняя функция.Затем вы запускаете,
devtools::document()
и он анализирует ваш код в поисках этих комментариев, а затем создаетNAMESPACE
для вас соответствующий файл. Легко.источник
Предполагая, что вы используете RStudio,
devtools
пакет Хэдли и перечисленыmagrittr
в разделе «Импорт»DESCRIPTION
файла, вот шаги, которые я предпринял, чтобы заставить%>%
работать функции моего пакета.Сначала напишите функцию
foo.R
:Во-вторых, беги
devtools::document()
.В-третьих, беги
devtools::load_all()
.Файл , как это будет создан в вашей
R/
директории и ваша функция должна работать , как ожидалось.источник
@name %>%
?