[R] locator() via tcltk

Duncan Murdoch murdoch at stats.uwo.ca
Sat Jun 4 04:31:47 CEST 2005


Sebastian Luque wrote:
> Hello,
> 
> I'm trying to write a function using tcltk to interactively modify a plot
> and gather locator() data. I've read Peter's articles in Rnews, the help
> pages in tcltk, http://bioinf.wehi.edu.au/~wettenhall/RTclTkExamples/,
> plus a post in R-help sometime ago, but haven't found a solution.
> The idea goes something like this:
> 
> require(tcltk)
> testplot <- function() {
>   getcoords <- function(...) {
>     locator(5)
>   }
>   x <- 1:1000
>   y <- rnorm(1000)
>   plot(x, y)
>   base <- tktoplevel()
>   loc.pts <- tkbutton(base, text = "Get coordinates", command = getcoords)
>   quit.but <- tkbutton(base, text = "Quit",
>                        command = function() tkdestroy(base))
>   tkpack(loc.pts, quit.but)
> }
> 
> I'd like testplot to return the value from getcoords. The "Get
> coordinates" button seems to be correctly calling getcoords, and locator
> is doing its job, but I don't know how to store its value. Any help is
> very much appreciated.

You can do this with local functions.  For example,

  testplot <- function() {

    coords <- NA

    getcoords <- function(...) {
      coords <<- locator(5)
    }
    x <- 1:1000
    y <- rnorm(1000)
    plot(x, y)
    base <- tktoplevel()
    loc.pts <- tkbutton(base, text = "Get coordinates", command = getcoords)
    quit.but <- tkbutton(base, text = "Quit",
                         command = function() tkdestroy(base))
    tkpack(loc.pts, quit.but)
    return(function() coords)
  }

This stores the results in a variable named coords in the testplot 
frame.  testplot itself returns a function that can read that value. 
You'd use it like this:

lastval <- testplot()

## do some button clicking...

lastval()   # will print the result of the last click.

This is one of the somewhat weird but very nice features of R.  S-PLUS 
doesn't work this way.

Duncan Murdoch




More information about the R-help mailing list