# [R] combining identify() and locator()

Barry Rowlingson b.rowlingson at lancaster.ac.uk
Fri Feb 27 18:43:20 CET 2009

```2009/2/27 Brian Bolt <bbolt at kalypsys.com>:
> awesome.  Thank you very much for the quick response. I think this is
> exactly what I was looking for.

Here's a basic framework:

`idloc` <-
function(xy,n=1, tol=0.25){

tol2=tol^2

icoords = cbind(grconvertX(xy[,1],to="inches"),grconvertY(xy[,2],to="inches"))
hit = c()
missed = matrix(ncol=2,nrow=0)
for(i in 1:n){
ptU = locator(1)
pt = c(grconvertX(ptU\$x,to='inches'),grconvertY(ptU\$y,to="inches"))

d2 = (icoords[,1]-pt[1])^2 + (icoords[,2]-pt[2])^2
if (any(d2 < tol2)){
print("clicked")
hit = c(hit, (1:dim(xy)[1])[d2 < tol2])
}else{
print("missed")
missed=rbind(missed,c(ptU\$x,ptU\$y))
}

}
return(list(hit=hit,missed=missed))

}

Test:

xy = cbind(1:10,runif(10))
plot(xy)
idloc(xy,10)

now click ten times, on points or off points. You get back:

\$hit
[1]  4  6  7 10

\$missed
[,1]      [,2]
[1,] 5.698940 0.6835392
[2,] 6.216171 0.6144229
[3,] 5.877982 0.5752569
[4,] 6.773190 0.2895761
[5,] 7.210847 0.3126149
[6,] 9.239985 0.5614337

- \$hit is the indices of the points you hit (in order, including
duplicates) and \$missed are the coordinates of the misses.

It crashes out if you hit the middle button for the locator, but that
should be easy enough to fixup. It doesn't label hit points, but
that's also easy enough to do.

Barry

```