No subject

Peter Wolf
2000-09-28T19:05:14Z

Prasad wrote:

> I wrote a function in R which uses tcltk package .... essentially I wanted
> to give within that function, a widget with 2 radiobuttons to choose
> between plotting Precip and Temperature plots. After the user has chosen
> one of the radiobuttons there is another widget that asking him to identify
> outliers. However, I am having a lot of problems...what R does is evaluate
> the whole function without pausing...if I introduce a while() loop as I
> have in the example below, R does nothing until I hit cntrl-c upon which it
> shows the widget and comes out of the function......I could use a while
> loop in S-PLUS using the dialog.create() dialog.display() functions, but I
> cannot seem to implement that functionality in R.....what am I doing wrong?
> I enclose below the sample function...Any help will be greatly
> appreciated....
>
> "tcltktst" <-
+ function(x="") {
+  xd <- read.table(x, header=T)
+  library("tcltk")
+
+  tt <- tktoplevel()
+  tktitle(tt) <- "Diagnostics"
+  label.widget <- tklabel(tt, text="Choose!")
+
+  pptlabs <- function() {
+    plot(xd$iv802, xd$PPT)
+    abline(0,1)
+    tt2 <- tktoplevel()
+    tktitle(tt2) <- "Identify Outliers"
+    lab.wid2 <- tklabel(tt2, text="Identify Outliers")
+    but.wid2 <- tkbutton(tt2, text="OK", command=function()
tkdestroy(tt2))
+    tkpack(lab.wid2, but.wid2)
+    labp <- identify(xd$iv802, xd$PPT, label=xd$FIPS)
+    dev.print(png, "pptlabs.png", width=600,height=600)
+  }
+
+  templabs <- function() {
+    plot(xd$iv802, xd$AVGT)
+    abline(0,1)
+    tt2 <- tktoplevel()
+    tktitle(tt2) <- "Identify Outliers"
+    lab.wid2 <- tklabel(tt2, text="Identify Outliers")
+    but.wid2 <- tkbutton(tt2, text="OK", command=function()
tkdestroy(tt2))
+    tkpack(lab.wid2, but.wid2)
+    labp <- identify(xd$iv802, xd$AVGT, label=xd$FIPS)
+    dev.print(png, "templabs.png", width=600,height=600)
+  }
+
+  tclvar$choice <- 99
+  rbut.wid <- tkradiobutton(tt, text="Precipitation", value=0,
+ variable=tclvar$choice,
+  command=pptlabs)
+  rbut.wid2 <- tkradiobutton(tt, text="Temperature", value=1,
+ variable=tclvar$choice,
+  command=templabs)
+  but.wid <- tkbutton(tt, text="FINISHED", command=function(){
dxcbutt <-
+ "Cancel";  tkdestroy(tt)})
+
+  tkpack(label.widget)
+  tkpack(rbut.wid)
+  tkpack(rbut.wid2)
+  #tkpack.configure(rbut.wid,side="left")
+  tkpack(but.wid)
+
+  dxcbutt <- "OK"
+  while(dxcbutt == "OK") {
+    if(dxcbutt=="Cancel") break
+  }
+
+  plot(xd$AVGT, xd$PPT)
+
+ }


To stop the evaluation of a function until a specific tcltk action is done
you have to use the tk-function tkwait.variable().
The following function -- a simple modification of Prasad's
tcltktst function -- shows an example:

tcltk.test <- function(x1=1:10, x2=10:1) {
 library("tcltk")
# define first toplevel-widget
 tt           <- tktoplevel()
 tktitle(tt)  <- "Diagnostics"
 label.widget <- tklabel(tt, text="Choose data for plot!")
 rbut.wid1    <- tkradiobutton(tt, text="x1", value="0",
variable="choice")
 rbut.wid2    <- tkradiobutton(tt, text="x2", value="1",
variable="choice")
 but.done     <- tkbutton(tt, text="FINISHED", command=function(){
                                                         tclvar$done <-
"T"
                                                         tkdestroy(tt)
                                                       } )
 tkpack(label.widget, rbut.wid1, rbut.wid2, but.done)
# wait until FINISHED is pressed
 tclvar$choice <- "0"
 tkwait.variable("done")
# plot x1 or x2
 if(tclvar$choice == "0") x <- x1
 if(tclvar$choice == "1") x <- x2
 if(is.null(names(x))) names(x) <- x
 plot(x)
# define second toplevel widget
 tt2          <- tktoplevel()
 tktitle(tt2) <- "Action"
 but.wid21    <- tkbutton(tt2, text="print summary",
                          command=function()print(summary(x)))
 but.wid22    <- tkbutton(tt2, text="identify outlier",
                          command=function()identify(x))
 but.wid23    <- tkbutton(tt2, text="exit", command=function(){

tclvar$done<-"T"
                                                      tkdestroy(tt2)
                                                    } )
 tkpack(but.wid21, but.wid22, but.wid23)
# wait until exit is pressed
 tclvar$done <- "F"
 tkwait.variable("done")
}

Peter Wolf

-------------------------------------------------------------------------
Hans Peter Wolf                       pwolf at wiwi.uni-bielefeld.de
Fak. f. Wiwi.
Uni Bielefeld
33615 Bielefeld
Germany
-------------------------------------------------------------------------

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at
stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._