代码之家  ›  专栏  ›  技术社区  ›  Julien Massardier

等待用户输入5秒钟,否则使用默认值

  •  5
  • Julien Massardier  · 技术社区  · 7 年前

    我想给用户一个输入的机会,如果他们在5秒后没有输入任何内容,则使用默认值。

    以下是输入部分的示例:

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

    有没有办法在R中实现这一点?

    3 回复  |  直到 7 年前
        1
  •  2
  •   manotheshark    7 年前

    下面是我如何完成一个窗口提示,允许用户选择集群中要启动的线程数。它使用默认值,然后在按下OK按钮或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

        2
  •  1
  •   Aaron Hayman    7 年前

    如果你有更新版本的R,那么你可以试试 withTimeout 功能来自 utils 包,以包装readline函数。

    在base R中有一个很难使用的函数叫做 setTimeLimit .

    我试图找到一个解决方案

    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)
    }
    

    因此,我不能推荐这段代码,但它可能会激励您去做一些可行的事情

        3
  •  -1
  •   César Arquero Cabral    7 年前

    我找不到跳过控制台中的交互的方法。无论如何,我留下了一个关于时间的函数,如果你在时间之外按enter键跳过promt,你会得到一个预定义的值。我希望这是一种保存控制台交互的方法。

    #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)