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