web-dev-qa-db-fra.com

R: utiliser l'opérateur de tuyau magrittr dans un package auto-écrit

Je voudrais utiliser l'opérateur de pipe %>% introduit dans le package magrittr dans un package que j'ai écrit moi-même pour chaîner les transformations de données dplyr. magrittr est répertorié comme Import dans le fichier DESCRIPTION. 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 "%>%"

En changeant %>% à magrittr::%>% dans le code source de la fonction n'aide pas non plus car le paquet ne peut plus être construit.

83
alexander keth

Cela aurait dû fonctionner correctement si vous aviez magrittr répertorié dans Depends. Cependant, c'est déconseillé . Au lieu de cela, vous laissez magrittr dans Imports et ajoutez la ligne suivante à NAMESPACE:

importFrom(magrittr,"%>%")

Je suggère de lire Écrire des extensions R . Votre question est traitée aux paragraphes 1.1.3 et 1.5.1.

87
tonytonov

Une solution supplémentaire - utilisez le package roxygen. Il est implémenté dans le cadre du package devtools. Une fois que devtools est installé, appeler devtools::document() mettra à jour votre NAMESPACE pour vous. Il crée également automatiquement des fichiers .Rd avec de la documentation, ce qui est pratique.

Il vous suffit d'ajouter un commentaire spécial au 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 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 qui nécessite une fonction externe.

Ensuite, vous exécutez devtools::document() et il analyse votre code à la recherche de ces commentaires, puis il crée un fichier NAMESPACE approprié pour vous. Facile.

29
Mike Stanley

Il existe désormais un moyen plus simple de prendre en charge le tuyau dans vos packages. Le merveilleux package usethis a la fonction use_pipe(). Vous exécutez cette fonction une fois et elle gère tout. Voici comment la fonction use_pipe() est décrite dans la documentation usethis:

La configuration est-elle nécessaire pour utiliser le tube de magrittr en interne dans votre package et pour le réexporter pour les utilisateurs de votre package:

Ajoute magrittr à "Imports" dans DESCRIPTION

Crée R/utils-pipe.R avec le modèle roxygen nécessaire

16
Andrew Brēza

En supposant que vous utilisez RStudio, le package devtools de Hadley et que vous avez répertorié magrittr dans la section Imports du fichier DESCRIPTION, voici les étapes que j'ai suivies pour créer %>% fonctionne dans mes fonctions de package.

Tout d'abord, écrivez la fonction 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()
}

Ensuite, exécutez devtools::document().

Troisièmement, exécutez devtools::load_all().

Un fichier comme this sera créé dans votre répertoire R/ Et votre fonction devrait fonctionner comme prévu.

15
Jubbles