# applynbd

##### Apply Function to Every Neighbourhood in a Point Pattern

Visit each point in a point pattern, find the neighbouring points, and apply a given function to them.

- Keywords
- spatial

##### Usage

`applynbd(X, FUN, N, R, criterion, exclude=FALSE, ...)`

##### Arguments

- X
- Point pattern.
An object of class
`"ppp"`

, or data which can be converted into this format by`as.ppp`

. - FUN
- Function to be applied to each neighbourhood.
The arguments of
`FUN`

are described under**Details**. - N
- Integer. If this argument is present,
the neighbourhood of a point of
`X`

is defined to consist of the`N`

points of`X`

which are closest to it. This argument is incompatible with`R`

and`crit`

- R
- Nonnegative numeric value. If this argument is present,
the neighbourhood of a point of
`X`

is defined to consist of all points of`X`

which lie within a distance`R`

of it. This argument is incompatible wi - criterion
- Function. If this argument is present,
the neighbourhood of a point of
`X`

is determined by evaluating this function. See under**Details**. This argument is incompatible with`N`

and`R`

. - exclude
- Logical. If
`TRUE`

then the point currently being visited is excluded from its own neighbourhood. - ...
- extra arguments passed to the function
`FUN`

. They must be given in the form`name=value`

.

##### Details

This is an analogue of `apply`

for point patterns. It visits each point in the point pattern `X`

,
determines which points of `X`

are ``neighbours'' of the current
point, applies the function `FUN`

to this neighbourhood,
and collects the values returned by `FUN`

.

The definition of ``neighbours'' depends on the arguments
`N`

, `R`

and `criterion`

, exactly one of which
must be given.
Also the argument `exclude`

determines whether
the current point is excluded from its own neighbourhood.

If `N`

is given, then the neighbours of the current
point are the `N`

points of `X`

which are closest to
the current point (including the current point itself
unless `exclude=TRUE`

).
If `R`

is given, then the neighbourhood of the current point
consists of all points of `X`

which lie closer than a distance `R`

from the current point.
If `criterion`

is given, then it must be a function
with two arguments `dist`

and `drank`

which will be
vectors of equal length.
The interpretation is that `dist[i]`

will be the
distance of a point from the current point, and
`drank[i]`

will be the rank of that distance (the three points
closest to the current point will have rank 1, 2 and 3).
This function must return a logical vector of the same length
as `dist`

and `drank`

whose `i`

-th entry is
`TRUE`

if the corresponding point should be included in
the neighbourhood. See the examples below.

Each point of `X`

is visited; the neighbourhood
of the current point is determined, and stored as a point pattern
`Y`

; then the function `FUN`

is called as:
`FUN(Y=Y, current=current, dists=dists, dranks=dranks, ...)`

where `current`

is a vector of length 2 giving the coordinates of the
current point, `dists`

is a vector of distances from the current
point to each of the points in `Y`

,
`dranks`

is a vector of the ranks of these distances
with respect to the full point pattern `X`

,
and `...`

are the arguments passed from the call to
`applynbd`

.

The results of each call to `FUN`

are collected and returned
according to the usual rules for `apply`

and its
relatives. See **Value** above.

Note that `FUN`

will be called exactly as described above,
with each argument named explicitly. Care is required when writing the
function `FUN`

to ensure that
the arguments will match up. See the Examples.

##### Value

- Similar to the result of
`apply`

. If each call to`FUN`

returns a single numeric value, the result is a vector of dimension`X$n`

, the number of points in`X`

. If each call to`FUN`

returns a vector of the same length`m`

, then the result is a matrix of dimensions`c(m,n)`

; note the transposition of the indices, as usual for the family of`apply`

functions. If the calls to`FUN`

return vectors of different lengths, the result is a list of length`X$n`

.

##### See Also

##### Examples

```
data(redwood)
# count the number of points within radius 0.2 of each point of X
nneighbours <- applynbd(redwood, R=0.2, function(Y, ...){Y$n-1})
# equivalent to:
nneighbours <- applynbd(redwood, R=0.2, function(Y, ...){Y$n}, exclude=TRUE)
# compute the distance to the second nearest neighbour of each point
secondnndist <- applynbd(redwood, N = 2,
function(dists, ...){max(dists)},
exclude=TRUE)
# marked point pattern
data(longleaf)
<testonly># smaller dataset
longleaf <- longleaf[seq(1, longleaf$n, by=80)]</testonly>
# compute the median of the marks of all neighbours of a point
dbh.med <- applynbd(longleaf, R=40, exclude=TRUE,
function(Y, ...) { median(Y$marks)})
# ANIMATION explaining the definition of the K function
# (arguments `fullpicture' and 'rad' are passed to FUN)
showoffK <- function(Y, current, dists, dranks, fullpicture,rad) {
plot(fullpicture, main="")
points(Y, cex=2)
u <- current
points(u[1],u[2],pch="+",cex=3)
theta <- seq(0,2*pi,length=100)
polygon(u[1]+ rad * cos(theta),u[2]+rad*sin(theta))
text(u[1]+rad/3,u[2]+rad/2,Y$n,cex=3)
Sys.sleep(if(runif(1) < 0.1) 1.5 else 0.3)
return(Y$n - 1)
}
applynbd(redwood, R=0.2, showoffK, fullpicture=redwood, rad=0.2, exclude=TRUE)
# animation explaining the definition of the G function
showoffG <- function(Y, current, dists, dranks, fullpicture) {
plot(fullpicture, main="")
points(Y, cex=2)
u <- current
points(u[1],u[2],pch="+",cex=3)
v <- c(Y$x[1],Y$y[1])
segments(u[1],u[2],v[1],v[2],lwd=2)
w <- (u + v)/2
nnd <- dists[1]
text(w[1],w[2],round(nnd,3),cex=2)
Sys.sleep(if(runif(1) < 0.1) 1.5 else 0.3)
return(nnd)
}
data(cells)
applynbd(cells, N=1, showoffG, exclude=TRUE, fullpicture=cells)
```

*Documentation reproduced from package spatstat, version 1.7-11, License: GPL version 2 or newer*