2012-11-22 4 views
10

Ich habe das folgende Problem bereits mehrfach festgestellt.So legen Sie fest, in welcher Reihenfolge S4-Methoden geladen werden sollen, wenn roxygen2 verwendet wird

Sagen Sie zwei Klassen haben, classA und classB in den folgenden Dateien beschrieben classA.R:

#' the class classA 
#' 
#' This is a class A blabla 
#' \section{Slots}{\describe{\item{\code{A}}{a Character}}} 
#' @ name classA 
#' @rdname classA 
#' @exportClass classA 
setClass("classA",representation(A="character")) 

Und classB.R

#' the class classB 
#' 
#' This is a class B blabla 
#' \section{Slots}{\describe{\item{\code{B}}{an object of class A}}} 
#' @ name classB 
#' @rdname classB 
#' @exportClass classB 
setClass("classB",representation(B="classA")) 

ich diese Dateien gläubig geworden waren, in alphabetischer Reihenfolge nach roxygen2 lesen, sondern dass ist nicht der Fall. Wenn ich versuche, um das Paket zu bauen, könnte ich die folgende Fehlermeldung erhalten:

roxygenize("./myExample") 
Error in getClass(Class, where = topenv(parent.frame())) : 
    "ClassA" is not a defined class 

Wie kann ich sicherstellen, dass roxygenize() weiß, in welcher Reihenfolge die Dateien zu lesen, das heißt die Klassendefinition sollte vor den andere gelesen werden?


Hinweis: Ich weiß, dass ich meine eigene Frage beantwortet habe. Das liegt daran, dass ich dieses Problem ziemlich oft angegangen bin und den richtigen Weg gesehen habe, nachdem ich den Code von roxygen2 betrachtet habe. Also zum Nachschlagen, hier sind meine Ergebnisse.

Antwort

10

Es gibt zwei Möglichkeiten, dies zu erreichen:

Wie in ?collate_roclet beschrieben, können Sie den @include-Tag verwenden, um festzulegen, welche Klasse sollte vor dem gelesen werden. In diesem Fall können Sie die Datei classB.r die folgende Zeile direkt vor dem eigentlichen R Code hinzu:

#' @include classA.r 

Diese Tags speziell gelesen werden, das Collate Feld in der DESCRIPTION Datei zu aktualisieren, und die empfohlene Art und Weise des Umgangs mit dem Problem. In einigen Fällen sind die Abhängigkeiten möglicherweise so komplex, dass Sie selbst einen Überblick behalten möchten und sich nicht vollständig auf das Hinzufügen von @include Tags in Ihrer Codebasis verlassen. In diesem Fall können Sie nur geben Sie das Collate Feld am Ende der DESCRIPTION Datei, wie folgt aus:

Package: myExample 
Type: Package 
... 
Collate: 
    'classA.R' 
    'classB.R' 

Die Funktion roxygenize() überprüft zunächst die DESCRIPTION Datei und lädt, was Dateien dort angegeben werden zuerst in der Reihenfolge, wie sie‘ wieder angegeben. Nur dann wird der Rest des Pakets geladen.

+0

Ich glaube, du hast das '@ include' -Tag verpasst ... – hadley

+0

@hadley Wie ich in meiner Frage geschrieben habe, habe ich das' @ include' -Tag versucht, und das hat auch die Hilfedateien zu den verschiedenen Klassen zusammengeführt Nicht meine Absicht). Es funktioniert gut mit dem Feld "Sortieren", aber ich hoffe, dass Sie etwas Zeit und Inspiration finden, um eine elegante Lösung dafür in der nächsten Version von roxygen zu integrieren. –

+0

'@ include' sollte nichts außer der Sortierung ändern. Können Sie ein minimal reproduzierbares Beispiel liefern? – hadley

Verwandte Themen