2013-02-23 52 views
3

我想「傳遞」兩個其他引用類對象(如兩個足球之間的引用類對象[足球]玩家)用下面的例子:在兩個其他引用類對象之間傳遞引用類對象(足球示例)

# 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」) 

理論上我想retutn球對象的引用,然後添加引用另一名球員,但顯然這是行不通的。我知道可以通過直接訪問字段來獲得相同的結果,但是我想找到一種方法來僅使用類的內部方法來完成此「傳遞」。這可能嗎?爲什麼我得到這個錯誤?

+0

請編輯您的問題。 S3,S4或Reference Classes的作者都不是像你在這裏用於後者的術語。這個詞已經足夠傳播了,讓我們阻止它。他們被稱爲「參考類」。 – 2013-02-23 23:46:46

+0

我不知道這些類的名稱存在爭議。我從以下非常有用的介紹中推導出這個術語:[hadley's R5 wiki](https://github.com/hadley/devtools/wiki/R5)。如果這不是正確的術語,很樂意改變它。 – 2013-02-23 23:48:31

+0

我一直在倚靠哈德利,並沒有進一步宣傳這個術語。他開始走了。 – 2013-02-23 23:49:29

回答

1

您可能會遇到錯誤,因爲當您定義Player類時,將possession字段設置爲Ball。但在你pass功能,可以設置possession爲NULL:

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 
+0

這個很好,謝謝!沒有意識到一個類型變量不能接受'NULL'。很高興知道! – 2013-02-25 17:44:09