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

时间:2017-01-09 13:03:32

标签: r syntax primitive

我正在阅读Hadley Wickham的高级R介绍,他说[(和+, - ,{等)是函数,所以[可以这样使用

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

这是完全可以理解的。但是,如果[是子集所需的函数,是否]有另一种用法而不是语法的用途?

我发现:

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

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

2 个答案:

答案 0 :(得分:10)

这是语法和语义之间的根本区别。语义要求 - 在R中 - 像子集和if之类的东西是函数。这就是R定义函数`[``if`等等的原因。

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

要使这一点更清晰:

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

答案 1 :(得分:0)

不知怎的,我希望]默认是一个语法元素:从结尾索引。所以我在我的代码中自己定义它:

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