2016-07-19 3 views
5

Je cherche l'équivalent du mot-clé 'self' de python ou du mot-clé 'this' de java dans R. Dans l'exemple suivant, je crée un objet S4 à partir d'une méthode de un objet S4 différent et j'ai besoin de passer un pointeur sur moi-même. Y at-il quelque chose dans la langue pour m'aider à faire cela?L'équivalent de 'this' ou 'self' dans 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 
    } 
) 
) 

Je peux le faire avec une méthode autoportant mais j'espérais une manière orientée objet agréable de faire cette opération dans l'affaire R. Merci

+0

Ceci est une 'classe de référence' (? '' ReferenceClasses' ou setRefClass') plutôt que la classe S4 en soi ('Classes','? Méthodes »). De? ReferenceClasses, voir '.self'. –

Répondre

4

objets de classe de référence (RC) sont essentiellement S4 objets qui enveloppent un environnement. L'environnement contient les champs de l'objet RC et est défini comme l'environnement englobant de ses méthodes; C'est ainsi que les références non qualifiées aux identificateurs de champs se lient aux champs de l'instance. J'ai été capable de trouver un objet .self assis dans l'environnement que je crois être exactement ce que vous cherchez.

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) 

La solution est donc:

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

c'est génial! Merci – jamesatha