2

参照クラスについて質問があります。フィールドの割り当てを確認するにはどうすればよいですか。

ここに私のサンプルコードがあります:

rm(list=ls(all=TRUE))

setRefClass(
    Class = "A", 
    fields = list(firstValue = "numeric"),
    methods = list(

        initialize = function(..., firstValue = numeric()) {
            setFirstValue(firstValue)
        },

        getFirstValue = function() {
            return(firstValue)
        },

        setFirstValue = function(value) {
            if(length(value) != 0) {
                if(value > 10) {
                    cat("only values lower 10 allowed!\n")
                    firstValue <<- 10
                } else {
                    firstValue <<- value
                }
            } else {
                firstValue <<- 0
            }
        }               
    )
)

test <- getRefClass("A")$new()
test$getFirstValue()
test$firstValue
test$setFirstValue(11)
test$firstValue
test$firstValue <- 11
test$firstValue

私の問題は、「test $ firstValue<-11」が値をチェックせずに設定されていることをどのように防ぐことができるかということです。S4では、次のように解決します。

setGeneric(name = 'setFirstValue<-', def = function(object, value) {standardGeneric('setFirstValue<-')})
setReplaceMethod(
        f = 'setFirstValue',
        signature = 'A',
        definition = function(object, value) {
            object@.firstValue <- value
            validObject(object)
            return(object)
        }
)

and

setReplaceMethod(
    f = "[",
    signature = "A",
    definition = function(x, i ,j , value) {
        if(i == 'firstValue ' || i == 1) {setFirstValue(x) <- value}
    return(x)
    }
)

最後に、「A」のクラス定義に「validity = function(object){ ... }」が配置されます。しかし、参照クラスを使用してこれを解決するにはどうすればよいですか?

手伝ってくれてありがとう。

4

1 に答える 1

1

setValidityへの明示的な呼び出しはvalidObject、参照クラスでも使用できます。

A <- setRefClass("A", fields=list(x="numeric"))

setValidity("A", function(object) {
    if (length(object$x) != 1L || !all(object$x < 11))
        "'x' must be length 1 and < 11"
    else NULL
})

その後

> a = A(x=11)
> validObject(a)
Error in validObject(a) : 
  invalid class "A" object: 'x' must be length 1 and < 11

ただし、いくつかの点で、フィールドへの直接アクセスはスロットへの直接アクセスと同じです

B <- setClass("B", representation(x="numeric"))

setValidity("B", function(object) {
    if (length(object@x) != 1L || !all(object@x < 11))
        "'x' must be length 1 and < 11"
    else NULL
})

> b = B()
> b@x = 11       # no validObject check, just like direct field assignment
> validObject(b)
Error in validObject(b) : 
  invalid class "B" object: 'x' must be length 1 and < 11

したがって、定義したアクセサーを使用するプログラミング規律として、 は、test$setFirstValue(11)追加の有効条件を課すための最良のアプローチのようです。

S4 クラスには R の通常のセマンティクス (変更時のコピーの外観) がありますが、参照クラスには参照セマンティクスがあります。これが主な違いであり、使用する適切なクラス システムを決定する原動力となりますが、パフォーマンスの違いもあります。

于 2013-03-15T17:57:35.790 に答える