2016-07-19 8 views
5

pythonの 'self'キーワードまたはjavaの 'this'キーワードと同等のRを探しています。次の例では、別のS4オブジェクトと自分自身へのポインタを渡す必要があります。私がこれをするのを助ける何かが言語の中にありますか?'this'または 'self'と同等のものR

MyPrinter <- setRefClass("MyPrinter", 
    fields = list(obj= "MyObject"), 
    methods = list(
    prettyPrint = function() { 
     print(obj$age) 
     # do more stuff 
    } 
) 
) 

MyObject <- setRefClass("MyObject", 
    fields = list(name = "character", age = "numeric"), 
    methods = list(
    getPrinter = function() { 
     MyPrinter$new(obj=WHAT_GOES_HERE) #<--- THIS LINE 
    } 
) 
) 

私は自立した方法でこれを行うことができますが、私はS4はそのラップオブジェクト

+0

これは '参照クラス' である(? 'ReferenceClasses'または' setRefClass')よりもむしろS4クラスそれ自体( 'Classes'、'?方法 ')。 ?ReferenceClassesから、 '.self'を参照してください。 –

答えて

4

リファレンスクラス(RC)のオブジェクトは基本的にR.のおかげでこの操作を行うための素敵なオブジェクト指向の方法を期待していました環境。環境はRCオブジェクトのフィールドを保持し、そのメソッドの包囲環境として設定されます。フィールド識別子への非修飾参照がインスタンスのフィールドにバインドする方法です。私は.selfオブジェクトがあなたが探しているものと正確に信じている環境に座っているのを見つけることができました。

x <- MyObject$new(); ## make a new RC object from the generator 
x; ## how the RC object prints itself 
## Reference class object of class "MyObject" 
## Field "name": 
## character(0) 
## Field "age": 
## numeric(0) 
is(x,'refClass'); ## it's an RC object 
## [1] TRUE 
isS4(x); ## it's also an S4 object; the RC OOP system is built on top of S4 
## [1] TRUE 
slotNames(x); ## only one S4 slot 
## [1] ".xData" 
[email protected]; ## it's an environment 
## <environment: 0x602c0e3b0> 
environment(x$getPrinter); ## the RC object environment is set as the closure of its methods 
## <environment: 0x602c0e3b0> 
ls([email protected],all.names=T); ## list its names; require all.names=T to get dot-prefixed names 
## [1] ".->age"  ".->name"  ".refClassDef" ".self"  "age"   "field" 
## [7] "getClass"  "name"   "show" 
[email protected]$.self; ## .self pseudo-field points back to the self object 
## Reference class object of class "MyObject" 
## Field "name": 
## character(0) 
## Field "age": 
## numeric(0) 

そこで溶液は:

MyObject <- setRefClass("MyObject", 
    fields = list(name = "character", age = "numeric"), 
    methods = list(
     getPrinter = function() { 
      MyPrinter$new(obj=.self) 
     } 
    ) 
) 
+0

これは素晴らしいです!ありがとう – jamesatha

関連する問題