解析“ - >” R中的赋值运算符

时间:2014-04-26 10:38:37

标签: r parsing 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]]

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

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
})

var <- 0

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

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

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

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

2 个答案:

答案 0 :(得分:17)

  

我能确定我总能得到&#34;&lt; - &#34;语法树中的运算符

让我们看看......

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

所以是的,->赋值总是被解析为<-(在调用->作为函数名时,为真! 1 )。

由于parse’s keep.source argument

,您的第一个显示是相反的
> parse(text = 'b -> a')
expression(b -> a)
> parse(text = 'b -> a', keep.source = FALSE)
expression(a <- b)

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

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

但是,没有->函数(尽管您可以定义一个),并且编写b -> a从不调用->函数,它总是被解析为a <- b,反过来,它调用<-函数或原语。

答案 1 :(得分:0)

这稍微偏离主题,但我认为在快速命令行输入之外的情况下可以使用从左到右的赋值运算符。所以,这是定义这样一个运算符的一种方法:

public class Client
{
   public string FirstName { get; set; }
   public string LastName { get; set; }
   //...
}

Client client = new Client();
client.FirstName = "James";
client.LastName = "";

我使用它来避免在向/从向量(Error: object '->' not found in R)存储/加载一组矩阵和向量时重复R代码。