Me gustaría usar el operador de tubería %>%
introducido en el magrittr
paquete en un paquete que escribí yo mismo para encadenar dplyr
transformaciones de datos. magrittr
aparece como Import
en el DESCRIPTION
archivo. Después de cargar mi propio paquete y probar la función que usa el operador de tubería, aparece el siguiente mensaje de error:
Error en el nombre de la función (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.
r
namespaces
magrittr
alexander keth
fuente
fuente
Respuestas:
Debería haber funcionado correctamente si lo hubiera
magrittr
incluido enDepends
. Sin embargo, esto no se recomienda . En su lugar, dejamagrittr
enImports
y añadir la siguiente líneaNAMESPACE
:Sugiero la lectura de las extensiones de escritura R . Su pregunta se aborda en los párrafos 1.1.3 y 1.5.1.
fuente
roxygen2
, puede agregar#' importFrom magrittr "%>%"
para que NAMESPACE se complete automáticamente duranteroxygenize()
.#' @importFrom magrittr "%>%"
%>%
internamente en su paquete. Si su API requiere que los usuarios encadenen funciones usando%>%
, aún tendrán que cargar explícitamentemagrittr
. Una forma de resolver este problema es volver a exportar la función. A continuación, se muestra un ejemplo de cómo hacerlo.Una solución adicional: use el
roxygen
paquete. Está implementado como parte deldevtools
paquete. Una vez quedevtools
esté instalado, la llamadadevtools::document()
actualizará tuNAMESPACE
. También construye automáticamente archivos .Rd con documentación, lo cual 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, por lo que puede tener un conjunto de ellos en la parte superior de cada archivo, o con cada una de sus funciones que necesite una función externa.Luego lo ejecuta
devtools::document()
y analiza su código en busca de esos comentarios, y luego crea unNAMESPACE
archivo apropiado para usted. Fácil.fuente
Ahora existe una forma más sencilla de admitir la tubería en sus paquetes. El maravilloso paquete
usethis
tiene la funciónuse_pipe()
. Ejecuta esa función una vez y se encarga de todo. Así es comouse_pipe()
se describe la función en lausethis
documentación:fuente
use_pipe()
al código que usa para construir el paquete? Por ejemplo, corro:usethis::use_description(usethis_description); usethis::use_build_ignore(directories); usethis::use_build_ignore(paste0(pkg_name, ".Rproj")); if (file.exists(file.path(pkg_path, "NAMESPACE"))) { file.remove(file.path(pkg_path, "NAMESPACE")) }; devtools::document(pkg_path); devtools::check(pkg_path); devtools::load_all(pkg_path); devtools::install(pkg_path)
. ¿Solo agregaríause_pipe()
al principio?usethis
funciones una vez cuando estás desarrollando el paquete. Esas funciones luego agregan las partes necesarias a las instrucciones de construcción y todo lo demás.Suponiendo que está usando RStudio, el
devtools
paquete de Hadley , y que aparecemagrittr
en la sección Importaciones delDESCRIPTION
archivo, aquí hay pasos que tomé para que%>%
funcionen en las funciones de mi paquete.Primero, escriba la función
foo.R
:Segundo, corre
devtools::document()
.Tercero, corre
devtools::load_all()
.Se creará un archivo como este en su
R/
directorio y su función debería funcionar como se esperaba.fuente
@name %>%
aqui?