我对->
的性质感到困惑,我无法像其他运算符一样得到它的定义,它的行为与<-
不同。见下文:
print(`<-`) # .Primitive("<-")
print(`->`) # Error in print(`->`) : object '->' not found
另外,我无法劫持它,但如果我尝试R,R不会触发任何错误:
`->` = `+` # attempting to hijack `->`, no error
print(`->`) # function (e1, e2) .Primitive("+"), seems like it worked
1 -> 3 # Error in 3 <- 1 : invalid (do_set) left-hand side to assignment
1 -> test1
print(test1) # 1, hijacking failed
`->`(1,3) # 4, this works
使用<-
(或我尝试的任何其他操作员),我可以这样做:
`<-` = `+`
print(`<-`)
1 <- 3 # 4
1 <- test2 # Error: object 'test2' not found
rm(list=ls()) # back to sanity
那是怎么回事?
答案 0 :(得分:4)
> e <- quote(42 -> x)
> e
x <- 42
R中只有一个赋值运算符:<-
(好吧,两个:那里有=
但是不要让事情复杂化。 解析器解释符号&#34; ->
&#34;作为赋值,并创建表达式,就像使用<-
一样。
答案 1 :(得分:2)
更多的评论而不是答案,但可能很长。
似乎->
由解析器处理,解析器检测分配的左侧和右侧,然后调用<-
。跟随你的黑客:
`<-` = `+`
1 -> 3
#[1] 4
看看发生了什么? ->
运算符基本上没有时间执行,因为解析器不允许它,除非您明确地调用它:
`->` = `+`
`->`(5,6)
#[1] 11