Je voudrais utiliser l'opérateur pipe %>%
introduit dans le magrittr
package dans un package que j'ai écrit moi-même pour enchaîner dplyr
les transformations de données. magrittr
est répertorié comme Import
dans le DESCRIPTION
fichier. Après avoir chargé mon propre package et testé la fonction qui utilise l'opérateur pipe, j'obtiens le message d'erreur suivant:
Erreur dans le nom de la fonction (paramètre,: impossible de trouver la fonction "%>%"
Le passage %>%
au magrittr::%>%
code source de la fonction n'aide pas non plus car le package ne peut plus être construit.
r
namespaces
magrittr
alexander keth
la source
la source
Réponses:
Cela aurait dû fonctionner correctement si vous aviez
magrittr
listé dansDepends
. Cependant, cela n'est pas conseillé . , Vous quittez la placemagrittr
dansImports
et ajoutez la ligne suivanteNAMESPACE
:Je suggère de lire Writing R extensions . Votre question est traitée aux paragraphes 1.1.3 et 1.5.1.
la source
roxygen2
, vous pouvez ajouter#' importFrom magrittr "%>%"
pour que NAMESPACE soit rempli automatiquement pendantroxygenize()
.#' @importFrom magrittr "%>%"
%>%
qu'en interne dans votre package. Si votre API oblige les utilisateurs à enchaîner les fonctions à l'aide de%>%
, ils devront toujours se charger explicitementmagrittr
. Une façon de résoudre ce problème consiste à réexporter la fonction. Voici un exemple de comment procéder.Il existe désormais un moyen plus simple de prendre en charge le tube dans vos packages. Le merveilleux package
usethis
a la fonctionuse_pipe()
. Vous exécutez cette fonction une fois et elle gère tout. Voici comment lause_pipe()
fonction est décrite dans lausethis
documentation:la source
use_pipe()
au code que vous utilisez pour créer le package? Par exemple, je lance: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)
. Aurais-je juste ajouteruse_pipe()
au début?usethis
fonctions une fois lorsque vous développez le package. Ces fonctions ajoutent ensuite les pièces nécessaires aux instructions de construction et à tout le reste.Une solution supplémentaire - utilisez le
roxygen
package. Il est implémenté dans le cadre dudevtools
package. Une foisdevtools
installé, l'appeldevtools::document()
mettra à jour votreNAMESPACE
pour vous. Il crée également automatiquement des fichiers .Rd avec de la documentation, ce qui est pratique.Tout ce que vous faites est d'ajouter un commentaire spécial dans le format
#' @import packagename
à un fichier pour importer toutes les fonctions de ce package, ou#' @importFrom packagename functionname
pour importer une fonction. Vous pouvez avoir autant de ces commentaires que vous le souhaitez dans vos fichiers, vous pouvez donc en avoir un ensemble en haut de chaque fichier, ou avec chacune de vos fonctions nécessitant une fonction externe.Ensuite, vous exécutez
devtools::document()
et il analyse votre code à la recherche de ces commentaires, puis il crée unNAMESPACE
fichier approprié pour vous. Facile.la source
En supposant que vous utilisez RStudio, le
devtools
package de Hadley , et répertoriémagrittr
dans la section Importations duDESCRIPTION
fichier, voici les étapes que j'ai suivies pour faire%>%
fonctionner mes fonctions de package.Tout d'abord, écrivez la fonction
foo.R
:Deuxièmement, courez
devtools::document()
.Troisièmement, courez
devtools::load_all()
.Un fichier comme celui- ci sera créé dans votre
R/
répertoire et votre fonction devrait fonctionner comme prévu.la source
@name %>%
ici?