如果R中的语句只能有一行?

时间:2013-03-23 12:05:28

标签: r if-statement grammar

我正在用if语句尝试一个很小的代码,尽管它非常简单,但我真的很困惑的是代码

n<-857
while(n!=1){
if(n<=0)
 print("please input a positive integer")
else if(n%%2==0)
 n<-n/2
 print(n)
else
 n<-3*n+1
 print(n)
  }

如上所述,在R中运行此代码时会出现错误,但如果我更改if语句,则

if(n<=0)
     print("please input a positive integer")
    else if(n%%2==0)
     n<-n/2
    else
     n<-3*n+1

没关系,我的问题是我们每次判断只能写一行吗?如果我想在每个评判后做更多的事情,我该怎么做,就像这个案例一样,我想改变n的值,但也想要显示它,我该怎么办?非常感谢你

5 个答案:

答案 0 :(得分:40)

确切地说,这不是关于行而是关于语句。您可以将整个if else语句放在一行中:

> if (TRUE) 1 else 3
[1] 1

语句将在行尾(如果完成)结束,如果逐行输入代码,则可以在交互模式下很好地看到:

> if (TRUE) 
+ 1
[1] 1
> else
Fehler: Unerwartete(s) 'else' in "else" # error: unexpected 'else' in "else"
> 3
[1] 3

if可以以if (condition) statementif (condition) statement else other.statement的形式出现,解释器假设第一个版本意味着如果语句在第2行之后完成 - 在交互模式下它无法明智地等待是否接下来会出现else。这在source d代码中是不同的 - 在那里形成它的下一行很清楚。

分号结束语句:

> if (TRUE) 1; else 3
[1] 1
Fehler: Unerwartete(s) 'else' in " else"  # error: unexpected 'else' in "else"

但是在条件的每个分支中只能有一个语句

> if (TRUE) 1; 2 else 3
[1] 1
Fehler: Unerwartete(s) 'else' in " 2 else" # error: unexpected 'else' in "2 else"

使用curly括起组语句,使它们显示为一个语句。

> if (TRUE) {1; 2} else 3
[1] 2

答案 1 :(得分:12)

您必须使用{}来允许if语句包含多行。试试这个:

n<-857
while(n!=1){
  if(n<=0){
    print("please input a positive integer")
  }

  else if(n%%2==0){
    n<-n/2
    print(n)
  }
    else {
      n<-3*n+1
      print(n)
    }
}

答案 2 :(得分:10)

要对语句进行分组,请使用大括号括起它们,就像使用while循环一样:

if(n<=0) {
     print("please input a positive integer")
} else if(n%%2==0) {
     n<-n/2
     print(n)
} else {
     n<-3*n+1
     print(n)
}

这样您就可以在ifelse if和最终else内放置多个语句。

答案 3 :(得分:1)

虽然正如已经指出的那样直接回答是使用花括号;
值得补充的是,您可以将<-赋值运算符集成到许多函数中。

在您的具体案例中:

    print(n <- 3*n+1)

   ## instead of 
   #  n <- 3*n+1
   #  print(n)

<小时/>

请注意,在此处使用= NOT 工作。必须是<-

答案 4 :(得分:0)

有没有听说过卷曲的栏杆?

n<-857
while(n!=1){
    if(n<=0) {
        print("please input a positive integer")
    } else if(n%%2==0) {
        n<-n/2
        print(n)
    } else {
        n<-3*n+1
        print(n)
    }
}