Метод S4 со скалярным (не векторным) возвращающимся значением

StackOverflow https://stackoverflow.com/questions/19847842

  •  29-07-2022
  •  | 
  •  

Вопрос

Я хочу определить метод S4, который возвращает Скалярное возвратное значение. Анкет Здесь я имею в виду под скалярным значением, противоположным вектору.

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

Я не могу переопределить метод по его выводу, я имею в виду, что я не могу определить много функций, имеющих одинаковую подпись с другой возвращаемой оценкой: числовое, целое число, символ, .. так как я могу это сделать?

РЕДАКТИРОВАТЬ Чтобы дать больше контекста:

Я думаю, что это атомно сбивает с толку. Я имею в виду под скалярным числовым значением или логическим или символом, длиной. Чтобы дать больше контекста, у меня будет 3 функции в моем пакете:

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

Это расширение на интерфейс DBI.

Edit2

Мы можем предположить, что скаляр - это вектор длины 1. Но я не могу выразить это условие, используя S4. В C# или C я бы написал

double[]       // vector
double        // scalar

Может быть, я должен просто изменить имя моей функции.

Это было полезно?

Решение

Одна возможность состоит в том, чтобы проверить значение типа возврата после отправки метода

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)

Другая возможность - определить «скалярное» класс с проверкой достоверности в базовом классе, которая обеспечивает соблюдение ограничения

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

или контроль скалярных типов более сильно с помощью небольшой иерархии, основанной на виртуальном классе

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

Это подход, принятый в БиоконкурторS. Биобаза упаковка, с mkScalar конструктор.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top