49 votes

Comment documenter correctement les méthodes S4 en utilisant roxygen2

J'ai vu quelques discussions, et d'autres endroits qui concerne la manière dont cela devrait être ou seront effectuées dans les futures versions de Roxygen2. Cependant, je suis coincé. Comment dois-je aller sur la documentation d'une S4 générique, ainsi que ses méthodes, à l'aide de Roxygen2? Un exemple de travail pour une nouvelle marque générique/méthodes, ainsi qu'un exemple pour l'extension de la base S4 générique serait incroyablement utile. Je ne veux pas avoir à faire séparés (pour la plupart) redondant de la documentation pour chaque S4 méthode de la même générique.

Due diligence: J'ai traqué un exemple utile pour la fonction "extraire" de la méthode. Cependant, il semble être obsolète et incomplète pour ma question. Il utilise @fente dans la balise de documentation de classe, ce qui n'est pas (plus?) pris en charge. Il montre seulement une extension d'un core S4 méthode "[", plutôt qu'une complète Roxygen exemple, y compris la documentation de la S4 générique.

Comment documenter correctement S4 "[" et "[<-" les méthodes à l'aide de roxygen?

Si je suis entièrement d'une nouvelle S4 générique avec le titre, la description @param @return @name @aliases @docType @rdname, puis de document de la S4 méthode avec juste la correspondante @name @aliases @docType @rdname, j'ai le R CMD check avertissement:

* checking for missing documentation entries ... WARNING
Undocumented S4 methods:
<< long list of apparently undocumented methods. E.g. generic 'plot' and siglist 'myClass1,ANY' >>
All user-level objects in a package (including S4 classes and methods)
should have documentation entries.

Il regarda d'abord comme si aucun de mes S4 méthodes décrites dans ce mode avec roxygen2 avait effectivement travaillé. Cependant, jusqu'à présent, j'ai remarqué que mes extensions de la base de la méthode "afficher" ne sont pas associés à une erreur, même si elles ont été documentés exactement de la même manière que le reste. Voici un exemple complet de l'roxygen documentation j'ai inclus ci-dessus l'un de l'montrent que les méthodes, qui n'ont PAS donné le manque de documentation d'erreur:

#' @name show
#' @aliases show,myClass2-method
#' @docType methods
#' @rdname show-methods

Donc, je suis à une perte. Comme vous pouvez le voir, j'ai inclus la convention des alias pour les S4 méthodes décrites dans la S4 section documentation du package R manuel, à savoir que les méthodes doivent avoir un alias avec le nom suivant (sans espace):

generic,signature_list-method.

D'une certaine manière, ce n'est pas complètement compris par R CMD check.

Enfin, après la création de la documentation à l'aide de:

library("devtools")
library("roxygen2")
document("mypkgname")
check_doc("mypkgname")

et de la construction du paquet, je reçois le fonctionnement de la documentation. Tous les titres à partir d'une méthode spécifique à la documentation de vents dans le champ "Description", plutôt maladroitement. Donc roxygen2 n'a évidemment quelque chose avec chaque méthode de la documentation et de l'est sur la bonne voie. Cependant, il n'est pas suffisant pour éviter une importante et préoccupante d'avertissement de

> R CMD check mypkgname

J'ai regardé la Rd fichiers, mais je sais encore moins sur eux pour voir rapidement ce qui est le problème, et de toute façon je veux savoir le roxygen2 solution afin que je ne vais pas avoir à manipuler la Rd fichiers directement après chaque révision de la documentation.

C'est donc un multipart question:

  1. Quel est l'approche recommandée pour les S4 générique et S4 documentation de la méthode avec roxygen2?

  2. Est-il un bon exemple disponible quelque part qui montre les détails complets?

  3. Ce qui pourrait être la cause, et la solution, à la mise en garde que la documentation pour la plupart S4 méthodes est manquant (même si les méthodes avec des "disparus" de la documentation en réalité ont eu leur doc analysé par roxygen2 et de la Rd fichiers sont au moins assez bon pour travailler dans le paquet après l' R CMD build mypkgname) ?

40voto

Paul McMurdie Points 2414

Voici un exemple qui devrait fonctionner pour la plupart S4 méthodes.

Pour la documentation de la S4 génériques, je trouve les trois lignes suivantes dans la plupart de mes génériques en-têtes:

#' @export
#' @docType methods
#' @rdname helloworld-methods

helloworld-methods est remplacé par the_name_of_your_generic-methods. Ce sera le nom de la Rd fichier qui contient la documentation pour le générique et toutes ses méthodes. Cette convention de nommage n'est pas nécessaire, mais courantes et les plus utiles. L' @export balise est nécessaire maintenant d'un espace de noms est nécessaire pour que votre colis et que vous souhaitez que cette méthode soit disponible pour les utilisateurs de votre colis, et pas seulement d'autres méthodes/fonctions dans votre forfait.

Pour la documentation des méthodes, je trouve que seulement 2 lignes sont nécessaires, en fournissant de l' @rdname et @aliases balise. L' @rdname déclaration doit correspondre exactement à celui du générique. L' @aliases balise doit adhérer à une convention de nommage décrit dans le S4 section documentation de l'Écriture de R Extensions.

#' @rdname helloworld-methods
#' @aliases helloworld,character,ANY-method

Il ne devrait pas y avoir d'espace après les virgules dans l' @aliases nom. Je ne sais pas exactement les règles entourant le moment d'ajouter ,ANY à la fin de la liste de signatures. Le motif semble être que le nombre d'éléments dans tous @aliases signature des listes doit correspondre au nombre d'éléments dans la plus longue de la signature de vecteur entre les méthodes. Dans l'exemple ci-dessous, une des méthodes est défini avec 2-l'élément de signature, et donc, R CMD check n'était pas satisfait de la documentation à moins d' ,ANY a été ajouté à l'alias tag des autres méthodes, même si leur signature définition n'a qu'un élément.

Un exemple complet de la façon suivante. J'ai construit ce et il fonctionne en l'absence de documents les alertes de niveau d' R CMD check testpkg, à l'aide d'un bug de la fourche fixe d'un très récent devel version de roxygen2 (que j'ai à disposition). Pour une installation rapide de cette fourche sur votre système, utilisez library("devtools"); install_github("roxygen", "joey711"). La version la plus récente de roxygen2 de ne pas travailler en ce moment à cause d'une citation d'erreur (décrite dans une autre réponse), mais j'espère que cela sera intégré très bientôt et ma fourche ne sera pas nécessaire. Pour regarder cet exemple dans le contexte du reste du paquet, et de voir la résultante de la documentation (Rd) des fichiers, j'ai fait disponible comme un banal paquet de test sur github appelé testpkg.

##############################################################
#' The title, in this case: Helloworld-ify the argument.
#'
#' Some additional details about this S4 generic and its methods.
#' The extra blank line between this section and the title is
#' critical for roxygen2 to differentiate the title from the
#' description section.
#'
#' @param x Description of \code{x}. The main argument in this
#'  example. Most often has such and such properties.
#'
#' @param y Description of \code{y}. An argument that is rarely
#'  used by \code{"helloworld"} methods. 
#'
#' @param ... Additional argument list that might not ever
#'  be used.
#'
#' @return A helloworld-ified argument. Oh, you'll see.
#' 
#' @seealso \code{\link{print}} and \code{\link{cat}}
#' 
#' @export
#' @docType methods
#' @rdname helloworld-methods
#'
#' @examples
#' helloworld("thisismystring")
#' helloworld(char2helloworld("thisismystring"))
#' helloworld(matrix(0,3,3))
#' helloworld(list(0,0,0))
#' helloworld(integer(0))
setGeneric("helloworld", function(x, y, ...){
    cat("Hello World!")
    cat("\n")
    standardGeneric("helloworld")
})

#' @rdname helloworld-methods
#' @aliases helloworld,ANY,ANY-method
setMethod("helloworld", "ANY", function(x, y, ...){
    cat(class(x))
})

#' @rdname helloworld-methods
#' @aliases helloworld,character,ANY-method
setMethod("helloworld", "character", function(x){
    show(x)
})

#' @rdname helloworld-methods
#' @aliases helloworld,character,character-method
setMethod("helloworld", c("character", "character"), function(x, y){
    show(x)
})

Cet exemple suppose que vous n'avez pas besoin d'une autre méthode de la documentation spécifique parce que vos méthodes n'ont pas changé une virgule sauvagement sur le comportement prévu selon le générique doc. Il y a des moyens dans roxygen2 à gérer que d'autres à l'aide de l' @usage balise, mais les détails seraient mieux traités par une SORTE de question.

Si la plupart de vos documents d'efforts dans la roxygen en-tête au-dessus de la définition générique. Cela a un certain fondement dans le code, depuis le générique doit inclure tous les arguments spécifiques qui apparaissent dans la suite de méthodes définies . Notez que les arguments qui sont traitées dans le cadre de l' ... dans la liste d'arguments ne sont pas inclus et ne devrait pas être documenté, mais l' ... lui-même doit être documentée au-dessus du générique (voir l'exemple complet ci-dessous).

Pour plus de détails sur les bases de la documentation des fonctions, il y a un wiki dans le progrès, l' ancien roxygen vignette, ainsi que la roxygen2 développement d'un site sur github. Il y a aussi une SORTE de question sur la R de la documentation avec Roxygen en général.

9voto

Paul McMurdie Points 2414

J'ai traqué que la réponse à la partie (3) -- le manque de documentation de la S4, est en raison de guillemets ajoutés à tort autour de l' \alias balises lorsque le S4 convention de nommage utilisée est probablement un bug résultant de traitement de texte d'un alias qui contient une virgule, comme partie de son nom. Cela est encore vrai de la dernière version de roxygen2 au moment de cette publication. Je viens de poster une description plus détaillée de la bogue avec un exemple reproductible sur la roxygen2 page github:

https://github.com/klutometis/roxygen/issues/40

Brièvement,

#' @aliases show,helloworld-method

devient

\alias{"show,helloworld-method"}

dans la Rd fichier. Enlever les citations supprime l' R CMD check d'avertissement, et la documentation s'appuie et est fonctionnel dans les deux cas.

Je pense que les parties (1) et (2) de la présente question (meilleures pratiques, de bons exemples) encore ouvertes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X