3

次の例では、他の 2 つの参照クラス オブジェクト (たとえば、2 人のサッカー [フットボール] 選手) の間で参照クラス オブジェクト (たとえば、ボール) への参照を「受け渡し」ようとしています。

# create Reference classes
b <- setRefClass('Ball', fields = list(size = 'numeric'))

    p <- setRefClass('Player', fields = list(name = 'character', possession = 'Ball'), 
methods = list(pass = function(){
        tmp <- possession$copy()
        possession <<- NULL
        return(tmp)
    }, receive = function(newBall){
        possession <<- newBall
} 
))


# initialize pretend all-star team
# p1 gets initial possession of a new ball
p1 <- p$new(name = 'Ronaldinho', possession = b$new(size=5) )

p2 <- p$new(name = 'Beckham')

# now pass the ball from p1 to p2
p2$receive(p1$pass())

ただし、次のエラーが表示されます。

Error in function (value)  : 
  invalid replacement for field ‘possession’, should be from class “Ball” or a subclass (was class “NULL”)

理論的には、ボール オブジェクトへの参照を返してから、その参照を他のプレイヤーに追加しようとしていますが、明らかに機能していません。フィールドに直接アクセスすることで同じ結果を達成できることはわかっていますが、クラスの内部メソッドのみを使用してこの「パス」を達成する方法を見つけたいと思います。これは可能ですか?このエラーが発生するのはなぜですか?

4

1 に答える 1

1

Playerクラスを定義するときにpossessionフィールドに typeを設定すると、エラーが発生する可能性がありますBall。ただし、pass関数では、possessionNULL に設定します。

possession <<- NULL

初期化を次のように変更した場合:

p = setRefClass('Player', fields = list(name = 'character', possession = 'ANY')

その後、すべてが期待どおりに機能します。

R> p2$receive(p1$pass())
R> p1
Reference class object of class "Player"
Field "name":
[1] "Ronaldinho"
Field "possession":
NULL
R> p2
Reference class object of class "Player"
Field "name":
[1] "Beckham"
Field "possession":
Reference class object of class "Ball"
Field "size":
[1] 5
于 2013-02-25T09:17:41.820 に答える