如果 `[` 是 R 中的子集函数,那么 `]` 是什么?

If `[` is a function for subsetting in R, what is `]`?

我正在阅读 Hadley Wickham 的高级 R 介绍,他在其中指出 [(和 +、-、{ 等)是函数,因此 [ 可以以这种方式使用

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

这是完全可以理解的。但是,如果 [ 是子集所需的功能,那么 ] 是否有其他用途而不是语法用途?

我发现:

> `]`
Error: object ']' not found

所以我假设它没有其他用途?

这是句法和语义的根本区别。语义要求——在 R 中——子集和 if 等是 函数 。这就是为什么 R 定义函数 `[``if`

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

为了使这一点更清楚:

  • [] 是 R 中分隔子集表达式的句法元素。
  • 相比之下,`[`(注意反引号!)是一个实现子集操作的函数

不过,我原以为 ] 是一个语法元素,默认情况下:从末尾开始索引。所以我自己在我的代码中定义它:

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