2013-10-18 14 views
17

Mi piacerebbe avere un operatore infisso %between% in R - per verificare se x è tra limite inferiore l e limite superiore u.Come posso creare un infisso% tra% operatore?

Ho creato la seguente semplice funzione, ma non è un'operazione di infisso.

# between function - check to see if x is between l and u 
is.between <- function(x, l, u) { x > l & x < u } 

Il mio obiettivo è quello di sostituire questo con: x %between% c(l, u)

E 'possibile definire nuove operazioni infissa? Se è così, come si fa?

grazie in anticipo

risposta

22

È possibile definire operatori infissi come funzioni:

> `%between%`<-function(x,rng) x>rng[1] & x<rng[2] 
> 1 %between% c(0,3) 
[1] TRUE 
> 1 %between% c(2,3) 
[1] FALSE 

Come sottolineato da @flodel, questo operatore è vettorizzate:

> 1:5 %between% c(1.5,3.5) 
[1] FALSE TRUE TRUE FALSE FALSE 
+3

+1 - dovresti anche prendere il merito di fornire una funzione vettoriale, mostrando un esempio dove 'x' ha lunghezza> 1. – flodel

+2

Non sarebbe male al dr op qualche codice di convalida dell'input in là (ma questo è un miglioramento-- non necessario per questa risposta). E poi, ci sono le solite opzioni: vuoi essere in grado di includere i goalpost ('x <= rng [2]'), e vuoi che "quasi uguale" sia permesso o no? Basta sottolineare che devi stare attento a ciò che ti aspetti da un semplice operatore. –

12

Questa funzione esiste nel pacchetto data.table (con la leggera differenza che i limiti sono inclusi), implementato come:

between <- function(x,lower,upper,incbounds=TRUE) 
{ 
    if(incbounds) x>=lower & x<=upper 
    else x>lower & x<upper 
} 

"%between%" <- function(x,y) between(x,y[1],y[2],incbounds=TRUE) 

Può essere utilizzato come between(x,lower,upper) o x %between% c(lower, upper)

2

Per evitare ambiguità, si potrebbe definire due funzioni:

"%><%" <- function(x, rng) x > rng[1] & x < rng[2] 
"%>=<%" <- function(x, rng) x >= rng[1] & x <= rng[2] 
x=1:5 
x %><% c(2,4) 
[1] FALSE FALSE TRUE FALSE FALSE 
x %>=<% c(2,4) 
[1] FALSE TRUE TRUE TRUE FALSE 

O anche aggiungere questi due altri:

"%> =<%"<-function(x,rng) x > rng[1] & x <= rng[2] 
"%>= <%"<-function(x,rng) x >= rng[1] & x < rng[2] 
Problemi correlati