Итак, это своего рода тривиальный вопрос, но он подталкивает меня к тому, что я не могу ответить на него, и, возможно, ответ научит меня более подробной информации о том, как работает R.
В названии говорится все: как R parse ->
, скрытая функция назначения справа?
Мои обычные трюки, чтобы погрузиться в это не удалось:
`->`
Ошибка: объект
->
не найден
getAnywhere("->")
не найден объект с именем
->
И мы не можем назвать это напрямую:
`->`(3,x)
Ошибка: не удалось найти функцию
"->"
Но, конечно, он работает:
(3 -> x) #assigns the value 3 to the name x
# [1] 3
Кажется, что R знает, как просто изменить аргументы, но я думал, что вышеупомянутые подходы, несомненно, взломали бы случай:
pryr::ast(3 -> y)
# \- ()
# \- `<- #R interpreter clearly flipped things around
# \- `y # (by the time it gets to `ast`, at least...)
# \- 3 # (note: this is because `substitute(3 -> y)`
# # already returns the reversed version)
Сравните это с оператором регулярного присваивания:
`<-`
.Primitive("<-")
`<-`(x, 3) #assigns the value 3 to the name x, as expected
?"->"
, ?assignOps
, а R Language Definition все просто упоминает об этом в качестве правильного оператора присваивания.
Но там явно что-то уникальное в том, как используется ->
. Это не функция/оператор (как показывают вызовы getAnywhere
и непосредственно на `->`
), так что это? Это полностью в своем классе?
Есть ли что-нибудь, чему можно научиться, кроме того, ->
полностью уникален в пределах языка R в том, как он интерпретируется и обрабатывается, запоминается и перемещается "?