R: использовать оператор magrittr pipe в самописном пакете - программирование
Подтвердить что ты не робот

R: использовать оператор magrittr pipe в самописном пакете

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

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

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

4b9b3361

Ответ 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/, и ваша функция должна работать как ожидалось.