R: предложите 5 секунд, чтобы потребовать паузу. Если пауза не потребовалась, возобновите процесс

Как я могу предложить 5 секунд пользователю написать что-то, чтобы попросить паузу неопределенной длины. Если в течение этих 5 секунд пауза не требуется, процесс продолжается. Если требуется пауза, у пользователя есть все время (и), в котором он нуждается, и он может нажать "enter", чтобы возобновить процесс всякий раз, когда он захочет.

Интерес такой функциональности заключается в том, что если пользователь отсутствует, пауза длится всего 5 секунд. И если пользователь присутствует, то он может наслаждаться паузой, чтобы наблюдать за графиком, который был создан, например.

В конечном итоге код может выглядеть следующим образом:

DoYouWantaPause = function(){
   myprompt = "You have 5 seconds to write the letter <p>. If you don't the process will go on."

   foo = readline(prompt = myprompt, killAfter = 5 Seconds)    # give 5 seconds to the user. If the user enter a letter, then this letter is stored in `foo`.

   if (foo == "p" | foo == "P") {    # if the user has typed "p" or "P"
        foo = readline(prompt = "Press enter when you want to resume the process")  # Offer a pause of indefinite length
   }
}

# Main
for (i in somelist){
    ...
    DoYouWantaPause()
}

Ответ 1

Вот небольшая быстрая функция, основанная на пакетах tcltk и tcltk2:

library(tcltk)
library(tcltk2)

mywait <- function() {
    tt <- tktoplevel()
    tmp <- tclAfter(5000, function()tkdestroy(tt))
    tkpack( tkbutton(tt, text='Pause', command=function()tclAfterCancel(tmp)))
    tkpack( tkbutton(tt, text='Continue', command=function()tkdestroy(tt)),
        side='bottom')
    tkbind(tt,'<Key>', function()tkdestroy(tt) )

    tkwait.window(tt)
    invisible()
}

Запустите mywait, и появится небольшое окно с 2 кнопками. Если вы ничего не сделаете, то через 5 секунд окно исчезнет, и mywait вернется, позволяя R продолжить. Если вы нажмете "Продолжить" в любое время, он сразу же вернется. Если вы нажмете "Пауза", обратный отсчет прекратится и будет ждать, пока вы нажмете "Продолжить" (или нажмете клавишу), прежде чем продолжить.

Это расширение ответа, данного здесь.