如何解决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)
所以我的问题是:
解决方法
真的,这更多是我认为的解析问题。命令
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 举报,一经查实,本站将立刻删除。