我现在很困惑!首先我在R中学到了它是不可能的,但我经常忘记它,它有时会起作用。然后它再也不起作用了!我开始认识到这种模式 - 它适用于for循环或其他块语句,但不适用于外部:
for (i in 1:10) {
if (0)
a <- 1
else
a <- 2
b <- 3
}
对我没有意义......任何解释?和手动参考?在我阅读的每个R资源中,似乎括号都是必要的:
if (0) {
a <- 1
} else {
a <- 2
}
PS:不是重复,标记的问题甚至不讨论没有括号的变体,这是我的问题的核心。它正在谈论换行的必要性。
答案 0 :(得分:2)
当整个“ if”语句括在大括号中时(如函数主体中一样),则不需要“ else”与“ if”的右括号位于同一行。 / p>
此代码产生语法错误:
a <- 1
if (a >1)
{
print("a is greater than 1")
}
else
{
print ("a is not greater than 1")
}
这不是唯一原因是因为添加了第一个和最后一个括号:
{
a <- 1
if (a >1)
{
print("a is greater than 1")
}
else
{
print ("a is not greater than 1")
}
}
答案 1 :(得分:0)
任何解释?
这里简短的回答是你需要使用括号或将else
子句放在与if
相同的行上。来自the documentation:
当if语句不在块中时,else(如果存在)必须 与statement2的结尾出现在同一行。否则新的 statement2末尾的行完成if并产生a 语法完整的语句,被评估。
所以,你可以使用它:
for (i in 1:10) {
if (0) {
a <- 1
}
else {
a <- 2
}
b <- 3
}
或者这个:
for (i in 1:10) {
if (0) a <- 1 else a <- 2
b <- 3
}
答案 2 :(得分:0)
我想为问题的为什么部分做出贡献-为什么会有两种不同的可能性
hrbrmstr声明以下SO question
当初始if后面跟随有复合表达式(由{}对表示)时,默认情况下解析器将期望该表达式后跟else也是复合的。 else的唯一定义用途是与复合表达式一起使用。甚至在文档中也有说明:if(cond)cons.expr else alt.expr其中cons.expr和alt.expr被定义为复合。正如@Berry所指出的,您可以使用R解析函数定义的方式来解决此问题,但是最好在括号使用(IMO)中保持一致。
Berry Boessenkool写道:
R逐行读取这些命令,因此它认为在if语句后执行表达式之后您就完成了。请记住,您可以使用if而无需添加其他。