[R] Difficulties with R.oo (static fields, etc.)
Henrik Bengtsson
hb at maths.lth.se
Mon Oct 27 08:22:56 CET 2003
This is not really an rhelp question. I'll get back to you later today
with answers related to R.oo.
Henrik Bengtsson
The R.oo author
> -----Original Message-----
> From: r-help-bounces at stat.math.ethz.ch
> [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of
> Gabriel Baud-Bovy
> Sent: den 27 oktober 2003 01:56
> To: r-help at stat.math.ethz.ch
> Subject: [R] Difficulties with R.oo (static fields, etc.)
>
>
> I would like to use R.oo and tcltk to implement a Turtle
> World. I have
> encountered
> many problems because:
>
> 1) I am not sure how to implement static fields with R.oo
> 2) I am not sure how to implement a constructor that would
> call a function only for the first instance of a class (i.e., to
> initialize
> value of static fields only once)
> 3) I am not sure how to remove/delete cleanly existing instances. In
> particular,
> I don't know how to reset tcktk when the last instance
> is deleted.
>
> Here is the sort of behavior I would like to get:
>
> t1<-TurtleBasic() # a window (the Turtle world) with a
> turtle appears
> forward(t1,50) # the turtle moves (turtle's state is
> also updated)
> turn(t1,pi/2)
> forward(t1,50)
> t2<-TurtleBasic() # a second turtle in the Turtle world appears
> turn(t2,pi/2) # second turtle moves
> forward(t1,50)
> delete(t1) # first turtle disappears
> delete(t2) # second turtle and the world disappears
>
> If possible, I would like to keep this syntax. In fact, I am
> using R.oo to create mutable objects so as to avoid syntax
> like tu<-forward(tu,10) which would be more typical of a
> functional language like R. From the doc/help
> files of R.oo,
> I believe that one could do it but I don't find many examples
> to guide me.
>
> I pasted my current code with comments below. Thank you for your help.
>
> Gabriel Baud-Bovy
>
> #-------------------------------------------------------------
> --------------------------------------------------------
>
> Description of Turtle Basic Class:
>
> private fields:
> .x, .y, .a (turtle position and heading)
> .turtle: ID of canvas item representing turtle
> static fields:
> .canvas: tcltk canvas widget
> .top: tcktk toplevel widget
> methods:
> TurtleBasic: constructor
> plot: display turtle in Turtle World
> forward, turn: move turtle
> delete: delete turtle (not implemented)
>
> Note: My current code is very buggy:
> - Can't see turtle movements
> - Does not define method to delete turtles
> - I get an tcltk error when I try to recreate a turtle
> world after having
> tried to destroy it
> (for the moment, I need to detach tcltk to reset it)
>
> #-------------------------------------------------------------
> --------------------------------------------------------
>
> library("R.oo")
>
> setConstructorS3("TurtleBasic",function() {
> new<-extend(Object(),"TurtleBasic",.x=100,.y=100,.a=0,.turtle=NA)
> ## Create a new Turtle World if necessary
> require(tcltk) || stop("tcl/ library not available")
> if(!is.tkwin(new$.canvas)) { # check to see if it is first
> instance or not
> cat("Create Turtle World\n")
> top <- tktoplevel()
> tktitle(top) <- "Turtle World"
> canvas <- tkcanvas(top, relief="raised", width=200, height=200)
> tkpack(canvas, side="top", fill="both",expand="1")
> new$.canvas<-canvas # store
> canvas widget in static field
> new$.top<-top
> }
> plot.TurtleBasic(new)
> # plot Turtle
> new
> })
>
> setMethodS3("plot","TurtleBasic",function(turtle) {
> ## delete old item (if it exists)
> if(is.tkwin(turtle$.canvas) && is.tclObj(turtle$.turtle))
> tkdelete(turtle$.canvas,turtle$.turtle)
> ## a new canvas item representing the turtle is created
> ## (note: it's necessary to make new item because
> turtle's heading can
> change)
> x <- c(-10,10)
> y <- c(-10,10)
> aux<- cos(turtle$.a)*x+sin(turtle$.a)*y + turtle$.x
> y <- -sin(turtle$.a)*x+cos(turtle$.a)*y + turtle$.y
> x <- aux
> turtle$.turtle <- tkcreate(turtle$.canvas, "line",
> x[1],-y[1],x[2],-y[2],width=1)
> })
>
> setMethodS3("forward","TurtleBasic",function(turtle,length){
> aux <- turtle$.x + length*cos(turtle$.a)
> turtle$.y <- turtle$.y + length*sin(turtle$.a)
> turtle$.x <- aux
> plot(turtle)
> })
>
> setMethodS3("turn","TurtleBasic",function(turtle,angle){
> turtle$.a<-turtle$.a+angle
> plot(turtle)
> })
>
>
> if(0) {
>
> t1<-TurtleBasic() # a window (the Turtle world) with a turtle appears
> forward(t1,50)
> turn(t1,pi/2)
> forward(t1,50)
> t2<-TurtleBasic() # a second turtle in the Turtle world
> turn(t2,pi/2)
>
> # manually destroy first turtle (would be great to define
> some sort of
> method for it)
> tkdelete(t1$.canvas,t1$.turtle)
> rm(t1)
> # destroy second turtle and world
> tkdelete(t2$.canvas,t2$.turtle)
> tkdestroy(t2$.top)
> rm(t2)
>
> }
> --------------------------------------------------------------------
> Gabriel Baud-Bovy
> Assistant Professor
> UHSR University
> via Olgettina, 58 tel: (+39) 02 2643 4839
> 20132 Milan, Italy fax: (+39) 02 2643 4892
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://www.stat.math.ethz.ch/mailma> n/listinfo/r-help
>
>
More information about the R-help
mailing list