R中小括号(圆括号)的作用

The function of parentheses (round brackets) in R

R 如何解释括号?像大多数其他编程语言一样,这些是 built-in 运算符,我通常不假思索地使用它们。

但是,我遇到了这个例子。假设我们在 R 中有一个 data.table,我想在它的列上应用一个函数。那么我可能会写:

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

显然我不能忽略括号:

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

因为这会在我的 data.table 中引入一个名为 important_cols 的新 object,而不是修改我现有的列。

我的问题是,为什么要把 ( ) 放在向量 "expand" 周围?

这个问题的措辞和标题可能会更好。但是如果我在询问时知道要使用的术语,我可能会通过谷歌搜索找到答案,因此我在这里。

当我们讨论这个话题时,如果有人能指出 [ ]、{ } 等之间的区别以及它们应该如何使用,我们也将不胜感激:)

R 的一个特点(与 C++ 等相比)是各种括号实际上是函数。这意味着 (a)a 是不同的表达式。第二个只是 a,而第一个是使用参数 a 调用的 函数 (。这里有一些表达式树供您比较:

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

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

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

请注意最后几棵树的相似之处 - 一个函数是 sqrt,另一个函数是 "("。在 R 的大多数地方,"(" 函数什么都不做,它只是 returns 相同的表达式,但在 data.table 的特殊情况下,它是 "overridden"(用引号引起来,因为这并不完全是它的完成方式,但在精神上它是)进行各种有用的操作。

这里还有一个演示,希望能巩固这一点:

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