Почему: = разрешено в качестве инфиксного оператора?
1269 просмотра
2 ответа
Я наткнулся на популярный data.table
пакет, и одна вещь, в частности, заинтриговала меня. Имеет оператор присваивания на месте
знак равно
Это не определено в базе R. На самом деле, если вы не загрузили data.table
пакет, он вызвал бы ошибку, если бы вы попытались использовать его (например, a := 2
) с сообщением:
Ошибка: не удалось найти функцию
":="
Кроме того, почему :=
работает? Почему R позволяет вам определять :=
как инфиксный оператор, в то время как любая другая инфиксная функция должна быть окружена %%
, например,
`:=` <- function(a, b) {
paste(a,b)
}
"abc" := "def"
Понятно, что он не является альтернативным синтаксисом %function.name%
для определения инфиксных функций. Является ли data.table
эксплуатация некоторых причуд R? Это взломать? Будет ли это "исправлено" в будущем?
Ответы (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:547 плюса
Это не просто оператор двоеточия, а :=
один оператор, образованный двоеточием и знаком равенства (так же, как комбинация «<» и «-» образует оператор присваивания в базе R). :=
Оператор является функцией инфиксной, которая определяется как часть оценки «J» аргумент внутри [.data.table
функции. Он создает или присваивает значение столбцу, указанному его аргументом LHS, используя результат оценки его RHS.
Вопросы из категории :
- r Как получить доступ к последнему значению в векторе?
- r Пакеты оптимизации для R
- r Есть ли у R такие операторские операции, как Perl qw ()?
- r Библиотека / инструмент для рисования тройных / треугольных графиков
- r Участки без заголовков / надписей в R
- r Расчет скользящей средней
- data.table подмножество в data.table
- data.table Подмножество фрейма данных с топ-n строк для каждой группы и упорядочены по переменной
- data.table Когда мне следует использовать оператор: = в data.table?
- data.table Замена NA с последним значением не-NA
- data.table эффективные построчные операции над таблицей данных
- data.table : = (передача по ссылке) в пакете data.table одновременно изменяет другой объект таблицы данных
- colon-equals Что делает: = (двоеточие равно) в VB.NET?
- colon-equals В чем разница между = и: = в Scala?
- colon-equals Что такое оператор: =?
- colon-equals В чем разница между <= и: = в VHDL
- colon-equals Что означает двоеточие со знаком равенства ": ="