R: используйте оператора трубы magrittr в пакете написанном собственной личностью



Я хотел бы использовать трубу-оператор %>% представил в magrittr пакет в пакете, который я написал себе в chain dplyr преобразования данных. magrittr указан как Import на . После загрузки моего собственного пакета и тестирования функции, которая использует оператор pipe, я получаю следующее сообщение об ошибке:




ошибка в functionname (параметр,: не удалось найти функцию"%>%"




изменение %>% до magrittr::%>% в исходный код функции также не помогает, потому что пакет больше не может быть построен.

533   4  

4 ответов:

он должен был работать правильно, если у вас было magrittr перечислены в Depends. Однако, это Не рекомендуется. Вместо этого вы оставляете magrittr in Imports и добавьте следующую строку в 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

    Ничего не найдено.