2017-01-09 35 views
9

Я читаю передовые введение R Хэдли Уикхемом, где он утверждает, что [(и +, -, {и т.д.) являются функциями, так что [можно использовать таким образомЕсли `[` является функцией для подмножества в 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) expression, либо if (condition) expression else expression. Аналогично, синтаксис подмножества в R равен obj[args…]. То есть ] является просто синтаксическим элементом и не имеет семантического эквивалента, не имеет соответствующей функции (такой же, как else).

Чтобы сделать это, возможно, еще яснее:

  • [ и ] являются синтаксическими элементами R, которые разграничивают выражение подмножества.
  • В отличие от этого, `[` (обратите внимание на обратные метки!) Является функцией , которая реализует операцию подмножества.
+2

Другим способом думать об этом является то, что ']' используется анализатором АиРа, чтобы определить, где вызов на '[' заканчивается. – Benjamin

+0

Это то, что я предполагал, но хотел проверить, так как пара строк линии над этим примером помещалась следующая цитата: «Чтобы понять вычисления в R, полезны два лозунга: Все, что существует, является объектом. Все, что происходит, это вызов функции. » - John Chambers – Xizam

+0

А, значит, это и не является синтаксическим элементом, только когда в комбинации [...], где оно относится к примитивной функции '' ['' (in backticks)? – 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

Выглядит немного как (но не идентичны) 'tail'. Не уверен, что мне нравится использование символов вместо выразительных имен для функций. –

Смежные вопросы