R: используйте оператора трубы magrittr в пакете написанном собственной личностью
Я хотел бы использовать трубу-оператор %>% представил в magrittr пакет в пакете, который я написал себе в chain dplyr преобразования данных. magrittr указан как Import на . После загрузки моего собственного пакета и тестирования функции, которая использует оператор pipe, я получаю следующее сообщение об ошибке:
ошибка в functionname (параметр,: не удалось найти функцию"%>%"
изменение %>% до magrittr::%>% в исходный код функции также не помогает, потому что пакет больше не может быть построен.
4 ответов:
он должен был работать правильно, если у вас было
magrittrперечислены вDepends. Однако, это Не рекомендуется. Вместо этого вы оставляетеmagrittrinImportsи добавьте следующую строку вNAMESPACE:importFrom(magrittr,"%>%")предлагаю почитать написание расширений R. Ваш вопрос рассматривается в пунктах 1.1.3 и 1.5.1.
одно дополнительное решение - использовать . Это реализовано как часть
devtoolsпакета. Один разdevtoolsустановлено, называяdevtools::document()обновитьNAMESPACEдля вас. Он также автоматически строит .Rd файлы с документацией, что удобно.все, что вы делаете, это добавить специальный комментарий в формате
#' @import packagenameв файл для импорта всех функций из этого пакета, или#' @importFrom packagename functionnameдля импорта функции. Вы можете иметь столько комментариев, сколько хотите в своих файлах, поэтому вы можете есть набор из них в верхней части каждого файла, или с каждой из ваших функций, которая нуждается во внешней функции.тогда беги
devtools::document()и он анализирует ваш код, ища эти комментарии, а затем создает соответствующийNAMESPACEфайл для вас. Простой.
предполагая, что вы используете RStudio, Hadley's
devtoolsпакет, и в спискеmagrittrВ разделе импортаDESCRIPTIONфайл, вот шаги, которые я предпринял, чтобы сделать%>%работа в моих функциях пакета.во-первых, написать функцию
foo.R:#' Convert \code{data.frame} to \code{list}. #' #' @importFrom magrittr %>% #' @name %>% #' @rdname pipe #' @export #' @param x A \code{data.frame} object. #' @examples #' my_result <- foo(iris) #' foo <- function(x) { x %>% as.list() }второй
devtools::document().в-третьих,
devtools::load_all().файл типа этой будет создан в вашей
R/каталог и ваша функция должны работать, как ожидалось.
теперь есть более простой способ поддерживать трубу в ваших пакетах. Замечательный пакет
usethisимеет функциюuse_pipe(). Вы запускаете эту функцию один раз, и она обрабатывает все. Вот как этоuse_pipe()функция описана вusethisдокументы:необходима ли настройка для использования трубы magrittr внутри вашего пакета и реэкспортировать его для пользователей вашего пакета:
добавляет magrittr в "импорт" в описании
создает R / utils-pipe.R с необходимым шаблоном roxygen
Comments