我目前正在使用參考類編寫一個包。我所遇到 一個問題,從閱讀各種來源:參考類,選項卡完成和強制方法定義
Method initialisation in R reference classes
Can't reliably use RefClass methods in Snowfall
我收集的造成的,因爲參考方法是不是所有複製到每個類中的對象 相反,它們是第一次訪問時複製。
https://stat.ethz.ch/pipermail/r-devel/2011-June/061261.html
作爲示例定義:
test <- setRefClass("TEST",
fields = list(a = "numeric"),
methods = list(
addone = function(){
a <<- a+1
},
initialize = function(){
a <<- 1
}
)
)
example <- test$new()
所以例如是TEST
類的新對象。鍵入example$
並在 控制檯的互聯提供了
> example$
# example$.->a example$.refClassDef example$.self
# example$a example$initialize
所以這種方法addone
沒有提出作爲一個選項。它是提供給然而 電話:
example$addone()
現在的互聯又透着
# >
# > example
# Reference class object of class "TEST"
# Field "a":
# [1] 2
# > example$
# example$.->a example$.refClassDef example$.self
# example$a example$addone example$field
# example$initialize example$show
所以現在addone
和field
和show
都作爲選項。
Martin Morgan建議在上述鏈接之一中強制定義方法。這 作品以及
test <- setRefClass("TEST",
fields = list(a = "numeric"),
methods = list(
addone = function(){
a <<- a+1
},
initialize = function(){
a <<- 1
.self$addone #force definition
}
)
)
example <- test$new()
所以現在黏合給出:
# > example$
# example$.->a example$.refClassDef example$.self
# example$a example$addone example$initialize
我的一些類的有30的方法,所以我想這樣做,因爲succintly越好。 我已經定義:
test <- setRefClass("TEST",
fields = list(a = "numeric"),
methods = list(
addone = function(){
a <<- a+1
},
initialize = function(){
a <<- 1
eval(parse(text=paste0('.self$',ls([email protected]))))
}
)
)
example <- test$new()
的互聯現在給:
# > example$
# example$.->a example$.refClassDef example$.self
# example$a example$addone example$callSuper
# example$copy example$export example$field
# example$getClass example$getRefClass example$import
# example$initFields example$initialize example$show
# example$trace example$untrace
雖然這工作感覺有點笨拙。此外使用[email protected]
而不是getRefClass("TEST")[email protected]
,因此 感覺有點不對。有沒有人以前處理過這個問題。
有沒有更好的方法來解決問題?感謝您提出任何建議和道歉,如果這個問題太過分了。
謝謝你,這是非常有幫助的,比我的解決方案更優雅。我也不知道它被稱爲製表符完成。知道這個術語使我能夠在utils中找到相關的軟件包。使用引用類完成Tab完成是我的目標,我將編輯問題標題以更好地反映此問題。 – jdharrison
這看起來很有希望。將'.DollarNames.envRefClass < - function(x,pattern)grep(pattern,getRefClass(class(x))$ methods(),value = TRUE)'添加到我的包中是不是一個好主意? – jdharrison
是的,這將是一個壞主意 - 你會改變所有參考類的行爲,而不僅僅是你自己的行爲。也許有些人喜歡它是當前的行爲,也許''方法'將在未來某個時候實現一個超級傻瓜'.DollarNames.envRefClass',然後你長久以來被遺忘的方法將覆蓋這個。要做的正確的事情就是將它作爲功能請求提交給R-devel,特別是現在至少有一個工作原型可以說明您認爲合適的行爲。 –