Подождите 5 секунд пользовательского ввода и в противном случае используйте значение по умолчанию - PullRequest
0 голосов
/ 09 января 2019

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

Вот для входной части:

input <- readline(prompt="Do something? (y/n): ")

Есть ли способ сделать это в R?

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Если у вас более новая версия R, вы можете попробовать функцию withTimeout из пакета utils, чтобы обернуть функцию readline.

В базе R существует сложная в использовании функция, называемая setTimeLimit.

Моя попытка решить проблему Это сработало в RGui, но, похоже, также надежно рухнуло в R-studio

timed_readline <- function(prompt = '',default,timeout = 10)
{
    inner <- function(timeout)    # wrapped in internal function to stop error being displayed
    {
        setTimeLimit(elapsed=timeout,transient=TRUE)
        a <- readline('')
        setTimeLimit(transient=TRUE)
        return(a)
    }

    cat(prompt)
    b <- default
    try({b <- inner(timeout)},silent=TRUE) 
    return(b)
}

Как таковой, я не могу рекомендовать этот код, но он может вдохновить вас на что-то работоспособное

0 голосов
/ 10 января 2019

Вот как я выполняю запрос окна, позволяющий пользователю выбрать количество потоков для запуска в кластере. Он использует значение по умолчанию и затем продолжит работу после нажатия кнопки ОК или 5-секундного прохода.

library(tcltk2)

clusterCount = 1

tklist <- list()
tklist <- within(tklist, {
  # define processor input window
  win1 <- tktoplevel()
  rb1 <- tk2radiobutton(win1)
  rb2 <- tk2radiobutton(win1)
  rb3 <- tk2radiobutton(win1)
  rb4 <- tk2radiobutton(win1)
  rbCluster <- tclVar(clusterCount)
  tkconfigure(rb1, text = "one",  variable = rbCluster, value = 1L)
  tkconfigure(rb2, text = "two",  variable = rbCluster, value = 2L)
  tkconfigure(rb3, text = "three", variable = rbCluster, value = 3L)
  tkconfigure(rb4, text = "four", variable = rbCluster, value = 4L)
  onOK <- function() {
    clusterCount <<- as.integer(tclvalue(rbCluster))
    tkdestroy(win1)
  }
  butOK <- tk2button(win1, text = "OK", width = -8, command = onOK)

  # geometry manager
  tkgrid(tk2label(win1, text = "how many cores?"), padx = 10, pady = c(15, 5))
  tkgrid(rb1, padx = 10, pady = c(0, 5))
  tkgrid(rb2, padx = 10, pady = c(0, 15))
  tkgrid(rb3, padx = 10, pady = c(0, 15))
  tkgrid(rb4, padx = 10, pady = c(0, 15))
  tkgrid(butOK, padx = 10, pady = c(5, 15))
  tclAfter(5000, function() tkdestroy(win1)) # delay for prompt and then close window to proceed
  tkfocus(win1)
  tkwait.window(win1)
})

После закрытия окна clusterCount останется по умолчанию 1 или может быть изменено на 2, 3 или 4.

0 голосов
/ 09 января 2019

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

#set time in seconds to get an answer from prompt 
#some interaction in console is needed, sorry

Q <- function (x) {
    t0 <- Sys.time() 
    input <- readline(prompt="Do something? (y/n): ")
    tf <- Sys.time()-t0

    if (tf > x){
        input <- "your predefined answer"
    }

    print (tf) #remove if you like
    return (input)
}

Q(5)
...