Можно ли использовать функцию readline R без необходимости нажимать клавишу ввода? - PullRequest
1 голос
/ 11 июля 2019

Я пишу небольшую функцию, требующую ввода данных пользователем, которую я кодировал для использования функции readline, но хочу исключить необходимость для пользователя нажимать клавишу [ввод] после ответа на приглашение в консоли.

Я много раз искал в SO, но не нашел решения, а документация readline не содержит потенциальных решений.

timer <- function() {
require(tictoc) #load required package

experiment_no <- readline("Experiment number: ")

while(T){       #open infinite while loop
    tic()       #start timer
    input_state=readline("State input: ")  #allow for entry of state
    if(input_state %in% 1:5){    #check if it's acceptable 
        elapsed=toc()            #if it is then end timer and record data
        write.table(cbind(experiment_no,input_state,elapsed$toc-elapsed$tic),'results.txt',col.names=F,row.names=F,quote=F,append=T)
    }else if(input_state=='t'){  #if input is 't' 
        break                    #break out of while loop
    }else if(input_state <1 | input_state > 5 & input_state!='t'){#if input is not and accepted state AND is not 't'
     print('thats not an allowed state- please try another')
     } 
 }
}

Я бы хотел, чтобы пользователь мог вводить номер эксперимента в консоль без нажатия клавиши ввода.

1 Ответ

0 голосов
/ 15 июля 2019

Редактировать : заранее, это также не работает с 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).

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

Примечания:

  1. Я могу нечасто получить код дляобрабатывать ввод без ввода с первого раза, не уверен, что это вопрос моего редактирования кода (emacs / ess) или что-то еще.Если это так, то, скорее всего, это где-то ошибка.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...