Sean
Sean

Reputation: 631

Use of $ and %% operators in R

I have been working with R for about 2 months and have had a little bit of trouble getting a hold of how the $ and %% terms.

I understand I can use the $ term to pull a certain value from a function (e.g. t.test(x)$p.value), but I'm not sure if this is a universal definition. I also know it is possible to use this to specify to pull certain data.

I'm also curious about the use of the %% term, in particular, if I am placing a value in between it (e.g. %x%) I am aware of using it as a modulator or remainder e.g. 7 %% 5 returns 2. Perhaps I am being ignorant and this is not real?

Any help or links to literature would be greatly appreciated.

Note: I have been searching for this for a couple hours so excuse me if I couldn't find it!

Upvotes: 6

Views: 44251

Answers (3)

Sunit Kumar
Sunit Kumar

Reputation: 1

The '$' operator is used to select particular element from a list or any other data component which contains sub data components. For example: data is a list which contains a matrix named MATRIX and other things too. But to get the matrix we write, Print(data$MATRIX)

The %% operator is a modulus operator ; which provides the remainder. For example: print(7%%3) Will print 1 as an output

Upvotes: -1

IRTFM
IRTFM

Reputation: 263342

You are not really pulling a value from a function but rather from the list object that the function returns. $ is actually an infix that takes two arguments, the values preceding and following it. It is a convenience function designed that uses non-standard evaluation of its second argument. It's called non-standard because the unquoted characters following $ are first quoted before being used to extract a named element from the first argument.

 t.test  # is the function
 t.test(x) # is a named list with one of the names being "p.value"
 

The value can be pulled in one of three ways:

 t.test(x)$p.value
 t.test(x)[['p.value']]  # numeric vector
 t.test(x)['p.value']  # a list with one item

 my.name.for.p.val <- 'p.value'
 t.test(x)[[ my.name.for.p.val ]]

When you surround a set of characters with flanking "%"-signs you can create your own vectorized infix function. If you wanted a pmax for which the defautl was na.rm=TRUE do this:

 '%mypmax%' <- function(x,y) pmax(x,y, na.rm=TRUE)

And then use it without quotes:

> c(1:10, NA) %mypmax% c(NA,10:1)
 [1]  1 10  9  8  7  6  7  8  9 10  1

Upvotes: 14

Chris Watson
Chris Watson

Reputation: 1367

First, the $ operator is for selecting an element of a list. See help('$').

The %% operator is the modulo operator. See help('%%').

Upvotes: 1

Related Questions