I tried to do this simple search but couldn't find anything on the percent (%
) symbol in R.
What does %in%
mean in the following code?
time(x) %in% time(y)
where x
and y
are matrices.
How do I look up help on %in%
and similar functions that follow the %stuff%
pattern, as I cannot locate the help file?
Related questions:
1. In mathematics and sometimes in computer programming, an operator is a character that represents an action, as for example x is an arithmetic operator that represents multiplication. In computer programs, one of the most familiar sets of operators, the Boolean operators, is used to work with true/false values.
Definition of operator 1 : one that operates: such as. a : one that operates a machine or device. b : one that operates a business. c : one that performs surgical operations. d : one that deals in stocks or commodities.
There are three types of operator that programmers use: arithmetic operators. relational operators. logical operators.
Operators can be defined as basic symbols that help us work on logical and mathematical operations. Operators in C and C++, are tools or symbols that are used to perform mathematical operations concerning arithmetic, logical, conditional and, bitwise operations.
I didn't think GSee's or Sathish's answers went far enough because "%" does have meaning all by itself and not just in the context of the %in%
operator. It is the mechanism for defining new infix operators by users. It is a much more general issue than the virtues of the %in%
infix operator or its more general prefix ancestor match
. It could be as simple as making a pairwise "s"(um) operator:
`%s%` <- function(x,y) x + y
Or it could be more interesting, say making a second derivative operator:
`%DD%` <- function(expr, nam="x") { D(D( bquote(.(expr)), nam), nam) } expression(x^4) %DD% "x" # 4 * (3 * x^2)
The %
-character also has importance in the parsing of Date, date-time, and C-type format functions like strptime
, formatC
and sprintf
.
Since that was originally written we have seen the emergence of the magrittr
package with the dplyr
elaboration that demonstrates yet another use for %
-flanked operators.
So the most general answer is that %
symbols are handled specially by the R parser. Since the parser is used to process plotmath expressions, you will also see extensive options for graphics annotations at the ?plotmath
help page.
%op%
denotes an infix binary operator. There are several built-in operators using %
, and you can also create your own.
(A single %
sign isn't a keyword in R. You can see a list of keywords on the ?Reserved
help page.)
How do I get help on binary operators?
As with anything that isn't a standard variable name, you have to to enclose the term in quotes or backquotes.
?"%in%" ?`%in%`
Credit: GSee's answer.
What does %in%
do?
As described on the ?`%in%`
help page (which is actually the ?match
help page since %in%
is really only an infix version of match
.),
[
%in%
] returns a logical vector indicating if there is a match or not for its left operand
It is most commonly used with categorical variables, though it can be used with numbers as well.
c("a", "A") %in% letters ## [1] TRUE FALSE 1:4 %in% c(2, 3, 5, 7, 11) ## [1] FALSE TRUE TRUE FALSE
Credit: GSee's answer, Ari's answer, Sathish's answer.
How do I create my own infix binary operators?
These are functions, and can be defined in the same way as any other function, with a couple of restrictions.
For example, this defines a matrix power operator.
`%^%` <- function(x, y) matrixcalc::matrix.power(x, y) matrix(1:4, 2) %^% 3
Credit: BondedDust's answer, Ari's answer.
What other %
operators are there?
In base R:
%/%
and %%
perform integer division and modular division respectively, and are described on the ?Arithmetic
help page.
%o%
gives the outer product of arrays.
%*%
performs matrix multiplication.
%x%
performs the Kronecker product of arrays.
In ggplot2:
%+%
replaces the data frame in a ggplot.
%+replace%
modifies theme elements in a ggplot.
%inside%
(internal) checks for values in a range.
%||%
(internal) provides a default value in case of NULL
values. This function also appears internally in devtools, reshape2, roxygen2 and knitr. (In knitr it is called %n%
.)
In magrittr:
%>%
pipes the left-hand side into an expression on the right-hand side.
%<>%
pipes the left-hand side into an expression on the right-hand side, and then assigns the result back into the left-hand side object.
%T>%
pipes the left-hand side into an expression on the right-hand side, which it uses only for its side effects, returning the left-hand side.
%,%
builds a functional sequence.
%$%
exposes columns of a data.frame or members of a list.
In data.table:
%between%
checks for values in a range.
%chin%
is like %in%
, optimised for character vectors.
%like%
checks for regular expression matches.
In Hmisc:
%nin%
returns the opposite of %in%
.
In devtools:
%:::%
(internal) gets a variable from a namespace passed as a string.
In sp:
%over%
performs a spatial join (e.g., which polygon corresponds to some points?)
In rebus:
%R%
concatenates elements of a regex
object.
More generally, you can find all the operators in all the packages installed on your machine using:
library(magrittr) ip <- installed.packages() %>% rownames (ops <- setNames(ip, ip) %>% lapply( function(pkg) { rdx_file <- system.file("R", paste0(pkg, ".rdx"), package = pkg) if(file.exists(rdx_file)) { rdx <- readRDS(rdx_file) fn_names <- names(rdx$variables) fn_names[grepl("^%", fn_names)] } } ) %>% unlist )
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With