我的问题是用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;”情况?
答案 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代码。