Comment bien documenter les méthodes S4 en utilisant roxygen2

j'ai vu quelques discussions dans SO et d'autres endroits sur la façon dont cela devrait être ou sera fait dans les versions futures de Roxygen2. Cependant, je suis coincé. Comment puis-je documenter un générique S4, ainsi que ses méthodes, en utilisant Roxygen2? Un exemple pratique pour un tout nouveau générique/méthodes, ainsi qu'un exemple pour l'extension de base S4 Générique serait incroyablement utile. Je ne veux pas avoir à faire la documentation séparée (la plupart du temps) redondante pour chaque méthode S4 du même générique.

Due dilligence: J'ai trouvé un exemple utile pour la méthode "extract". Toutefois, il semble désuet et incomplet pour ma question. Il utilise la balise @slot dans la documentation de la classe, ce qui n'est pas (plus?) soutenu. Il ne montre qu'une extension d'une méthode core S4 "[", plutôt qu'un exemple complet de Roxygen incluant la documentation du S4 generic.

Comment bien document S4 "[" et "[<-" à l'aide de méthodes roxygen?

si je documente entièrement un nouveau générique S4 avec le titre, la description @param @return @name @aliases @docType @rdname , et puis documenter la méthode S4 avec juste le @name @aliases @docType @rdname correspondant, je reçois le suivant 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 a regardé d'abord comme si aucune de mes méthodes S4 documentées de cette façon avec roxygen2 avait réellement fonctionné. Cependant, jusqu'à présent, j'ai remarqué que mes extensions de la méthode de base "show" n'ont pas erreur associée, même si elles ont été documentées exactement de la même manière que les autres. Voici un exemple de la documentation complète de roxygen que j'ai inclus au-dessus d'une des méthodes de show, qui N'a pas généré l'erreur de documentation manquante:

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

donc, je suis perdu. Comme vous pouvez le voir, j'ai inclus la convention pour les Alias pour les méthodes S4 décrites dans la section de documentation S4 du manuel du paquet r , à savoir que les méthodes devrait avoir un alias avec le nom suivant (sans espace):

generic,signature_list-method.

D'une façon ou d'une autre, cela n'est pas complètement compris par R CMD check .

enfin, après avoir construit la documentation en utilisant:

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

et en construisant le paquet, j'obtiens la documentation de fonctionnement. Tous les titres de la documentation d'une méthode spécifique se retrouvent dans le champ 'Description', plutôt maladroitement. Donc roxygen2 a manifestement fait quelque chose avec la documentation de chaque méthode et est sur la bonne voie. Cependant, il ne suffit pas d'éviter un grand et troublant avertissement de

> R CMD check mypkgname

j'ai regardé les fichiers Rd, mais j'en sais encore moins sur eux pour voir rapidement quel est le problème, et je veux de toute façon connaître la solution roxygen2 pour ne pas avoir à manipuler les fichiers Rd directement après chaque révision de la documentation.

donc c'est une question multipartite:

  1. Quelle est l'approche actuellement recommandée pour la documentation des méthodes S4 generic et S4 avec roxygen2?

  2. y a-t-il un bon exemple disponible quelque part qui montre tous les détails?

  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 fait, ont-ils fait analyser leur doc par roxygen2 et les fichiers Rd résultants sont au moins assez bons pour fonctionner dans le paquet après R CMD build mypkgname ) ?

48
demandé sur Community 2011-09-09 04:58:06

2 réponses

soutien officiel, expliqué dans devtools doc

http://r-pkgs.had.co.nz/man.html#man-classes (faites défiler vers le bas jusqu'à la sous-section S4 ).

le court exemple actuel tiré de cette page est reproduit ci-après (pour plus de commodité):

#' An S4 class to represent a bank account.
#'
#' @slot balance A length-one numeric vector
Account <- setClass("Account",
  slots = list(balance = "numeric")
)

le lien ci-dessus explique très clairement le support S3, S4, et RC via roxygen/devtools. L'explication n' doit être considéré comme remplacent les anciens réponse ci-dessous, ne fonctionne pour l'instant, mais est moins claire et plus compliqué.

l'ancienne réponse

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

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

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

helloworld-methods est remplacé par the_name_of_your_generic-methods . Ce sera le nom du fichier Rd qui contient la documentation pour le générique et toutes ses méthodes. Cette convention d'appellation n'est pas nécessaire, mais elle est courante et utile. La balise @export est nécessaire maintenant qu'un namespace est requis pour votre paquet et que vous voulez que cette méthode soit disponible pour les utilisateurs de votre paquet, pas seulement d'autres méthodes/fonctions dans votre paquet.

pour documenter les méthodes, je trouve que seulement 2 lignes sont nécessaires, fournissant la balise @rdname et @aliases . L'énoncé @rdname devrait correspondre exactement à celui du générique. L'étiquette @aliases doit adhérer à une convention de nommage décrite dans la section de documentation officielle S4 de Writing R Extensions .

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

il ne doit pas y avoir d'espaces après les virgules dans le nom @aliases . Je ne connais pas les règles exactes entourant quand ajouter ,ANY à la fin de la liste de signature. Le motif semble être que le nombre de les éléments de tous les @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éfinie avec une signature à 2 éléments, et donc R CMD check n'était pas satisfait de la documentation à moins que ,ANY n'ait été ajouté à la balise d'Alias des autres méthodes, même si leur définition de signature n'a qu'un élément.

un exemple complet suit. Je l'ai construit et il fonctionne avec aucun avertissements de niveau de documentation de R CMD check testpkg , en utilisant un fourche bug-fixed d'une version de développement très récente de roxygen2 (que j'ai mis à 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 ne fonctionnera pas à ce moment en raison d'une erreur de citation (décrite dans une réponse séparée), mais je m'attends à ce que cela sera incorporé très bientôt et ma fourchette ne sera pas nécessaire. Pour avoir examiné cet exemple dans le contexte de reste d'un paquet, et en voyant les fichiers de documentation résultants (Rd), Je l'ai rendu disponible comme un paquet test trivial 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 de documentation séparée spécifique à la méthode parce que vos méthodes n'ont pas dévié sauvagement du comportement que l'on attendrait basé sur le doc Générique. Il y a des moyens dans roxygen2 pour gérer ce cas alternatif en utilisant l'étiquette @usage , mais les détails seraient mieux traités par une question séparée.

ainsi la plupart de vos efforts de documentation va dans l'en-tête roxygen au-dessus de la définition générique. Cela a une certaine base dans le code, puisque le générique devrait inclure tous les arguments spécifiques qui apparaissent dans l'une des méthodes définies par la suite . Notez que les arguments qui sont traités comme faisant partie du ... dans la liste des arguments ne sont pas inclus et ne devraient pas être documentés spécifiquement, mais ... 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 en cours , le vieille vignette roxygen , ainsi que le roxygen2 site de développement sur GitHub . Il ya aussi un donc question sur la documentation R avec Roxygen en général.

35
répondu Paul McMurdie 2017-05-23 12:10:08

j'ai repéré que la réponse à la partie (3) -- la documentation Non manquante des méthodes S4 -- est due à des guillemets ajoutés par erreur autour des balises \alias lorsque la convention de nommage S4 est utilisée; très probablement un bogue résultant de la gestion de texte d'un alias qui contient une virgule dans 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 du bogue avec un exemple reproductible sur the roxygen2 GitHub page:

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

brièvement,

#' @aliases show,helloworld-method

devient

\alias{"show,helloworld-method"}

dans le fichier Rd résultant. La suppression des citations supprime l'avertissement R CMD check , et la documentation se construit et est fonctionnelle dans les deux cas.

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

8
répondu Paul McMurdie 2011-09-13 06:50:23