studio - filtros con dplyr
R: use el operador de tuberÃa magrittr en un paquete auto escrito (4)
Me gustaría usar el operador de tubería
%>%
introducido en el paquete
magrittr
en un paquete que escribí yo mismo para encadenar las 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ía, 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.
Ahora hay una manera más fácil de soportar la tubería en sus paquetes.
El maravilloso paquete
usethis
tiene la función
use_pipe()
.
Ejecutas esa función una vez y se encarga de todo.
Así es como se describe la función
use_pipe()
en la documentación de
usethis
:
¿La configuración es necesaria para usar la tubería de magrittr internamente en su paquete y para volver a exportarla para los usuarios de su paquete?
Agrega magrittr a "Importaciones" en la DESCRIPCIÓN
Crea R / utils-pipe.R con la plantilla roxygen necesaria
Debería haber funcionado correctamente si tuviera
magrittr
incluido en
Depends
.
Sin embargo, esto
no
es
aconsejable
.
En su lugar, deja
magrittr
en
Imports
y agrega la siguiente línea a
NAMESPACE
:
importFrom(magrittr,"%>%")
Sugiero leer Escritura de extensiones R. Su pregunta se trata en los párrafos 1.1.3 y 1.5.1.
Suponiendo que está utilizando RStudio, el paquete
devtools
de Hadley y
magrittr
enumerado en la sección Importaciones del archivo
DESCRIPTION
, estos son los pasos que tomé para 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()
}
En segundo lugar, ejecute
devtools::document()
.
Tercero, ejecute
devtools::load_all()
.
Se creará un archivo como
este
en su directorio
R/
y su función debería funcionar como se espera.
Una solución adicional: use el paquete
roxygen
.
Se implementa como parte del paquete
devtools
.
Una vez que se instala
devtools
, llamar a
devtools::document()
actualizará su
NAMESPACE
por usted.
También autocompila archivos .Rd con documentación, lo cual es útil.
Todo lo que debe hacer 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 comentarios como desee en sus archivos, por lo que puede 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 en busca de esos comentarios, y luego crea un archivo
NAMESPACE
apropiado para usted.
Fácil.