Почему: = разрешено как оператор инфикса?
Я столкнулся с популярным пакетом data.table
, и одна вещь, в частности, заинтриговала меня. Он имеет оператор присваивания местами
: =
Это не определено в базе R. На самом деле, если вы не загрузили пакет data.table
, это вызвало бы ошибку, если вы попытались использовать его (например, a := 2
) с сообщением:
Ошибка: не удалось найти функцию ":="
Кроме того, почему работает :=
? Почему R позволяет определить :=
как инфиксный оператор, а каждая другая функция infix должна быть окружена %%
, например.
`:=` <- function(a, b) {
paste(a,b)
}
"abc" := "def"
Очевидно, что это не означает альтернативный синтаксис %function.name%
для определения функций infix. Использует ли data.table
некоторые синтаксические особенности R? Это взломать? Будет ли оно "исправлено" в будущем?
Ответы
Ответ 1
Это то, что базовый анализатор R распознает и, кажется, анализирует как левое назначение (по крайней мере, в терминах или порядке операций и тому подобное). Дополнительную информацию см. В исходном коде > .
as.list(parse(text="a:=3")[[1]])
# [[1]]
# `:=`
#
# [[2]]
# a
#
# [[3]]
# [1] 3
Насколько я могу сказать, это недокументировано (в отношении базы R). Но это функция/оператор, вы можете изменить поведение
`:=`<-function(a,b) {a+b}
3 := 7
# [1] 10
Как вы можете видеть, действительно нет ничего особенного в самой части ":". Это просто начало составного токена.
Ответ 2
Это не просто оператор двоеточия, а :=
- это один оператор, образованный двоеточием и знаком равенства (так же, как комбинация "<" и "-" формирует оператор присваивания в базе R). Оператор :=
является инфиксной функцией, которая определена как часть оценки аргумента "j" внутри функции [.data.table
. Он создает или присваивает значение столбцу, обозначенному его аргументом LHS, используя результат оценки его RHS.