Пользовательский ввод при выполнении R-кода в пакетном режиме
Я ищу способ получить пользовательский ввод внутри цикла при выполнении в пакетном режиме.
readLines()
а также scan()
работают хорошо для меня только в интерактивном режиме, в пакетном режиме они начинают читать в строках кода как пользовательский ввод, если весь код не окружен {}
, что неудобно. Мне нужно простое решение, чтобы получить только 1 целое число таким образом, чтобы я мог просто ввести значение и нажать клавишу ВВОД, так что
- поле ввода (если решение включает графический интерфейс) должно автоматически получить фокус и
- 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, а значение - "".
Если вы просто ожидаете одну часть информации и не знаете эту часть до начала выполнения сценария (предположительно, необходимо принять решение, которое зависит от результатов, ранее полученных в сценарии), тогда одна альтернатива - просто разбить ваш скрипт на три части:
- все до момента принятия решения.
- интерактивный скрипт, который запрашивает ввод
- все после точки принятия решения.
И просто соедините все три вместе, имея первый конец, вызывая второй в интерактивном сеансе. Тогда имейте второй конец, вызывая третий.