Frage

Ich möchte eine S4 -Methode definieren, die a zurückgibt Skalarrückgabewert. Hier meine ich mit skalarem Wert das Gegenteil eines Vektors.

setGeneric("getScalar", function(value,  ...) 
  standardGeneric("getScalar")
)
setMethod("getScalar", 
          signature(value = "ANY"),
          def = function(value, ...) getScalar(value,...), ## call external function
          valueClass = "atomic" ### atomic is false, what should I do ?
)

Ich kann die Methode mit ihrer Ausgabe nicht überschreiben, ich meine, ich kann viele Funktionen nicht definieren, die die gleiche Signatur mit einer anderen Rückgabe -Wertschätzung haben: numerisch, ganzzahlig, charakter, .. wie kann ich das tun?

BEARBEITEN Um mehr Kontext zu geben:

Ich denke, Atomic ist hier verwirrend. Ich meine mit skalarem numerischen Wert oder einem Booleschen oder einem Charakter von Länge. Um mehr Kontext zu geben, werde ich 3 Funktionen in meinem Paket haben:

dbGetQuery   :return a list/data.frame : i.e some table rows
dbGetScalar  :return a scalar value  : i.e count(*),table_name,..
dbGetNoQuery :return nothing          : update/insert actions

Es ist eine Erweiterung der DBI -Schnittstelle.

Edit2

Wir können annehmen, dass Scalar ein Vektor von Länge 1 ist. Aber ich kann diesen Zustand nicht mit S4 ausdrücken. In C# oder C würde ich schreiben

double[]       // vector
double        // scalar

Vielleicht sollte ich einfach den Namen meiner Funktion ändern.

War es hilfreich?

Lösung

Eine Möglichkeit besteht darin, den Wert des Rücksendertyps nach Methodenversand zu überprüfen

setGeneric("getScalar", function(x, ...) {
    value <- standardGeneric("getScalar")
    if (!is.atomic(value) || length(value) != 1L)
        stop("not a scalar atomic vector")
    value
})

setMethod(getScalar, "ANY", function(x, ...) x)

Eine andere Möglichkeit besteht darin, eine Skalarklasse mit einer Gültigkeitsprüfung auf die Basisklasse zu definieren, die die Einschränkung erzwingt

.Scalar <- setClass("Scalar", contains="ANY", validity=function(object) {
    if (length(object) != 1L)
        "non-scalar object"
    else TRUE
}, prototype=NA)

oder steuern Skalartypen stärker mit einer kleinen Hierarchie, die auf einer virtuellen Klasse basiert

setClass("Scalar", validity=function(object) {
    if (length(object) != 1L)
        "non-scalar object"
    else TRUE
})

.ScalarInteger <- setClass("ScalarInteger",
    contains=c("Scalar", "integer"),
    prototype=prototype(NA_integer_))

Dies ist der Ansatz in Biokonduktor's Biobase Paket mit a mkScalar Konstrukteur.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top