The <<- assignment can be very tricky and Tk windows have their own world.  If 
you just copy and paste the below (with ntx and levels.tx defined, it would 
have been nice to have the example fully self running), then the OnOk function 
has been defined and linked to the button, but never run, so when it looks for 
tx.choice1, it has not been defined yet.  But after you make a selection and 
click on ok, then it has.  I prefer to do this type of thing fully in a 
function (keep all the varibles defined in a local environment), then return 
the result.  Something like:

getlegend <- function(treatments){
  if(!require(tcltk)) stop('need tcltk')

  ntx <- length(treatments)
  tx.choice1 <- ''

  tt<-tktoplevel()
  tl<-tklistbox(tt,height=ntx,selectmode="single",background="white")
  tkgrid(tklabel(tt,text="Select the legend of" ))
  tkgrid(tl)

  for(i in (1:ntx))
  {
      tkinsert(tl,"end",treatments[i])
  }

  OnOK<-function()
  {
      tx.choice1<<-treatments[as.integer(tkcurselection(tl))+1]
      tkdestroy(tt)

  }
  OK.but<-tkbutton(tt,text="    OK    ", command=OnOK)
  tkgrid(OK.but)

  tkwait.window(tt)
  return(tx.choice1)
}

Then you can run the getlegend function like:

> getlegend( levels(state.division) )

And it will wait until you select something and click on OK, then return the 
selection (which the user can save or do whatever they want with).

Hope this helps,

--
Gregory (Greg) L. Snow Ph.D.
Statistical Data Center
Intermountain Healthcare
[EMAIL PROTECTED]
(801) 408-8111



> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] On Behalf Of Judith Flores
> Sent: Tuesday, July 22, 2008 10:41 AM
> To: RHelp
> Subject: [R] tklistbox and extracting selection to R
>
> Dear experts,
>
>    I am trying to understand why is it that when I paste
> (into the R console) the following code to select an option
> from a list:
>
>   require(tcltk)
>   tt<-tktoplevel()
>   tl<-tklistbox(tt,height=ntx,selectmode="single",background="white")
>   tkgrid(tklabel(tt,text="Select the legend of" ))
>   tkgrid(tl)
>   treatments<<-levels.tx
>   for(i in (1:ntx))
>   {
>       tkinsert(tl,"end",treatments[i])
>   }
>
>   OnOK<-function()
>   {
>       tx.choice1<<-treatments[as.integer(tkcurselection(tl))+1]
>       tkdestroy(tt)
>
>   }
>   OK.but<-tkbutton(tt,text="    OK    ", command=OnOK)
>   tkgrid(OK.but)
>
> tx.choice1
>
>
>      the console can't find tx.choice1, but if I type
> tx.choice1 directly into the console, it returns the value I
> selected from the list.
>
>    I am running R 2.7.1, OS: linnux, I run R within emacs.
>
> Thank you very much for you help,
>
> Judith
>
> ______________________________________________
> R-help@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to