我的R函数的输出很奇怪

时间:2018-07-16 10:42:07

标签: r

我的书面R函数有一个小问题。我编写了一个小游戏,您必须猜一个数字。游戏会告诉您您的猜测是高于还是低于您要猜测的数字。如果您猜到正确的数字,游戏就会结束。

现在我不了解的事情: 当我开始游戏并在第一次迭代中输入正确的数字时,一切都很好。 但是,例如当我在第一次迭代中输入一个字符(第一个if子句会捕获该字符),然后在第二次迭代(或任何其他迭代)中输入正确的数字时,我得到了自己的错误消息,“发生未知错误”,以及来自R本身的警告“ Ingue(x):强制引入的NA”。

很显然,我的程序无法定义用户给出的数字是否等于生成的数字。至少不是每次迭代都包含第一次迭代。但是为什么呢?

有关输入高于或低于生成的数字的if子句按预期工作。

我希望有人能帮助我/向我解释我做错了:)预先感谢!

代码如下:

guess <- function(rng) {
  cat("Which number are we looking for?", "\n")
  a <- readline()
  # print(a)
  if (is.na(as.numeric(a))) {
    cat("Please enter a number!", "\n")
    guess(rng)
  }
  a <- as.numeric(a)
  # cat("rng is", rng)
  if (a == rng) {
    return("Congratulations! You guessed right - 100 points for you!")
  }
  if (a < rng) {
    cat("The number we are looking for is greater than your guessed number!", "\n")
    guess(rng)
  }

  if (a > rng) {
    cat("The number we are looking for is lower than you guessed number!", "\n")
    guess(rng)
  }
  stop("Unknown error occured!")
}


guessTheNumber <- function(lower_border=1, upper_border=5) {
  x <- as.numeric(sample(lower_border:upper_border, 1))
  cat("The number we are looking for is", x, ".", "\n") # for testing purposes
  guess(x)
}

2 个答案:

答案 0 :(得分:0)

以防万一有人遇到类似问题:

问题出在R中的功能环境。每次调用函数时,它都会创建自己的环境(带有变量,值等)。因此,当一个函数调用自身并且被调用自身结束时,调用函数及其环境仍然处于活动状态。因此,此功能继续进行,这使我的第一个if子句变得毫无意义。这会导致字符输入出现问题。

所以问题解决了:)

答案 1 :(得分:0)

如果您会使用if-else if-else,那么它就可以正常工作

guess <- function(rng) {
  cat("Which number are we looking for?", "\n")
  a <- readline()
  # print(a)
  if (is.na(as.numeric(a))) {
    cat("Please enter a number!", "\n")
    guess(rng)
  } else{
    a <- as.numeric(a)
    # cat("rng is", rng)
    if (a == rng) {
      return("Congratulations! You guessed right - 100 points for you!")
    } else if (a < rng) {
      cat("The number we are looking for is greater than your guessed number!", "\n")
      guess(rng)
    } else if (a > rng) {
      cat("The number we are looking for is lower than you guessed number!", "\n")
      guess(rng)
    } else stop("Unknown error occured!")
  }
}