33# '
44# ' Utilities for sequences, vectors, ranges of values
55# '
6- # ' $Revision: 1.23 $ $Date: 2024/06/16 09: 07:13 $
6+ # ' $Revision: 1.25 $ $Date: 2025/04/04 07:00:04 $
77# '
88# ' ==>> ORIGINAL FILE is in spatstat/develop/Spatstat/R <<==
99
@@ -271,24 +271,37 @@ adjustthinrange <- function(ur,vstep,vr) {
271271 return (ur )
272272}
273273
274- fastFindInterval <- function (x , b , labels = FALSE , reltol = 0.001 , dig.lab = 3L ) {
274+ fastFindInterval <- function (x , b , labels = FALSE , reltol = 0.001 , dig.lab = 3L ,
275+ left.open = TRUE ) {
275276 nintervals <- length(b ) - 1
276277 nx <- length(x )
277278 if (nx == 0 ) {
278279 y <- integer(0 )
279280 } else if (evenly.spaced(b , reltol )) {
280281 # # breaks are equally spaced
281- zz <- .C(C_fastinterv ,
282- x = as.double(x ),
283- n = as.integer(nx ),
284- brange = as.double(range(b )),
285- nintervals = as.integer(nintervals ),
286- y = as.integer(integer(nx ))
287- )
282+ if (left.open ) {
283+ # # intervals are left-open, right-closed ( ] except the first interval
284+ zz <- .C(C_fastCinterv ,
285+ x = as.double(x ),
286+ n = as.integer(nx ),
287+ brange = as.double(range(b )),
288+ nintervals = as.integer(nintervals ),
289+ y = as.integer(integer(nx ))
290+ )
291+ } else {
292+ # # intervals are left-closed, right-open [ ) except the last interval
293+ zz <- .C(C_fastFinterv ,
294+ x = as.double(x ),
295+ n = as.integer(nx ),
296+ brange = as.double(range(b )),
297+ nintervals = as.integer(nintervals ),
298+ y = as.integer(integer(nx ))
299+ )
300+ }
288301 y <- zz $ y
289302 } else {
290303 # # use R's interval search algorithm
291- y <- findInterval(x , b , rightmost.closed = TRUE )
304+ y <- findInterval(x , b , rightmost.closed = TRUE , left.open = left.open )
292305 }
293306 if (labels ) {
294307 # ' digits in labels code copied from base::cut.default (with adaptations)
@@ -297,11 +310,21 @@ fastFindInterval <- function(x, b, labels=FALSE, reltol=0.001, dig.lab=3L) {
297310 if (all(ch.br [- 1L ] != ch.br [1L : nintervals ]))
298311 break
299312 }
300- blab <- paste0(" [" ,
301- ch.br [1 : nintervals ],
302- " ," ,
303- ch.br [- 1L ],
304- c(rep(" )" , nintervals - 1 ), " ]" ))
313+ if (left.open ) {
314+ # # left-open except the first one
315+ blab <- paste0(c(" [" , rep(" (" , nintervals - 1 )),
316+ ch.br [1 : nintervals ],
317+ " ," ,
318+ ch.br [- 1L ],
319+ " ]" )
320+ } else {
321+ # # right-open except the last one
322+ blab <- paste0(" [" ,
323+ ch.br [1 : nintervals ],
324+ " ," ,
325+ ch.br [- 1L ],
326+ c(rep(" )" , nintervals - 1 ), " ]" ))
327+ }
305328 y <- as.integer(y )
306329 levels(y ) <- as.character(blab )
307330 class(y ) <- " factor"
0 commit comments