Пользовательский ввод при выполнении R-кода в пакетном режиме

Я ищу способ получить пользовательский ввод внутри цикла при выполнении в пакетном режиме.

readLines() а также scan() работают хорошо для меня только в интерактивном режиме, в пакетном режиме они начинают читать в строках кода как пользовательский ввод, если весь код не окружен {}, что неудобно. Мне нужно простое решение, чтобы получить только 1 целое число таким образом, чтобы я мог просто ввести значение и нажать клавишу ВВОД, так что

  1. поле ввода (если решение включает графический интерфейс) должно автоматически получить фокус и
  2. ENTER должен инициировать конец ввода / отправки.

Я не могу найти способ сделать это, чтобы удовлетворить оба условия, например ginput() from gWidgets активирует поле ввода, но ENTER не запускает отправку формы.

2 ответа

Решение

Вот как я решил свою проблему:

require(gWidgets)
options(guiToolkit="RGtk2")

INPUT <- function(message) {
  CHOICE <- NA
  w <- gbasicdialog(title=message, handler = function(h,...) CHOICE <<- svalue(input))
  input <- gedit("", initial.msg="", cont=w, width=10)
  addHandlerChanged(input, handler=function (h, ...) {
    CHOICE <<- svalue(input)
    dispose(w)
  })
  visible(w, set=TRUE)
  return(CHOICE)
}

repeat{
  x=INPUT("Input an integer")
  if(!is.na(as.integer(x))) break
}
print(x)

Обновить:

Я не могу проверить это прямо сейчас, но взгляните на ?menu и это всплывающее окно графического интерфейса.
Я не уверен, что это сработает, но он отличается тем, что требует ответа щелчка мышью.


оригинальный ответ:

Согласно документации к ?readline:

Это можно использовать только в интерактивном сеансе.
..
При неинтерактивном использовании результат выглядит так, как если бы ответ был RETURN, а значение - "".

Если вы просто ожидаете одну часть информации и не знаете эту часть до начала выполнения сценария (предположительно, необходимо принять решение, которое зависит от результатов, ранее полученных в сценарии), тогда одна альтернатива - просто разбить ваш скрипт на три части:

  • все до момента принятия решения.
  • интерактивный скрипт, который запрашивает ввод
  • все после точки принятия решения.

И просто соедините все три вместе, имея первый конец, вызывая второй в интерактивном сеансе. Тогда имейте второй конец, вызывая третий.

Другие вопросы по тегам