Here is an approach to get that. There is probably a more efficient way to do this via functions in the gdistance
package
Example data:
library(raster)
r <- raster(ncol=36, nrow=18)
r[] <- 1:ncell(r)
xy <- cbind(-55, seq(-25, 20, by=20))
Algorithm (note that I am using the default "rook" adjacency rule):
start <- cellFromXY(r, xy)
svalues <- extract(r, xy)
result <- list()
for (i in 1:nrow(xy)) {
value <- svalues[i]
cells <- start[i]
allcells <- cells
while(TRUE) {
adj <- adjacent(r, cells, pairs=FALSE)
asel <- which(abs(r[adj] - value) < 5)
if (length(asel) == 0) break
cells <- adj[asel]
cells <- cells[!cells %in% allcells]
allcells <- c(allcells, cells)
}
result[[i]] <- allcells
}
Inspect results:
p <- xyFromCell(r, unlist(result))
plot(r)
points(xy, pch=20)
points(p, pch='+')