R: utilice el operador de tuberías magrittr en un paquete auto escrito

Me gustaría usar el pipe-operator %>% introducido en el paquete magrittr en un paquete que escribí yo mismo para encadenar transformaciones de datos dplyr . magrittr aparece como Import en el archivo DESCRIPTION . Después de cargar mi propio paquete y probar la función que utiliza el operador de tuberías, aparece el siguiente mensaje de error:

Error en functionname (parámetro,: no se pudo encontrar la función “%>%”

Cambiar %>% a magrittr::%>% en el código fuente de la función tampoco ayuda porque el paquete ya no se puede construir.

Debería haber funcionado correctamente si tuviera magrittr enumerado en Depends . Sin embargo, esto no es aconsejable . En cambio, deja magrittr en Imports y agrega la siguiente línea a NAMESPACE :

 importFrom(magrittr,"%>%") 

Sugiero leer Writing R extensions . Su pregunta está cubierta en los párrafos 1.1.3 y 1.5.1.

Una solución adicional: use el paquete roxygen . Se implementa como parte del paquete devtools . Una vez que devtools está instalado, al llamar a devtools::document() actualizará su NAMESPACE por usted. También construye automáticamente archivos .Rd con documentación, que es útil.

Todo lo que hace es agregar un comentario especial en el formato #' @import packagename a un archivo para importar todas las funciones de ese paquete, o #' @importFrom packagename functionname para importar una función. Puede tener tantos de estos comentarios como desee en sus archivos, para que pueda tener un conjunto de ellos en la parte superior de cada archivo, o con cada una de sus funciones que necesita una función externa.

Luego ejecuta devtools::document() y analiza su código buscando esos comentarios, y luego crea un archivo NAMESPACE apropiado para usted. Fácil.

Suponiendo que está utilizando RStudio, el paquete devtools de Hadley y el devtools enumerado en la sección de Importaciones del archivo DESCRIPTION , estos son los pasos que tomé para hacer que %>% funcione en las funciones de mi paquete.

Primero, escribe la función 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() } 

Segundo, ejecute devtools::document() .

En tercer lugar, ejecute devtools::load_all() .

Se creará un archivo como este en su directorio R/ y su función debería funcionar como se esperaba.