質問

戻る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:数値、整数、文字などで定義することはできません。

編集 より多くのコンテキストを与えるには:

ここではアトミックが混乱していると思います。 Scalarとは、長さ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インターフェイスの拡張機能です。

編集2

スカラーは長さ1のベクトルであると仮定できますが、S4を使用してこの状態を表現することはできません。 C#またはCで、私は書きます

double[]       // vector
double        // scalar

たぶん、私は自分の関数の名前を変更するだけです。

役に立ちましたか?

解決

1つの可能性は、メソッドディスパッチ後の返品タイプの値を確認することです

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