微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。