R: использовать оператор magrittr pipe в самописном пакете
Я хотел бы использовать оператор-труба %>%
, представленный в пакете magrittr
в пакете, который я написал себе для преобразования цепочек dplyr
. magrittr
отображается как Import
в файле DESCRIPTION
. После загрузки моего собственного пакета и тестирования функции, использующей оператор-оператор, я получаю следующее сообщение об ошибке:
Ошибка в имени функции (параметр,: не удалось найти функцию "% > %"
Изменение %>%
до magrittr::%>%
в исходном коде функции не помогает либо потому, что пакет больше не может быть создан.
Ответы
Ответ 1
Он должен был работать правильно, если бы у вас был magrittr
, указанный в Depends
. Однако это не рекомендуется. Вместо этого вы оставите magrittr
в Imports
и добавьте следующую строку в NAMESPACE
:
importFrom(magrittr,"%>%")
Я предлагаю читать Написание расширений R. Ваш вопрос рассматривается в пунктах 1.1.3 и 1.5.1.
Ответ 2
Одно дополнительное решение - используйте пакет roxygen
. Он реализован как часть пакета devtools
. Как только devtools
установлен, вызов devtools::document()
обновит ваш NAMESPACE
для вас. Он также автоматически создает файлы .Rd с документацией, которая удобна.
Все, что вы делаете, это добавить специальный комментарий в формате #' @import packagename
к файлу для импорта всех функций из этого пакета или #' @importFrom packagename functionname
для импорта функции. Вы можете иметь столько комментариев, сколько захотите, в своих файлах, поэтому вы можете иметь набор из них в верхней части каждого файла или с каждой из ваших функций, для которых требуется внешняя функция.
Затем вы запустите devtools::document()
, и он проанализирует ваш код, ищущий эти комментарии, и затем создаст для вас соответствующий файл NAMESPACE
. Легко.
Ответ 3
Предполагая, что вы используете пакет RStudio, Hadley devtools
и перечислены magrittr
в разделе Импорт файла DESCRIPTION
, вот шаги, которые я предпринял, чтобы сделать %>%
работать в моей функции пакета (s).
Сначала запишите функцию 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()
.
Файл this будет создан в вашем каталоге R/
, и ваша функция должна работать как ожидалось.