2016-07-19 13 views
5

Ich suche nach dem Äquivalent von Pythons 'self' Schlüsselwort oder Javas 'this' Schlüsselwort in R. Im folgenden Beispiel mache ich ein S4 Objekt aus einer Methode von ein anderes S4-Objekt und muss einen Zeiger auf mich selbst übergeben. Gibt es etwas in der Sprache, das mir dabei helfen könnte?Das Äquivalent von 'this' oder 'self' in 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 
    } 
) 
) 

Ich kann mit einem freistehenden Methode tun dies, aber ich hatte gehofft, für eine nette objektorientierte Art und Weise diesen Vorgang zu tun, in R. Dank

+0

Dies ist eine 'Referenzklasse' (? 'ReferenceClasses' oder' setRefClass') statt S4 Klasse per se ('Classes','? Methoden "). Von? ReferenceClasses, siehe '.self'. –

Antwort

4

Referenzklasse (RC) Objekte sind im Grunde Objekte S4, dass die Wickel eine Umgebung. Die Umgebung enthält die Felder des RC-Objekts und wird als umschließende Umgebung ihrer Methoden festgelegt. So binden sich unqualifizierte Referenzen auf die Feldbezeichner an die Felder der Instanz. Ich konnte ein .self Objekt finden, das in der Umgebung sitzt, von der ich glaube, dass sie genau das ist, wonach Sie suchen.

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) 

So ist die Lösung:

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

das ist großartig! Vielen Dank – jamesatha