2015-01-14 3 views
55

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

Ошибки в FunctionName (параметр,: не может найти функцию «%>%»

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

+0

Я бы посоветовал против оператора трубы внутри функции внутри пакета. Это делает отладку намного сложнее (стек вызовов становится безумно глубоким с трубой). Для пакетов я бы просто перезаписал временную переменную, что упрощает тестирование (подумайте: R сообщит вам, в какой строке произошла ошибка). Труба прекрасно подходит для интерактивного использования, но для программирования это может быть обузой. –

ответ

57

это должно было сработать правильно, если вы были magrittr перечислены в Depends. Тем не менее, это not advised. Вместо этого, Вы оставляете magrittr в Imports и добавьте следующую строку в NAMESPACE:

importFrom(magrittr,"%>%") 

Я предлагаю читать Writing R extensions. Ваш вопрос освещен в пунктах 1.1.3 и 1.5.1.

+1

Спасибо, что решила проблему. –

+1

@alexanderketh В этом случае вы должны нажать зеленую метку рядом с ответом, чтобы отметить ее как принятую. Добро пожаловать в SO! – tonytonov

+31

Если вы используете 'roxygen2', вы можете добавить' # 'importFrom magrittr "%>%" ', чтобы NAMESPACE заселялась автоматически во время' roxygenize() '. –

20

Одно дополнительное решение - используйте пакет roxygen. Он реализован как часть пакета devtools. Как только devtools будет установлен, звонок devtools::document() обновит ваш NAMESPACE для вас. Он также автоматически создает файлы .Rd с документацией, что удобно.

Все, что вам нужно сделать, это добавить специальный комментарий в формате #' @import packagename в файл, чтобы импортировать все функции из этого пакета, или #' @importFrom packagename functionname, чтобы импортировать функцию. Вы можете иметь столько комментариев, сколько захотите, в своих файлах, поэтому вы можете иметь набор из них в верхней части каждого файла или с каждой из ваших функций, для которых требуется внешняя функция.

Затем вы запускаете devtools::document(), и он анализирует ваш код для поиска этих комментариев, а затем создает для вас соответствующий файл NAMESPACE. Легко.

+0

Когда я это делаю, он смешивает следующие комментарии кислорода, относящиеся к файлу справки для первой функции в сценарии R. Как отделить глобальные комментарии к кислороду от файлов справки? – jzadra

+2

Я обычно помещаю комментарии импорта с каждой функцией по отдельности. Таким образом, если другие функции в файле будут изменены, ваш импорт останется точным. Итак, глобальных определений нет. –

7

Предполагая, что вы используете RStudio, 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().

Файл this будет создан в вашем каталоге R/, и ваша функция будет работать должным образом.

 Смежные вопросы

  • Нет связанных вопросов^_^