Как я могу создать инфикс% между% оператором?

Я хотел бы иметь инфиксный оператор %between% в R -, чтобы проверить, находится ли x между нижней границей l и верхней границей u.

Я создал следующую простую функцию - но это не операция инфикса.

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

Моя цель - заменить это на: x %between% c(l, u)

Можно ли определить новые операции инфикса? Если да, то как это сделать?

заблаговременно

Ответы

Ответ 1

Вы можете определить инфиксные операторы как функции:

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

Как указывает @flodel, этот оператор векторизован:

1:5 %between% c(1.5,3.5)
# [1] FALSE  TRUE  TRUE FALSE FALSE

Ответ 2

Эта функция существует в пакете data.table (с небольшой разницей, что границы включены), реализованная как:

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)

Его можно использовать как between(x,lower,upper) или x %between% c(lower, upper)

Ответ 3

Чтобы избежать двусмысленности, можно было определить две функции:

"%><%"  <- 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

Или добавьте еще два этих файла:

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