2017-01-09 74 views
9

我被哈德利韦翰,在那里他指出,[(和+, - ,{等)读取预研被引入的功能,以使得[可以以这种方式如果`[`是R中子集的函数,']是什么?

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

其是用于非常好,可以理解。但是,如果[是子集所需的功能]是否具有另一种用途而不是语法功能?

我发现:

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

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

回答

9

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

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

为了甚至更清楚使此:

  • []是R中的语法元素界定一个子集的表达。
  • 相反,`[`(注意反引号!)是一个函数,它实现了子集操作。
+2

另一种方式把它是']'用于由R的解析器能够识别在呼叫到'['结束。 – Benjamin

+0

这就是我假设,但要清理上,因为上面这个例子中,以下引用放在几个行线:“要理解R中的计算,两个口号是有益的:存在 一切都是对象。出现这种情况 一切都是函数调用“ - 约翰·钱伯斯 – Xizam

+0

啊,因此,这意味着]由本身是不是一个syntatical元素,只有在它是指原函数的结合[...],当'''[(反引号)? – Xizam

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

看起来有点像(但不相同)'尾巴'不确定我喜欢使用符号而不是表达式名称的函数。 –