Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What do the %op% operators in mean? For example "%in%"?

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:

  • What does eg %+% do? in R
  • The R %*% operator
  • What does %*% mean in R
  • What does %||% do in R?
  • What does %>% mean in R
like image 793
heavy rocker dude Avatar asked Oct 04 '12 15:10

heavy rocker dude


People also ask

What is an operator explain with example?

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.

What do you mean by operators?

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.

What are the operators in computer?

There are three types of operator that programmers use: arithmetic operators. relational operators. logical operators.

What do you mean by operators and operations?

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.


2 Answers

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.

like image 153
IRTFM Avatar answered Sep 27 '22 16:09

IRTFM


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

  1. It's a binary opertor, so the function must take exactly two arguments.
  2. Since the name is non-standard, it must be written with quotes or backquotes.

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 ) 
like image 20
12 revs, 6 users 93% Avatar answered Sep 27 '22 16:09

12 revs, 6 users 93%