2016-07-19 16 views
5

Tôi đang tìm kiếm tương đương với từ khóa 'self' của python hoặc từ khóa 'this' của java trong R. Trong ví dụ sau, tôi tạo đối tượng S4 từ một phương thức một đối tượng S4 khác và cần phải truyền con trỏ cho chính tôi. Có điều gì đó trong ngôn ngữ để giúp tôi làm điều này?Tương đương với 'này' hoặc 'tự' trong 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 
    } 
) 
) 

tôi có thể làm điều này với một phương pháp freestanding nhưng tôi đã hy vọng một cách hướng đối tượng tốt đẹp của thực hiện thao tác này trong R. Nhờ

+0

Đây là một 'lớp tham khảo' (? 'ReferenceClasses' hoặc 'setRefClass') chứ không phải S4 lớp cho mỗi gia nhập (' Classes', '? Phương thức'). Từ ReferenceClasses, xem '.self'. –

Trả lời

4

lớp Reference (RC) đối tượng cơ bản S4 đối tượng bọc mà môi trường. Môi trường giữ các trường của đối tượng RC và được đặt làm môi trường kèm theo của các phương thức của nó; đó là cách các tham chiếu không đủ tiêu chuẩn cho các định danh trường gắn với các trường của cá thể. Tôi đã có thể tìm thấy một đối tượng .self ngồi trong môi trường mà tôi tin là chính xác những gì bạn đang tìm kiếm.

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) 

Vì vậy, giải pháp là:

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

điều này thật tuyệt! cảm ơn – jamesatha

Các vấn đề liên quan