Функция UserInput - PullRequest
       4

Функция UserInput

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

Я написал код, который отвечает на некоторые вопросы пользователя и выполняет функцию, но мое состояние слишком плохое. если ответ yes, выполните функцию x, если ответ no, перейдите к функции x. Проблема в том, что любой ответ, кроме функции yes, переходит x

Оригинальный код

userInput <- function(question) {
  cat(question)
  con <- file("stdin")
  on.exit(close(con))
  n <- readLines(con, n = 1)
  return(n)
}

if (opt$indexBuild) {
  if (!file.exists(file.path(paste(index_Folder, '/', 'Genome', sep = '')))) {
    index_genom <- star.index.function()
  }else{
    write(paste("Index genome files already exists."), stderr())
    if (casefold(userInput("Would you like to delete and re-run index generation? (yes or no) "), upper = FALSE) == 'yes') {
      index_genom <- star.index.function()
    }
  }
}

Я пробовал использовать во время цикла, но безуспешно.

userInput <- function(question) {
  cat(question)
  con <- file("stdin")
  on.exit(close(con))
  n <- readLines(con, n = 1)
  return(n)
}

    if (opt$indexBuild) {
      if (!file.exists(file.path(paste(index_Folder, '/', 'Genome', sep = '')))) {
        index_genom <- star.index.function()
      }else{
        write(paste("Index genome files already exists."), stderr())
        while (casefold((!(userInput("Would you like to delete and re-run index generation? (yes or no) ") %in% c('yes', 'no'))))) {
          write(paste("You should specify 'yes' or 'no' "), stderr())

        }

        index_genom <- star.index.function()
      }

    }

opt $ indexBuild это внешний параметр.

Вывод «в порядке». Это делает то, что я ожидаю, но если ответ yes или no, код выполняет ту же функцию.

(Рис.1) Если ответ не положительный или нет, продолжайте спрашивать, если да, выполните index_genom <- star.index.function(). это правильно.

(Рис.2) Если ответ не положительный или нет, продолжайте спрашивать, если нет, выполните index_genom <- star.index.function(). это не правильно.

Ответы [ 2 ]

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

Большое спасибо, Гершт.Ваш код работает на терминале R, но не на терминале Linux.Я думаю, что это потому, что функция readline(), поэтому я отредактировал ее, используя мою функцию userImput().Я не думал о цикле repeat.

Еще раз спасибо

repeat {
  inp <- userInput("Would you like to delete and re-run index generation? (yes or no) ")

  if (inp %in% c("yes", "no")) break()
  else write("Specify 'yes' or 'no'", stderr())
}

if (inp == "yes") index_genom <- star.index.function() 
0 голосов
/ 28 июня 2019

Вам нужен цикл, в котором вы фиксируете пользовательский ввод, а затем делаете разные вещи в зависимости от того, что это за ввод.Например, вы можете переписать ваш цикл while, чтобы сделать что-то вроде этого (обратите внимание, что я заменил userInput на readline, потому что первый не работал для меня):

repeat {
    inp <- casefold(readline("Delete and generate new index? (yes/no) -> "))

    if (inp %in% c("yes", "no")) break
    else write("Specify 'yes' or 'no'", stderr())
}

if (inp == "yes") index_genom <- star.index.function()

Как вывидите, я сохранил пользовательский ввод в inp, выход из цикла выполняется только тогда, когда inp имеет значение да или нет , а затем я вызываю index_genom <- star.index.function(), если inp == "yes".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...