2014-07-06 8 views
13

Seit roxygen2 Version 4.0.0 ist das @S3method-Tag zugunsten der Verwendung von @export veraltet.Exportieren von Nicht-S3-Methoden mit Punkten im Namen mit roxygen2 v4

Das Paket versucht nun festzustellen, ob es sich bei einer Funktion um eine S3-Methode handelt, und fügt automatisch die Zeile S3method(function,class) der Datei NAMESPACE hinzu, wenn sie dies für eins hält.

Das Problem ist, dass, wenn eine Funktion keine S3-Methode ist, aber ihr Name eine . enthält, dann macht roxygen manchmal einen Fehler und fügt die Zeile hinzu, wenn dies nicht der Fall ist.

Gibt es eine Möglichkeit, roxygen zu sagen, dass eine Funktion keine S3-Methode ist?


Wie gewünscht, hier ein reproduzierbares Beispiel.

Ich habe ein Paket, das R.oo importiert, mit einer Funktion mit dem Namen check.arg.

library(roxygen2) 
package.skeleton("test") 
cat("Imports: R.oo\n", file = "test/DESCRIPTION", append = TRUE) 
writeLines(
    "#' Check an argument 
#' 
#' Checks an argument. 
#' @param ... Some arguments. 
#' @return A value. 
#' @export 
check.arg <- function(...) 0", 
    "test/R/check.arg.R" 
) 
roxygenise("test") 

Nun enthält der Namensraum die Zeile S3method(check,arg).

check ist ein S3 generisch in R.oo, also versucht roxygen, klug zu sein und zu raten, dass ich check.arg eine S3 Methode sein möchte. Leider haben diese Funktionen nichts miteinander zu tun, also nicht.

(Um Vorschläge präjudizieren, die ich check.arg einfach umbenennen: Das ist Code Vermächtnis von anderen geschrieben, und ich habe einen checkArg Ersatz geschaffen, aber ich brauche für die Kompatibilität check.arg als veraltet Funktion zu verlassen.)

+4

Ich glaube, Sie verwenden nur '@ export' mit dem vollen Namen der Funktion. Es wäre hilfreich, ein [reproduzierbares Beispiel] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) zu testen. – MrFlick

+0

@MrFlick Danke für die Lösung, und danke für meine Erinnerung, nicht faul zu sein. –

Antwort

12

Wie Herr Flick kommentierte, dass das Hinzufügen des vollen Funktionsnamens an die Roxygen-Linie korrekt funktioniert. Wenn ich die Linie zu ändern:

#' @export check.arg 

dann die NAMESPACE Datei enthält:

export(check.arg) 
+4

Das andere Problem, um das Sie sich kümmern müssen, ist die usage-Anweisung, die sagt '## S3-Methode für die Klasse 'check' \ n check (...)', es sei denn, Sie beheben es. Eine Möglichkeit besteht darin, einfach eine Anweisung ## '@usage check.arg (x) hinzuzufügen, nicht sicher, ob es einen besseren Weg gibt. –

+4

** Beachten Sie, dass ** die obige Lösung Ihnen einen korrekten Eintrag in Ihrer 'NAMESPACE'-Datei liefert. Um jedoch die Funktion * documented * korrekt zu erhalten, müssen Sie auch ein '@ usage'-Tag hinzufügen, sonst erscheint die Meldung' ## S3-Methode für die Klasse 'arg'' genau über der Signatur Ihrer Funktion in ''. Rd 'Datei und die Signatur in der Hilfedatei wird' check (...) 'und nicht' check.arg (...) 'sein. – Jthorpe

-1

Verwenden @method generic class und @export statt @S3method. Schauen Sie sich diesen Thread an: S3 method help (roxygen2)

+1

In dieser Frage geht es nicht darum, wie man S3-Methoden dokumentiert; Es geht um das umgekehrte Problem, Dinge zu dokumentieren, die keine S3-Methoden sind (aber roxygen denkt, dass sie es sind). –