आर

2016-07-19 4 views
5

में 'इस' या 'स्वयं' के समकक्ष मैं पाइथन के 'स्वयं' कीवर्ड या जावा में 'यह' कीवर्ड के समतुल्य के लिए देख रहा हूं। निम्नलिखित उदाहरण में मैं एक विधि से एस 4 ऑब्जेक्ट बना रहा हूं एक अलग एस 4 ऑब्जेक्ट और मुझे पॉइंटर पास करने की आवश्यकता है। क्या ऐसा करने में मेरी मदद करने के लिए भाषा में कुछ है?आर

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 
    } 
) 
) 

मैं एक फ्रीस्टैंडिंग विधि के साथ ऐसा कर सकते हैं, लेकिन मैं में आर धन्यवाद यह कार्रवाई करते का एक अच्छा वस्तु उन्मुख रास्ता

+0

यह एक 'संदर्भ क्लास' है (? 'ReferenceClasses' या' setRefClass') के बजाय एस 4 वर्ग से प्रति ('Classes','? Methods')। संदर्भ क्लासेस से, 'स्वयं' देखें। –

उत्तर

4

संदर्भ वर्ग (आरसी) वस्तुओं मूल रूप से कर रहे हैं के लिए उम्मीद कर रही थी कि एस 4 रैप वस्तुओं पर्यावरण। पर्यावरण आरसी ऑब्जेक्ट के क्षेत्र रखता है, और इसकी विधियों के संलग्न वातावरण के रूप में सेट किया जाता है; इस प्रकार फ़ील्ड आइडेंटिफायर के अयोग्य संदर्भ उदाहरण के फ़ील्ड से जुड़ते हैं। मैं पर्यावरण में बैठे .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