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

r data.table colon-equals

1269 просмотра

2 ответа

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

знак равно

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

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

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

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

"abc" := "def"

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

Автор: xiaodai Источник Размещён: 12.11.2019 09:51

Ответы (2)


31 плюса

Решение

Это то, что базовый синтаксический анализатор R распознает и, кажется, анализирует как левое назначение (по крайней мере, в терминах или порядке операций и тому подобное). Смотрите исходный код C для более подробной информации.

as.list(parse(text="a:=3")[[1]])
# [[1]]
# `:=`
# 
# [[2]]
# a
# 
# [[3]]
# [1] 3

Насколько я могу судить, это недокументировано (что касается базы R). Но это функция / оператор, вы можете изменить поведение

`:=`<-function(a,b) {a+b}
3 := 7
# [1] 10

Как видите, в самой части ":" нет ничего особенного. Это просто начало составного токена.

Автор: MrFlick Размещён: 09.10.2014 02:54

7 плюса

Это не просто оператор двоеточия, а :=один оператор, образованный двоеточием и знаком равенства (так же, как комбинация «<» и «-» образует оператор присваивания в базе R). :=Оператор является функцией инфиксной, которая определяется как часть оценки «J» аргумент внутри [.data.tableфункции. Он создает или присваивает значение столбцу, указанному его аргументом LHS, используя результат оценки его RHS.

Автор: 42- Размещён: 09.10.2014 02:56
Вопросы из категории :
32x32