Question

Je veux définir une méthode S4 qui renvoie un valeur de retour scalaire. Ici, je veux dire par valeur scalaire, contraire d'un vecteur.

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 ?
)

Je ne peux pas remplacer la méthode par sa sortie, je veux dire que je ne peux pas définir de nombreuses fonctions ayant la même signature avec un retour de retour différent: numérique, entier, caractère, .. alors comment puis-je faire cela?

ÉDITER Pour donner plus de contexte:

Je pense que l'atomique est confuse ici. Je veux dire par scalaire une valeur numérique ou un booléen ou un caractère, de longueur. Pour donner plus de contexte, j'aurai 3 fonctions dans mon package:

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

Il s'agit d'une extension à l'interface DBI.

Edit2

Nous pouvons supposer que Scalar est un vecteur de longueur 1. mais je ne peux pas exprimer cette condition en utilisant S4. En C # ou C, j'écrirais

double[]       // vector
double        // scalar

Peut-être que je devrais simplement changer le nom de ma fonction.

Était-ce utile?

La solution

Une possibilité consiste à vérifier la valeur du type de retour après la répartition de la méthode

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)

Une autre possibilité consiste à définir une classe «scalaire», avec une vérification de validité sur la classe de base qui applique la contrainte

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

ou contrôler les types scalaires plus fortement avec une petite hiérarchie basée sur une classe virtuelle

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_))

C'est l'approche adoptée Bioconducteur's Biobase package, avec un mkScalar constructeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top