【问题标题】:if else statement concatenation - Rif else 语句连接 - R
【发布时间】:2019-03-04 19:03:53
【问题描述】:

这是一个非常常见的问题:12345,但我什至找不到问题的答案。

If a == 1, then do X.
If a == 0, then do Y.
If a == 0 and b == 1, then do Z.

只是为了解释一下:无论b 的值如何,if else 语句都必须执行Y if a==0。但是如果b == 1a == 0Z 将对Y 已经完成的内容进行额外的更改。

我当前的代码及其错误:

if (a == 1){
X
} else if(a == 0){
Y
} else if (a == 0 & b == 1){ 
Z}

Error in !criterion : invalid argument type

【问题讨论】:

    标签: r if-statement


    【解决方案1】:

    else 仅在之前的 if没有发生时才会发生。

    当你说

    但如果b == 1a == 0Z 将对Y 已经完成的内容进行额外的更改

    那么你有两个选择:

    ## Option 1: nest Z inside Y
    if (a == 1){
      X
    } else if(a == 0){
      Y
      if (b == 1){ 
        Z
      }
    }
    
    
    ## Option 2: just use `if` again (not `else if`):
    if (a == 1) {
      X
    } else if(a == 0) {
      Y
    }
    
    if (a == 0 & b == 1) {  
      Z
    }
    

    真的,这里根本不需要任何else

    ## This will work just as well 
    ## (assuming that `X` can't change the value of a from 1 to 0
    if (a == 1) {
      X
    }
    
    if (a == 0) {
      Y
      if (b == 1){ 
        Z
      }
    }
    

    当您想要执行“最终”操作时,通常需要 else,该操作仅在没有使用之前的 if 选项时才完成,例如:

    # try to guess my number between 1 and 10
    if (your_guess == 8) {
      print("Congratulations, you guessed my number!")
    } else if (your_guess == 7 | your_guess = 9) {
      print("Close, but not quite") 
    } else {
      print("Wrong. Not even close!")
    }
    

    在上面,else 很有用,因为我不想列举用户可能输入的所有其他可能的猜测(甚至是错误的输入)。如果他们猜到 8,他们就赢了。如果他们猜 7 或 9,我告诉他们他们很接近。其他的,不管是什么,我都说“错”了。

    注意:这适用于一般的编程语言。它不是 R 独有的。

    但是,由于这是在 R 标签中,我应该提到 R 有 if{}else{}ifelse(),它们是不同的。

    • if{}(以及可选的else{})评估单个条件,您可以运行代码在{} 中执行任何事情,具体取决于该条件。
    • ifelse() 是一个向量化函数,它的参数是testyesnotest 计算为 TRUE 和 FALSE 值的布尔向量。 yesno 参数必须是与test 长度相同的向量。结果将是一个与test 长度相同的向量,对应的值为yes(当test 为TRUE)和no(当test 为FALSE)。

    【讨论】:

      【解决方案2】:

      我相信您想像这样在第二个条件中包含 Z:

      if (a == 1){X}
      else if(a == 0){
          Y
          if (b == 1){Z}
      }
      

      【讨论】:

        猜你喜欢
        • 2019-04-09
        • 1970-01-01
        • 1970-01-01
        • 2017-02-05
        • 1970-01-01
        • 1970-01-01
        • 2020-09-06
        • 1970-01-01
        • 2020-06-17
        相关资源
        最近更新 更多