Редактировать : заранее, это также не работает с RStudio.Поскольку я уверен, что RStudio действительно перехватывает и контролирует довольно много R, в то время как возможно, что C_menu
имеет какой-то другой метод управления (например, options
), я думаю, что более вероятно, что RStudio перехватываетнажатия клавиш (при этом принудительное использование <enter>
).С учетом этого, я полагаю, что это склоняется к ошибке / запросу функции с RStudio.
Если вы посмотрите на источник для utils::menu
, вы увидите в конце, что он делает:
repeat {
ind <- .Call(C_menu, as.character(choices))
if (ind <= nc)
return(ind)
cat(gettext("Enter an item from the menu, or 0 to exit\n"))
}
Это говорит о том, что функцию C_menu
(не экспортируемую) можно (ab) использовать для выполнения того, что вы хотите.Я не знаю внутреннюю работу функции, поэтому некоторые эмпирические выводы / предостережения:
- обычно (но не всегда [1]), первый проход в цикле
repeat
требует вводадля любой записи; - после этой первой
<enter>
, она представляется без <enter>
для однозначных целых чисел, все остальное поддерживает некоторую произвольную длину и требует <enter>
repeat {
ret <- .Call(utils:::C_menu, letters)
if (ret == 0L) break
cat(" you entered ", ret, "\n")
}
# Selection: 345 # I typed "345<enter>"
# you entered 345
# Selection: 3 # just "3", no enter
# you entered 3
# Selection: 4
# you entered 4
# Selection: 5
# you entered 5
# Selection: # just enter
# you entered 27
# Selection: C # "C<enter>"
# you entered 27
# Selection: c # "c<enter>"
# you entered 3
# Selection: abc # "abc<enter>"
# you entered 27
# Selection: 0 # just "0", no enter, it quits
Я предполагаю, что 27
означает, что я ввел что-то, не входящее в исходный выбор (letters
).
Не уверен, что вы можете адаптировать свой процесс к этому, как кажетсябыть ограниченным однозначными числами (как только вы пройдете первую запись).Я еще не нашел источник для этого, чтобы увидеть, есть ли функция-компаньон с другими аргументами.
Примечания:
- Я могу нечасто получить код дляобрабатывать ввод без ввода с первого раза, не уверен, что это вопрос моего редактирования кода (emacs / ess) или что-то еще.Если это так, то, скорее всего, это где-то ошибка.