在R中解析" - >"赋值运算符

bar*_*ukm 17 parsing r abstract-syntax-tree assignment-operator

我的问题是在R语言中解析表达式.让我跳到一个例子中:

fun_text <- c("
0 -> var
f1 <- function()
{
    0 -> sum_var
    sum_var2 = 0
    sum_var3 <- 0
}

(function()
{
    0 -> sum_var
    sum_var2 = 0
    sum_var3 <- 0
})->f2

f3 = function(x)
{
  0 -> sum_var
  sum_var2 = 0
  sum_var3 <- 0
}

")

fun_tree <- parse(text=fun_text)
fun_tree 
fun_tree[[1]]
fun_tree[[2]]
fun_tree[[3]]
fun_tree[[4]]
Run Code Online (Sandbox Code Playgroud)

之后,我们获得了这些结果:

expression(0 -> var, f1 <- function()
{
    0 -> sum_var
    sum_var2 = 0
    sum_var3 <- 0
}, (function()
{
    0 -> sum_var
    sum_var2 = 0
    sum_var3 <- 0
})->f2, f3 = function(x)
{
    0 -> sum_var
    sum_var2 = 0
    sum_var3 <- 0
})
Run Code Online (Sandbox Code Playgroud)

var <- 0
Run Code Online (Sandbox Code Playgroud)

f1 <- function() {
    sum_var <- 0
    sum_var2 = 0
    sum_var3 <- 0
}
Run Code Online (Sandbox Code Playgroud)

f2 <- (function() {
    sum_var <- 0
    sum_var2 = 0
    sum_var3 <- 0
})
Run Code Online (Sandbox Code Playgroud)

f3 = function(x) {
    sum_var <- 0
    sum_var2 = 0
    sum_var3 <- 0
}
Run Code Online (Sandbox Code Playgroud)

如您所见,所有" - >"赋值运算符都更改为"< - ",但不是第一个示例(仅限"fun_tree").我的问题是:为什么?并且我可以确定我总是在语法树中得到"< - "运算符,所以我不能打扰自己实现" - >"情况吗?

Kon*_*lph 17

我可以确定我总是在语法树中得到"< - "运算符

让我们来看看 …

> quote(b -> a)
a <- b
> identical(quote(b -> a), quote(a <- b))
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

所以,是的,在->分配总是解析为<-(同样是调用当真正->作为一个函数的名字!1).

你的第一个显示的是另一种方式圆,因为parsekeep.source说法:

> parse(text = 'b -> a')
expression(b -> a)
> parse(text = 'b -> a', keep.source = FALSE)
expression(a <- b)
Run Code Online (Sandbox Code Playgroud)

1<-作为函数调用与将其用作运算符相同:

> quote(`<-`(a, b))
a <- b
> identical(quote(a <- b), quote(`<-`(a, b)))
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

但是,没有->函数(虽然你可以定义一个),而写函数b -> a永远不会调用->函数,它总是被解析为a <- b,然后调用<-函数或原语.

  • 一个相当偏离主题的好奇心:你知道R曾经允许`_`来分配吗?这已在R 1.8.0中[删除](http://cran.rstudio.com/src/base/NEWS.1). (2认同)