私は現在、参照クラスを使用してパッケージを作成しています。私はさまざまな情報源を読んだことから問題に遭遇しました:
SnowfallでRefClassメソッドを確実に使用できない
私が収集するのは、参照メソッドがクラス内のすべてのオブジェクトにすべてコピーされるのではなく、最初にアクセスされたときにコピーされるためです。
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は、上記のリンクの1つでメソッドの定義を強制することをお勧めします。これはうまくいきます
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以上のメソッドを持っているので、これをできるだけ簡潔にしたいと思います。私は定義しました:
test <- setRefClass("TEST",
fields = list( a = "numeric"),
methods = list(
addone = function(){
a <<- a+1
},
initialize = function(){
a <<- 1
eval(parse(text=paste0('.self$',ls(test$def@refMethods))))
}
)
)
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
これは機能しますが、少し不器用に感じます。また、それは少し間違っていると感じるようにではtest$def@refMethods
なく使用されます。getRefClass("TEST")$def@refMethods
誰かが以前にこの問題に対処したことがあります。
解決策にアプローチするためのより良い方法はありますか?質問が過度に引き出された場合は、アドバイスと謝罪に感謝します。