Эквивалент «это» или «я» в R

Я ищу эквивалент ключевого слова python «self» или ключевого слова java «this» в R. В следующем примере я создаю объект S4 из метода другого объекта S4, и мне нужно передать указатель на себя. Есть ли что-то в языке, чтобы помочь мне сделать это?

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. Спасибо.


person jamesatha    schedule 19.07.2016    source источник
comment
Это «эталонный класс» (?ReferenceClasses или ?setRefClass), а не класс S4 как таковой (?Classes, ?Methods). Из ?ReferenceClasses см. .self.   -  person Martin Morgan    schedule 19.07.2016


Ответы (1)


Объекты эталонного класса (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)
        }
    )
)
person bgoldst    schedule 19.07.2016