我想定义一个返回标量返回值的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 ?
)
我不能通过它的输出覆盖方法,我的意思是我不能定义许多具有相同签名的函数,返回valueClass:numeric,integer,character,.. 那我该怎么做呢?
编辑以提供更多背景信息:
我认为原子在这里令人困惑。我的意思是通过标量数字值或布尔或字符,长度为1。为了给出更多的上下文,我的包中将有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
也许我应该改变我的功能名称。
答案 0 :(得分:2)
一种可能性是在方法调度后检查返回类型的值
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)
另一种可能性是定义一个&#39; Scalar&#39; class,对强制执行约束的基类进行有效性检查
.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_))
这是Bioconductor的Biobase包中采用mkScalar
构造函数的方法。