Противоречащие операторы if else

#r #if-statement

#r #if-оператор

Вопрос:

Я создал набор данных с текущими различиями в пробеге по командам для сезона MLB 2019-2020. Я пытаюсь предсказать результат (если вы должны сделать ставку, и на какую команду вы должны сделать ставку). Это очень простая функция, но у меня возникают проблемы с утверждениями else if, противоречащими самим себе.

Обратите внимание в приведенном ниже коде, что оператор:

 if(x > y)
 

противоречит с:

 if(x > 2*y)
 

Когда я вызываю функцию с x больше, чем в два раза y, она по-прежнему возвращает «BETX», а не желаемое «LOCKX»

Я попытаюсь сделать то же самое для «LOCKY», но сначала я хотел бы разобраться с этой проблемой.

Заранее благодарю вас!

  bets <- function(x, y){
  if(x > y){
    return("BETX")
  } 
  else if(x == y){
    return("NO BET")
  }
  else if(x > 2*y){
    return("LOCKX")
  }else{
    return("BETY")
  }

}
bets(cubsdiff, diamondbacksdiff) ## BET CUBS
bets(yankeesdiff, royalsdiff) ## BET YANKS
 

Ответ №1:

Существует несколько способов решения этой проблемы.

x > 2*y сначала спросите, если

 if(x > 2*y){
    return("LOCKX")
}
else if(x > y){
    return("BETX")
}
...
 

спросите, находится ли x > 2*y внутри x>y блока

 if(x > y){
    if(x > 2*y){
        return("LOCKX")
    } else {
        return("BETX")
    }
}
...
 

или замените ваш x > y оператор составным оператором

 if (x > y amp; x <= 2*y){
    return("BETX")
} 
...
 

Ответ №2:

Ну, если, скажем, x = 50 и y = 5, тогда у вас есть x> y и x> 2 * y, так что противоречия нет.

Но вы могли бы добавить следующее к своему первому if условию:

 if (x > y amp; x <= 2*y){
    return("BETX")
  } 
 

Таким образом, вы возвращаете BETX только в том случае, если x больше, чем y, но не слишком большой (т. Е. Меньше 2 * y).

В противном случае вы могли бы сначала проверить, если x> 2y, а затем проверить, если x> y.

  bets <- function(x, y){
  if(x > 2y){
    return("LOCKX")
  } 
  else if(x == y){
    return("NO BET")
  }
  else if(x > y){
    return("BETX")
  }else{
    return("BETY")
  }

}