Skip to content
Back to formatted view

Raw Message

Message-ID: <d8ad40b50902270943o71337eci553daf463ea74874@mail.gmail.com>
Date: 2009-02-27T17:43:20Z
From: Barry Rowlingson
Subject: combining identify() and locator()
In-Reply-To: <8679542E-032D-4B23-93CF-ED67A10895FB@kalypsys.com>

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