for循环上->右箭头和<-左箭头的不同行为

问题描述

Since R3.0一个for循环返回NULL(如记录所示):

x <- for(i in 1:3) {i+1}
x
# NULL

但是,使用右箭头赋值,似乎返回了最后一个值:

for(i in 1:3) {i+1} -> x
x
# [1] 4

documentation没有对->进行评论,并且as pointed by Ben Bolker仍然->似乎已转换为<-

expression(1 -> x)
# expression(x <- 1)

所以我的问题是:

  1. 这是错误还是误会?
  2. 在这种情况下,-><-的行为为什么会有所不同?

解决方法

真的,这更多是我认为的解析问题。命令

for(i in 1:3) {i+1} -> x

实际上被解析为类似的东西

for(i in 1:3) {
   x <- {i+1}
}

借助lobstr软件包,您可以在AST中看到这种情况

lobstr::ast(for(i in 1:3) {i+1} -> x)
o-`for` 
+-i 
+-o-`:` 
| +-1 
| \-3 
\-o-`<-` 
  +-x 
  \-o-`{` 
    \-o-`+` 
      +-i 
      \-1 

所以赋值是循环体的一部分。例如,您也可以毫无错误地运行它

for(i in 1:3) {i+1} ^2

或者看看你从这个表达式中得到什么

for(i in 1:3) {i+1} + {print(i)}
# [1] 1
# [1] 2
# [1] 3

循环主体表达式不会在第一个大括号的结尾处终止。它在行的结尾处结束(或者您可以将其以;结尾或通过将其嵌套在代码块中)。这在赋值运算符中不是唯一的。

所以这不是一个错误,只是语法有点混乱。您所期望的看起来更像

{for(i in 1:3) {i+1}} -> x

仍然返回NULL。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...