Parsing “->” assignment operator in R

丶灬走出姿态 提交于 2019-12-01 02:27:09

can I be sure that I always get "<-" operator in syntax tree

Let’s see …

> quote(b -> a)
a <- b
> identical(quote(b -> a), quote(a <- b))
[1] TRUE

So yes, the -> assignment is always parsed as <- (the same is not true when invoking -> as a function name!1).

Your first display is the other way round because of parse’s keep.source argument:

> parse(text = 'b -> a')
expression(b -> a)
> parse(text = 'b -> a', keep.source = FALSE)
expression(a <- b)

1 Invoking <- as a function is the same as using it as an operator:

> quote(`<-`(a, b))
a <- b
> identical(quote(a <- b), quote(`<-`(a, b)))
[1] TRUE

However, there is no -> function (although you can define one), and writing b -> a never calls a -> function, it always gets parsed as a <- b, which, in turn, invokes the <- function or primitive.

This is slightly off topic, but I think that a left-to-right assignment operator can be used in cases beyond fast command-line typing. So, here's one way to define such an operator:

"%op%"<- function(a,b) eval(substitute(b<-a), parent.frame())

I am using this to avoid duplicating R-code when storing/loading a set of matrices and vectors to/from a vector (Error: object '->' not found in R).

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!