Подтвердить что ты не робот

Почему: = разрешено как оператор инфикса?

Я столкнулся с популярным пакетом data.table, и одна вещь, в частности, заинтриговала меня. Он имеет оператор присваивания местами

: =

Это не определено в базе R. На самом деле, если вы не загрузили пакет data.table, это вызвало бы ошибку, если вы попытались использовать его (например, a := 2) с сообщением:

Ошибка: не удалось найти функцию ":="

Кроме того, почему работает :=? Почему R позволяет определить := как инфиксный оператор, а каждая другая функция infix должна быть окружена %%, например.

`:=` <- function(a, b) {
   paste(a,b)
}

"abc" := "def"

Очевидно, что это не означает альтернативный синтаксис %function.name% для определения функций infix. Использует ли data.table некоторые синтаксические особенности R? Это взломать? Будет ли оно "исправлено" в будущем?

4b9b3361

Ответ 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.