Samuel Tan
Samuel Tan

Reputation: 1750

The function of parentheses (round brackets) in R

How does R interpret parentheses? Like most other programming languages these are built-in operators, and I normally use them without thinking.

However, I came across this example. Let's say we have a data.table in R, and I would like to apply a function on it's columns. Then I might write:

dt <- data.table(my_data)
important_cols <- c("col1", "col2", "col5")
dt[, (important_cols) := lapply(.SD, my_func), .SDcols = important_cols]

Obviously I can't neglect the parentheses:

dt[, important_cols := lapply(.SD, my_func), .SDcols = important_cols]

as that would introduce a new object called important_cols to my data.table, instead of modifying my existing columns in place.

My question is, why does putting ( ) around the vector "expand" it?

This question can probably better phrased and titled. But then I would have probably found the answer by Googling if I knew the terminology to employ while asking it, hence I'm here.

While we're on that topic, if someone could point out the differences between [ ], { }, etc., and how they should be used, that would be appreciated too :)

Upvotes: 4

Views: 3299

Answers (1)

eddi
eddi

Reputation: 49448

A special feature of R (compared to e.g. C++) is that the various parentheses are actually functions. What this means is that (a) and a are different expressions. The second is just a, while the first is the function ( called with an argument a. Here are a few expressions trees for you to compare:

as.list(substitute( a ))
#[[1]]
#a

as.list(substitute( (a) ))
#[[1]]
#`(`
#
#[[2]]
#a

as.list(substitute( sqrt(a) ))
#[[1]]
#sqrt
#
#[[2]]
#a

Notice how similar the last trees are - in one the function is sqrt, in the other it's "(". In most places in R, the "(" function doesn't do anything, it just returns the same expression, but in the particular case of data.table, it is "overridden" (in quotes because that's not exactly how it's done, but in spirit it is) to do a variety of useful operations.

And here's one more demo to hopefully cement the point:

`(` = function(x) x*x
2
#[1] 2
(2)
#[1] 4
((2))
#[1] 16

Upvotes: 3

Related Questions