طريقة 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_))

هذا هو النهج الذي اتبع أشباه الموصلات الحيويةbiobase حزمة ، مع أ mkScalar البناء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top