2017-10-27 3 views
2

Ich habe Code geschrieben, der sehr einfach eine S3-Klasse für ein Paket erstellt. Ich versuche, eine neue S3-Klasse zu erstellen, so dass ich z. B. benutzerdefinierte print() Methoden entwickeln kann.S3-Klasse in einem R-Paket erstellen

Ich habe den Code in einem einfachen R-Skript getestet, aber sobald die Funktion in ein Paket verpackt wird, bricht die Funktionalität und die S3-Klasse wird nicht mehr erstellt. Ich kann keinen reproduzierbaren Code für die Erstellung des Pakets bereitstellen, aber eine vereinfachte Version der Funktion, die ich in dem Paket erstellen möchte, wird unten eingeführt.

Mein Code funktioniert perfekt, wenn er entweder roh oder innerhalb einer Funktion geschrieben wird.

x <- 1:10 
    class(x) 
    class(x) <- append(class(x),"newS3class") 

class(x) wird c("integer", "newS3class")

Ebenso zurückkehren, jetzt erklärt, eine Funktion, die das Gleiche tut. Das funktioniert auch gut. In Wirklichkeit führt meine Funktion foo() zuerst eine Aktion an der Eingabe aus und gibt dann die Ausgabe mit einer neuen Klasse zurück.

foo <- function(y) { 
     y <- y + 3 
     class(y) <- append(class(y), "newS3class") 
     y 
    } 

class(1:5) kehrt "integer". class(foo(1:5)) gibt c("integer", "newS3class") zurück. Dies ist wie erwartet.

Aber wenn ich ein Paket z. B. mypkg entwickeln und dann mypkg::foo() ausführen, ist die Funktionalität unterbrochen. Ie., (mypkg::foo(1:5)) gibt "Integer" anstelle von c("integer", "newS3class") zurück.

Ist etwas in Bezug auf das Scoping passiert, das den Aufbau des Pakets aus seinen einzelnen Funktionen verhindert, was verhindert, dass dies funktioniert?

+0

haben Sie das Paket auf GitHub – rawr

+0

ich nicht; vielleicht dieses Wochenende – Locutus

Antwort

0

Der Fehler, den ich hier gemacht habe, war, dass ich die Klasse nicht ordnungsgemäß exportiert habe. Um dies zu beheben, habe ich den folgenden Codeblock hinzugefügt, einschließlich der Export-Zeile, bevor ich das roxygen-Paket verwende, um meine Dokumentation und NAMESPACE zu erstellen.

#' @export summary.objectclass 
makeobjectclass <- function(x) { 
    class(x) <- c("objectclass", class(x)) 
    x 
} 
Verwandte Themen