--- title: "inops vignette" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{inops vignette} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.path = "man/figures/README-", out.width = "100%" ) library(inops) ``` # inops Package implementing additional infix operators for R. Implemented operators work with 4 different value types: **sets**, **intervals**, **regular expressions**, and **counts**.\ And provide 3 distinct functionalities: **detection**, **subsetting**, and **replacement**. Install using the `remotes` package: ``` remotes::install_github("moodymudskipper/inops") ``` ## Syntax ## All operators have the same form composed of two distinct parts: `%%`. * `[operation]` specifies the performed functionality and can be one of `in`, `out`, `[in`, `[out`. * `[type]` specifies the type of operation and can be one of `{}`, `[]`, `()`, `[)`, `(]`, `~`, `~p`, `~f`, `#`. ## Value Types ## 1. **sets** ``` %in{}% %out{}% ``` Work with the same values as `%in%` does but provide a more consistent behaviour for `data.frames` and `NA` values. ```{r} letters <- letters[1:10] letters # sets letters %in{}% c("a", "b", "c", "e") letters %out{}% c("a", "b", "c", "e") ``` 2. **ranges** ``` %in()% %in[]% %in[)% %in(]% %out()% %out[]% %out[)% %out(]% ``` ```{r} 1:10 # closed interval 1:10 %in()% c(3,6) 1:10 %out()% c(3,6) # open interval 1:10 %in[]% c(3,6) 1:10 %out[]% c(3,6) # open on the right 1:10 %in(]% c(3,6) 1:10 %out(]% c(3,6) # open on the left 1:10 %in[)% c(3,6) 1:10 %out[)% c(3,6) ``` 3. **patterns** ``` %in~% %in~f% %in~p% %out~% %out~f% %out~p% ``` ```{r} month.name # regular expressions month.name %in~% "^M.*" month.name %out~% "^M.*" # fixed string regular expressions month.name %in~f% "^M.*" month.name %out~f% "^M.*" # perl regular expressions month.name %in~p% "^(?=.*r)(?!.*er)" month.name %out~p% "^(?=.*r)(?!.*er)" ``` 4. **counts** ``` %in#% %out#% ``` ```{r} values <- c("a", "a", "b", "b", "b", "c") values # number of occurances values %in#% 1:2 values %out#% 1:2 ``` ## Operations ## 1. **detection** Same form as examples shown above. ```{r} month.name month.name %in~% c("^A", "^M") ``` 2. **subsetting** Used for obtaining actual values.\ Starts with `[`. ```{r} month.name month.name %[in~% c("^A", "^M") ``` 3. **replacement** Used for replacing the matched elements with new values.\ Called with assignment `<-` at the end. ```{r} month.name month.name %in~% c("^A", "^M") <- "A or M" month.name ``` ## Behaviour ## The operators implemented here try to be consistent with the default comparison operators like `==` and `<`.\ Therefore in some scenarios their behaviour differs from `%in%`.\ For instance: 1) `%in{}%` can be used on on data frames. ```{r} df1 <- data.frame(a = 1:3, b = 2:4, c=letters[1:3]) df1 == 2 df1 %in% 2 df1 %in{}% 2 df1 %in{}% 2:3 ``` 2) missing values are not considered as not matching. ```{r} NA == 1 NA %in% 1 NA %in{}% 1 NA %in% NA NA %in{}% NA c(1, NA, 3) %in{}% 1:10 ``` ## Additional Examples ## Simple examples for illustration. --- Selecting flight records from the `flights` dataset that: 1. Departed and Landed between noon and 5 p.m. 2. Were not traveling to "LEX", "PSP", nor "HDN" 3. Travelled distance was either very short (below 100) or very long (above 3000) 4. Had a tail number starting with "N1" or "N3" ```{r, message=FALSE} library(nycflights13) library(dplyr) library(inops) flights <- select(flights, origin, dest, tailnum, dep_time, arr_time, distance) flights filter(flights, dep_time %in()% c(1200, 1700), arr_time %in()% c(1200, 1700), dest %out% c("LEX", "PSP", "HDN"), distance %out[]% c(100, 3000), tailnum %in~% c("^N1", "^N3") ) ``` --- Cleaning up `planes` dataset in order to: 1. Standardize names of "AIRBUS", "CANADAIR" and "MCDONNELL" manufacturers. 2. Obtain plane counts for each of the 3 manufacturers mentioned above. ```{r, message=FALSE} library(nycflights13) library(inops) table(planes$manufacturer %[in~% c("AIRBUS", "CANADAIR", "MCDONNELL")) planes$manufacturer %in~% "AIRBUS" <- "AIRBUS" planes$manufacturer %in~% "CANADAIR" <- "CANADAIR" planes$manufacturer %in~% "MCDONNELL" <- "MCDONNELL" table(planes$manufacturer %[in~% c("AIRBUS", "CANADAIR", "MCDONNELL")) ``` --- Combine engine models that in the dataset occur less than 6 times under the "Other" group. ```{r, message=FALSE} library(nycflights13) library(inops) table(planes$engine) planes$engine %in#% 1:5 <- "Other" table(planes$engine) ``` --- ## Full List ## Below is a full list of all the implemented operators along with their usage examples. ### Detection Operators ### | Form | Description | Call | |-------------|--------------------------------------------------------------------------|-------------------------------| | `%in{}%` | which elements are inside a set | `x %in{}% set` | | `%in[]%` | which elements are inside a closed interval | `x %in[]% interval` | | `%in()%` | which elements are inside an open interval | `x %in()% interval` | | `%in[)%` | which elements are inside an interval open on the right | `x %in[)% interval` | | `%in(]%` | which elements are inside an interval open on the left | `x %in(]% interval` | | `%in~%` | which elements match a regular expression | `x %in~% pattern` | | `%in~p%` | which elements match a regular perl expression | `x %in~p% pattern` | | `%in~f%` | which elements match a regular fixed expression | `x %in~f% pattern` | | `%in#%` | which elements occur a specified number of times | `x %in#% count` | | `%out%` | which elements are outside a set (same as ! x %in% y) | `x %out% set` | | `%out{}%` | which elements are outside a set | `x %out{}% set` | | `%out[]%` | which elements are outside a closed interval | `x %out[]% interval` | | `%out()%` | which elements are outside an open interval | `x %out()% interval` | | `%out[)%` | which elements are outside an interval open on the right | `x %out[)% interval` | | `%out(]%` | which elements are outside an interval open on the left | `x %out(]% interval` | | `%out~%` | which elements do not match a regular expression | `x %out~% pattern` | | `%out~p%` | which elements do not match a regular perl expression | `x %out~p% pattern` | | `%out~f%` | which elements do not match a regular fixed expression | `x %out~f% pattern` | | `%out#%` | which elements occur other than a specified number of times | `x %out#% count` | ### Subsetting Operators ### | Form | Description | Call | |-------------|--------------------------------------------------------------------------|-------------------------------| | `%[in%` | select elements inside a set | `x %[in% set` | | `%[in{}%` | select elements inside a set | `x %[in{}% set` | | `%[in[]%` | select elements inside a closed interval | `x %[in[]% interval` | | `%[in()%` | select elements inside an open interval | `x %[in()% interval` | | `%[in[)%` | select elements inside an interval open on the right | `x %[in[)% interval` | | `%[in(]%` | select elements inside an interval open on the left | `x %[in(]% interval` | | `%[in~%` | select elements matching a regular expression | `x %[in~% pattern` | | `%[in~p%` | select elements matching a regular perl expression | `x %[in~p% pattern` | | `%[in~f%` | select elements matching a regular fixed expression | `x %[in~f% pattern` | | `%[in#%` | select elements that occur a specified number of times | `x %[in#% count` | | `%[out%` | select elements outside a set | `x %[out% set` | | `%[out{}%` | select elements outside a set | `x %[out{}% set` | | `%[out[]%` | select elements outside a closed interval | `x %[out[]% interval` | | `%[out()%` | select elements outside an open interval | `x %[out()% interval` | | `%[out[)%` | select elements outside an interval open on the right | `x %[out[)% interval` | | `%[out(]%` | select elements outside an interval open on the left | `x %[out(]% interval` | | `%[out~%` | select elements not matching a regular expression | `x %[out~% pattern` | | `%[out~p%` | select elements not matching a regular perl expression | `x %[out~p% pattern` | | `%[out~f%` | select elements not matching a regular fixed expression | `x %[out~f% pattern` | | `%[out#%` | select elements that occur other than specified number of times | `x %[out% count` | ### Replacement Operators ### | Form | Description | Call | |-------------|--------------------------------------------------------------------------|-------------------------------| | `==<-` | change elements equal to the provided value | `x == element <- value` | | `!=<-` | change elements not equal to the provided value | `x != element <- value` | | `><-` | change elements greater than the provided value | `x > number <- value` | | `<<-` | change elements lower than the provided value | `x < number <- value` | | `>=<-` | change elements greater or equal to the provided value | `x >= number <- value` | | `<=<-` | change elements lower or equal to the provided value | `x <= number <- value` | | `%in%<-` | change elements inside a set | `x %in% set <- value` | | `%in{}%<-` | change elements inside a set | `x %in{}% set <- value` | | `%in[]%<-` | change elements inside a closed interval | `x %in[]% interval <- value` | | `%in()%<-` | change elements inside an open interval | `x %in()% interval <- value` | | `%in[)%<-` | change elements inside an interval open on the right | `x %in[)% interval <- value` | | `%in(]%<-` | change elements inside an interval open on the left | `x %in(]% interval <- value` | | `%in~%<-` | change elements matching a regular expression | `x %in~% pattern <- value` | | `%in~p%<-` | change elements matching a regular perl expression | `x %in~p% pattern <- value` | | `%in~f%<-` | change elements matching a regular fixed expression | `x %in~f% pattern <- value` | | `%in#%<-` | change elements that occur specified number of times | `x %in#% count <- value` | | `%out%<-` | change elements outside a set | `x %out% set <- value` | | `%out{}%<-` | change elements outside a set | `x %out{}% set <- value` | | `%out[]%<-` | change elements outside a closed interval | `x %out[]% interval <- value` | | `%out()%<-` | change elements outside an open interval | `x %out()% interval <- value` | | `%out[)%<-` | change elements outside an interval open on the right | `x %out[)% interval <- value` | | `%out(]%<-` | change elements outside an interval open on the left | `x %out(]% interval <- value` | | `%out~%<-` | change elements not matching a regular expression | `x %out~% pattern <- value` | | `%out~p%<-` | change elements not matching a regular perl expression | `x %out~p% pattern <- value` | | `%out~f%<-` | change elements not matching a regular fixed expression | `x %out~f% pattern <- value` | | `%out#%<-` | change elements that occur other than specified number of times | `x %out#% count <- value` | ## Notes ## To give an assignment counterpart to `<` we had to overload the `<<-` operator, which explains the message when attaching the package. This doesn't affect the behavior of the `<<-` assignments.