【问题标题】:if statement in R can only have one line?R中的if语句只能有一行?
【发布时间】:2013-03-23 12:05:28
【问题描述】:

我正在尝试一个带有 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的值,但也想显示它,我该怎么办?非常感谢

【问题讨论】:

  • 这看起来你可能来自 python,其中空格很重要。作为一般规则,大多数语言(R、C、Java、javascript)不关心空格。您可以输入的所有制表符、回车符和空格都不会改变任何事情。他们使用方括号 {} 将代码组合成块。现有答案提到了这一点,但不是一般的高级想法。

标签: r if-statement grammar


【解决方案1】:

确切地说,这不是关于行,而是关于语句。您可以将整个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 是否出现在下一个。这在sourced 代码中是不同的——下一行很清楚它是哪种形式。

分号也结束语句:

> 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"

花括号将语句组合成一个语句。

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

【讨论】:

  • 感谢您的重播,我会继续看帮助文件,R中的技能太漂亮了
【解决方案2】:

您必须使用{} 来允许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)
    }
}

【讨论】:

  • 这只有在while循环中才有效。来自R Language Definition:“当 if 语句不在块中时,else(如果存在)必须与 statement2 的末尾出现在同一行。否则 statement2 末尾的新行完成 if 并在语法上产生 a求值的完整语句。一个简单的解决方案是使用用大括号括起来的复合语句,将 else 与标记语句结束的右大括号放在同一行。"
【解决方案3】:

要对语句进行分组,请用花括号将它们括起来,就像您在 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 中放置多个语句。

【讨论】:

    【解决方案4】:

    如前所述,直接的答案是使用花括号;
    值得补充的是,您可以将&lt;- 赋值运算符集成到许多函数中。

    在您的具体情况下:

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


    请注意,在这里使用=工作。必须是&lt;-

    【讨论】:

    • 这个例子没有问题,但只有在函数中实际评估参数时才会发生赋值。效果就像是表达式被传递给函数,而不是值(就像在 C/C++ 中一样)。示例:g &lt;- function(x) {} ; n &lt;- 1; g(n &lt;- 2); n
    • @MatthewLundberg,绝对是。这就是为什么我对我的声明进行了限定,表明它可以与 许多 函数一起使用。 :)
    【解决方案5】:

    是的,您可以使用花括号为每个条件语句包含多个语句:

    if (condition){
        statement 1
        print()
    }
    else{
        statement 2 
        print()
    } 
    

    补充:如果你只想在一行中使用 if 和 else 语句,你可以使用这个:

    ifelse(condition, statement1, statement2)
    

    【讨论】:

      【解决方案6】:

      听说过大括号吗?

      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)
          }
      }
      

      【讨论】:

      • 看起来这个答案有很多反对意见。我想知道这是为什么?
      • @RicardoSaporta 刻薄评论?没有解释? [顺便说一句,我没有投反对票] 可耻的人在投反对票时不会离开 cmets...
      • 感谢您的支持。它不是为了克服那种刻薄的。可能更多的是fortune(271)
      • 正确。然而,通过 OP 给出的例子,她/他显然 听说过 花括号。问题之一是知道如何正确使用它们。通过对看似“技术上正确”的答案的许多反对票进行猜测,似乎很明显。
      • 其实我是新来的,虽然我对论坛有所了解,但说实话,我对stackoverflow的规则了解不多,在我的内心深处,我感谢所有帮助过的人我的问题好心,可能有一些误解或错误,请原谅我可能的错误和操作
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      相关资源
      最近更新 更多