2016-07-19 9 views
5

Я ищу эквивалент ключевого слова «self» python или ключевое слово java этого «this» в R. В следующем примере я делаю объект S4 из метода другой объект 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 
    } 
) 
) 

Я могу сделать это с отдельно стоящем методом, но я надеялся на хороший объектно-ориентированном способ сделать эту операцию в R. Благодаря

+0

Это 'ссылка на класс' (? '' ReferenceClasses' или setRefClass'), а не S4 класс сам по себе ('Classes','? Methods'). Из? ReferenceClasses, см. '.self'. –

ответ

4

Reference класс (RC) объекты в основном S4 объекты, которые обертывают окружающая среда. Окружение содержит поля объекта 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

 Смежные вопросы

  • Нет связанных вопросов^_^