цикл while () не прерывается даже при правильном вводе - PullRequest
0 голосов
/ 01 июня 2019

Я следил за видео на Youtube, в котором рассказывалось о том, как создать интерактивное меню в R. Я сделал некоторые вещи из оригинального видео, но ничего радикального, что могло бы создать или сломать код (по крайней мере, я так думаю).

видео на YouTube, которое я смотрел:

https://www.youtube.com/watch?v=uaPBpJArh0M

Выскочило меню, и я попытался ввести ненулевые значения. Я ожидал, что после ввода «1» появится следующее сообщение:

1. Binomial
2. Poisson
3. Geometric
4. Negative Binomial
5. Hypergeometric
6. Uniform
7. Normal
8. Exponential
Please choose a menu item: 1
Good choice!

Выбор любого другого ненулевого числа даст вместо этого следующее сообщение:

1. Binomial
2. Poisson
3. Geometric
4. Negative Binomial
5. Hypergeometric
6. Uniform
7. Normal
8. Exponential
Please choose a menu item: 2
Bad choice.

И выбор любого другого вывода, например 0 или любого нецелого числа, приведет к появлению сообщения «Пожалуйста, выберите пункт меню»:

''» Пожалуйста, выберите пункт меню: 0 Пожалуйста, выберите пункт меню: s '' '

Однако, несмотря на наличие допустимых входов ненулевых значений, цикл продолжал прерываться.

Please choose a menu item: 1
Please choose a menu item: 2
Please choose a menu item: 3
Please choose a menu item: 4
Please choose a menu item: 5
Please choose a menu item: 6
Please choose a menu item: 7

Определенная функция, которая, кажется, работает, - это часть кода:

inputNumber <- function(prompt) {
  # Usage: num = inputNumber(prompt)
  # 
  # Displays prompt and asks for a number. 
  # Repeats until user inputs a valid number.
  while(TRUE) {
    num = suppressWarnings(as.numeric(readline(prompt)))
    if(!is.na(num)) {
      break
    }
  }
}

displayMenu <- function(options) {
  # Usage: choice = displayMenu(options)
  # 
  # Displays a menu of options,
  # ask the user to choose an item,
  # and return the number of the menu item chosen.
  # 
  # Input   options   Menu options (cell array of strings)
  # Output  choice    Chosen option (integer)

  # Display menu options
  for (i in 1:length(options)) {
    cat(sprintf("%d. %s\n", i, options[i]))
  }

  # Gets a valid menu choice
  choice <- 0
  while (!any(choice == 1:length(options))) {
    choice = inputNumber("Please choose a menu item: ")
  }

  return(choice)
}

# Define menu options
menuItems   <- c("Binomial", "Poisson", "Geometric", "Negative Binomial", "Hypergeometric", "Uniform", "Normal", "Exponential")

  # Displays the menu
  choice <- displayMenu(menuItems)

  if(choice == 1) {
    print("Good choice!")
  } else {
    print("Bad choice.")
  }

1 Ответ

0 голосов
/ 02 июня 2019

Функция inputNumber ничего не возвращает, вы просто ломаете ее, не присваивая ей значение.Вместо этого используйте return, что остановит while и вернет значение для вызова функции.

inputNumber <- function(prompt) {
  # Usage: num = inputNumber(prompt)
  # 
  # Displays prompt and asks for a number. 
  # Repeats until user inputs a valid number.
  while(TRUE) {
    num = suppressWarnings(as.numeric(readline(prompt)))
    if(!is.na(num)) {
      return(num)
    }
  }
}

displayMenu <- function(options) {
  # Usage: choice = displayMenu(options)
  # 
  # Displays a menu of options,
  # ask the user to choose an item,
  # and return the number of the menu item chosen.
  # 
  # Input   options   Menu options (cell array of strings)
  # Output  choice    Chosen option (integer)

  # Display menu options
  for (i in 1:length(options)) {
    cat(sprintf("%d. %s\n", i, options[i]))
  }

  # Gets a valid menu choice
  choice <- 0
  while (!any(choice == 1:length(options))) {
    choice = inputNumber("Please choose a menu item: ")
  }

  return(choice)
}

# Define menu options
menuItems   <- c("Binomial", "Poisson", "Geometric", "Negative Binomial", "Hypergeometric", "Uniform", "Normal", "Exponential")

# Displays the menu
choice <- displayMenu(menuItems)

if(choice == 1) {
  print("Good choice!")
} else {
  print("Bad choice.")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...