如果`[`是R中用于子集设置的函数,`]`是什么?

如果`[`是R中用于子集设置的函数,`]`是什么?,r,syntax,primitive,R,Syntax,Primitive,我正在阅读Hadley Wickham的advanced R简介,其中他指出[(和+,-,{,等等)是函数,因此[可以这样使用 > x <- list(1:3, 4:9, 10:12) > sapply(x, "[", 2) [1] 2 5 11 所以我认为它没有其他用途?这是语法和语义之间的根本区别。语义要求在R-中,诸如子集和如果etc是函数。这就是为什么R定义函数`[`,`if`等 还有语法。R的语法规定,if的语法是if(condition)expression或

我正在阅读Hadley Wickham的advanced R简介,其中他指出[(和+,-,{,等等)是函数,因此[可以这样使用

> x <- list(1:3, 4:9, 10:12)
> sapply(x, "[", 2)
[1]  2  5 11

所以我认为它没有其他用途?

这是语法和语义之间的根本区别。语义要求在R-中,诸如子集和
如果
etc是函数。这就是为什么R定义函数
`[`
`if`

还有语法。R的语法规定,
if
的语法是
if(condition)expression
if(condition)expression else expression
。同样,R中的子集语法是
obj[args…]
。也就是说,
]
只是一个语法元素,它没有语义等价物,也没有相应的功能(与
else
相同)

为了让这一点更加清楚:

  • [
    ]
    是R中的语法元素,用于限定子集表达式
  • 相比之下,
    `[`
    (注意倒勾!)是一个实现子集操作的函数

然而,不知何故,我希望
]
在默认情况下是一个语法元素:从末尾开始索引。因此我在代码中自己定义它:

 "]" <- function(x,y) if (y <= length(x)) x[length(x)+1-y] else NA

另一种思考方式是,R的解析器使用
]
来标识对
[
的调用在哪里结束。这是我假设的,但我想检查一下,因为在这个示例上面有几行,下面的引用被放在:“要理解R中的计算,有两个口号很有帮助:存在的一切都是对象。发生的一切都是函数调用。”-约翰·查伯萨,这意味着]本身不是一个语法元素,只有在组合[…]中,它指的是基元函数“
[
”(在反勾中)?@Xizam是的,没错。钱伯斯的引语仍然准确:
]
不是“发生”的东西,也不是“存在”的东西(至少在R的语义中不是这样)。这只是语法上的糖分。同样,注释既不是对象也不是函数:它们只存在于R的代码表示中,而不是在其语义中。@KonradRudolph非常好,明白了。谢谢!看起来有点像(但不完全相同)
tail
。我不确定我喜欢使用符号而不是函数的表达性名称。
 "]" <- function(x,y) if (y <= length(x)) x[length(x)+1-y] else NA
sapply(x, "]", 1)
[1]  3  9 12
sapply(x, "]", 2)
[1]  2  8 11