0

クラス ジェネレーターにクラス自体に別の名前を付けると (これには正当な理由があります)、問題が発生し始めました。

myClassGen <- setRefClass("myClass",
    methods = list(foo = function() baz())
)
myClassGen$methods(baz = function() "baz")

myObj <- myClassGen()
myObj$foo()

をもたらしました:

Error in myObj$foo() : could not find function "baz"

baz私ができるので、まだ方法は明らかに存在します:

> myObj$baz
Class method definition for method baz()
function () 
"baz"
<environment: 0x000000002c60f0b8>

ジェネレーター名を に変更すると、上記のエラーは発生しませんmyClass

この動作が仕様によるものである場合、その理由は何ですか? これがバグである場合、どうすればこの問題を修正できますか? ジェネレーターとクラスの名前が異なることに起因する別の隠れた問題はありますか?

4

1 に答える 1

3

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

于 2014-01-17T08:31:01.750 に答える