【问题标题】:Parsing "->" assignment operator in R在 R 中解析“->”赋值运算符
【发布时间】:2014-06-12 03:30:12
【问题描述】:

我的问题是关于解析 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
}

如您所见,所有“->”赋值运算符都更改为“”案例吗?

【问题讨论】:

  • 你试过询问 r-devel 邮件列表吗?他们可能对正在发生的事情有更好的了解。
  • 只是出于兴趣,您检查length(fun_tree) 以确保那里没有更多“隐藏”吗?
  • @ScottRitchie 我对这个建议不太满意——它导致了 StackOverflow 想要阻止的那种分裂。为什么这有关系?一方面,SO 比邮件列表更容易搜索(或者更确切地说,更容易找到)。
  • 确实如此,我绝不是暗示不应该在这里问这个问题。我的意思是建议其他资源也可以咨询。

标签: r parsing abstract-syntax-tree assignment-operator


【解决方案1】:

我可以确定我总是在语法树中得到“

让我们看看……

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

所以是的,-&gt; 赋值总是被解析为 &lt;-(当调用 -&gt; 作为函数名时,同样为真!1) .

由于parse’s keep.source argument,您的第一个显示是相反的:

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

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

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

但是,没有-&gt; 函数(尽管您可以定义一个),并且编写b -&gt; a 永远不会调用-&gt; 函数,它总是被解析为a &lt;- b,而后者又调用@ 987654337@ 函数或原语。

【讨论】:

  • 那么有没有一些历史说明为什么 -&gt; 在解析过程中只是被反转了就存在?
  • @Thomas 我不知道原因。我有时在 R 的 REPL 中使用它,因为我已经迭代地编写了一个很长的表达式(即通过缓慢地构建它)并且现在想要将其结果分配给一个变量而不必重新键入它,或者将光标放回开头线。懒惰,真的。有几种语言 (TI BASIC) 的分配从左到右 (42 → x)。
  • 我同意康拉德的观点,因为我认为 -> 存在的原因是因为方便。您不应该在脚本中使用它,但是如果您在命令行上,当您忘记将其分配给某物时,更容易将 -&gt; myvar 添加到行尾,并且 R 确实提供了仅用于使您的在命令行上生活更轻松。
  • 一个相当离题的好奇心:你知道 R 曾经允许 _ 分配吗?这是 R 1.8.0 中的 removed
  • 另请参阅this Q&A,了解如何更详细地解析-&gt;
【解决方案2】:

这有点离题,但我认为从左到右的赋值运算符可以用于快速命令行输入以外的情况。因此,这是定义此类运算符的一种方法:

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

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

【讨论】:

    猜你喜欢
    • 2011-05-20
    • 2016-04-08
    • 2014-03-23
    • 2016-07-13
    • 2018-11-13
    • 2011-08-02
    • 2019-10-06
    • 2015-12-25
    • 2011-11-16
    相关资源
    最近更新 更多