2015-09-28 3 views
13

Разобравшись в исходном R код (файл R-3.2.2/src/main/gram.y линии 2836 в 2852) я обнаружил, что R парсер/токенизатор считает, что := является LEFT_ASSIGNMENT маркера.Что такое оператор назначения R: = for?

Но при попытке использовать его в качестве оператора присваивания в R.3.2.2,
у меня есть ошибка (невозможно найти функцию для := ...), но, как вы можете видеть, R считает это как задание, как <-:

> myVar := 42 
Erreur : impossible de trouver la fonction ":=" 
> := 
Erreur : unexpected assignment in ":=" 
> <- 
Erreur : unexpected assignment in "<-" 

это ошибка, или же токен := необходимо удалить из исходного кода токенизатора?

Есть ли история о := оператора в R?

+2

': =' очень удобный оператор внутри 'data.table' насколько я знаю, но не (пока?) в R. – daroczig

+2

Несвязанный - почему половина ошибки ошибки R на английском языке? Я предполагаю, что у вас установлен языковой стандарт на французский. –

+0

http://www.stackoverflow.com/questions/7033106 http://stackoverflow.com/questions/26269423 – Frank

ответ

5

Для уточнения, операторы присваивания R: <- и =.

Чтобы получить информацию о них типа:

?`<-` 

Вместо <- в командной строке. Также существует оператор <<-, влияющий на переменную в родительской среде.

Относительно :=, этот оператор является оператором j в data.table пакете. Его можно прочитать defined as и можно использовать только в объекте data.table. Для иллюстрации этого мы изменяем второй столбец b (определить col2 со значением b), когда значения в первом седловине равны 1:

library(data.table) 

dt = data.table(col1=c(1,2,1,2,3), col2 = letters[1:5]) 

dt[col1==1,col2:='b'] 

Для детального объяснения:

?`:=` 

Надеется, что это проясняет.

+0

Я предполагаю, что эти строки в коде парсера - это почему ': =' можно определить. Я помню, как читал что-то подобное, но забыл, где. Может быть, Мэтт или Арун могли бы прояснить ситуацию. – Roland

+0

Эффективно пакеты data.table определяют пользовательскую функцию: =, которая использует преимущества оператора присваивания ': =', который определен в парсере/токенизаторе R, но он неофициально описан/не записан нигде в R Language ... Next вопрос: действительно ли это безопасно и будущее доказательство для всех (и для поддерживающих data.table ...), чтобы использовать этот токен: = '??? Являются ли разработчики data.table просить основную команду R добавить этот токен ': ='? –

+0

@RomainJacotin Крайне маловероятно, что R-core изменит парсер таким образом, который нарушит широко используемый пакет data.table. Они очень осторожны в отношении обратной совместимости. – Roland

11

Это был оператор ранее позволил присваивание см this article от Джона Чемберса в 2001.

Разрабатываемая версия R позволяет теперь некоторые задания должны быть написаны C- или Java-стиль, используя оператор = , Это повышает совместимость с S-Plus (а также с C, Java и многими другими языками).

Все ранее разрешенные операторы присваивания (< -: =, _, и < < -) остаются полностью в силе.

Кажется, функция := больше нет, но вы можете «повторно включить его», как это:

`:=` <- `<-` 
x:=3 
x 
[1] 3 
+0

Спасибо, Джеймс, теперь ясно. –

+0

James, FYI кажется, что «_» в настоящее время не рассматривается как задание парсером/токенизатором R-3.2.2 (просто введите его в командной строке, и у вас будет «неожиданный ввод», а не «неожиданное задание») как вы это сделаете, набрав только «<-» или «: =» или «<< -» –

+0

@RomainJacotin Да, подчеркивание было удалено как оператор назначения в версии 1.8.0, я не нашел упоминания в news files about ': =' хотя. http://svn.r-project.org/R/trunk/doc/NEWS.1 – James