baz()
クラスインスタンスで呼び出す必要があることを指定する必要があります.self
。
myClassGen <- setRefClass("myClass",methods = list(foo = function() .self$baz()))
myClassGen$methods(baz = function() "baz")
myObj <- myClassGen()
myObj$foo()
# [1] "baz"
したがって、次のコードが機能しないため、クラス ジェネレーターの名前がクラス名と異なることとは関係ありません (欠落している に注意してください.self
)。
myClass <- setRefClass("myClass", methods = list(foo = function() baz()))
myClass$methods(baz = function() "baz")
myObj <- myClass()
myObj$foo()
# Error in myObj$foo() : could not find function "baz"
参照クラスに関する公式ドキュメントはこちらです。
編集(コメントによる):
$methods(...)
関数に関するセクションのドキュメントには、次のように記載されています。
新しいメソッドは、現在定義されている任意のメソッドを名前で参照できます ($methods( へのこの呼び出しで提供される他のメソッドを含む)。ただし、以前に定義されたメソッドは再分析されないことに注意してください。つまり、新しいメソッドは呼び出されません (再定義しない限り)。同じ名前の既存のメソッド)。
私が正しく理解している場合、これは、新しく追加されたメソッドbaz
を以前に定義されたメソッドで呼び出すことができないことを意味しfoo
ます。もしそうなら、なぜ.self$foo()
うまくいくのですか?
よくわかりませんが、上記のテキストで言及されている方法の分析に関係していると思います。
おそらく、定義されたメソッドsetRefClass
が解析され、別のクラスメソッドへの呼び出しが見つかった場合、その呼び出しは何らかの方法でそのクラスメソッドに明示的にリンクされ、同じ名前を持つ既存の関数との混乱を避けることができます (単純化しすぎて、これらの呼び出しがの接頭辞が付いてい.self$
ます)。
代わりに、へのメソッド呼び出し.self$something()
は既に明示的であるため、変更されません。
これは、次のテストによって合理的にサポートされているようです。たとえば、次のコードを実行すると:
myClassGen <- setRefClass("myClass", methods = list(foo = function() baz(),
baz = function() "baz"))
myObj <- myClassGen()
myObj$foo
我々が得る:
Class method definition for method foo()
function ()
baz()
<environment: 0x000000000e490938>
Methods used:
"baz"
baz
クラスメソッドがメソッドによって使用されていることを示す最後の行に注意してくださいfoo
。
代わりにこれを実行すると:
myClassGen <- setRefClass("myClass",methods = list(foo = function() .self$baz(),
baz = function() "baz"))
myObj <- myClassGen()
myObj$foo
我々が得る:
Class method definition for method foo()
function ()
.self$baz()
<environment: 0x00000000107ab5c8>
class method については言及されていませんbaz
。