[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