【问题标题】:The function of parentheses (round brackets) in RR中括号(圆括号)的功能
【发布时间】:2015-08-13 01:39:10
【问题描述】:

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

但是,我遇到了这个例子。假设我们在 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 的新对象,而不是修改我现有的列。

我的问题是,为什么将 ( ) 放在向量周围“展开”它?

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

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

【问题讨论】:

  • 开括号表示参数列表的开头,开括号左侧的标记应该是函数名。如果 open-paren 左侧没有标记,则它是对 eval 的隐式调用。您不应该使用 data.table 语法来学习 R 语法。这是一个真正的kewl包,但[.data.table中的语法完全不同@
  • 您会发现很多关于使用?"["[ 帮助信息。 ?"{" 上还有一些(但不多)信息。

标签: r data.table parentheses


【解决方案1】:

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 中的大多数地方,"(" 函数什么都不做,它只是返回相同的表达式,但在 data.table 的特殊情况下,它被“覆盖”(在引号中,因为它不完全是这样做的,但在精神上它是)做各种有用的操作。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 2011-01-12
    • 1970-01-01
    • 2016-11-07
    • 2021-10-12
    • 2019-04-11
    相关资源
    最近更新 更多