点击同一按钮之间的时间间隔 - 闪亮的R

时间:2018-01-15 16:43:34

标签: r shiny

很抱歉提出虚假问题。我很确定它有一个简单的解决方案,但我仍然无法弄明白。

我有一个操作按钮,我多次点击它,我应该有点击之间的时间间隔。

示例,

我现在点击按钮,两分钟后再次点击,第二次点击后再过4分钟,第三次点击后再过5分钟,依此类推。

2分钟=第二次点击和第一次点击之间的时差

4分钟=第三次点击和第二次点击之间的时差

5分钟=第四次点击和第三次点击之间的时差

我可以用两个按钮来做,这很简单但只有一个按钮我不知道它会是怎样的。

谢谢,

3 个答案:

答案 0 :(得分:3)

这是一个简单的例子。您可以将所有点击时间存储在reactiveVal中,只要点击observeEvent,就会使用actionButton更新此向量,并在此向量上使用diff来计算时间以秒为单位的间隔希望这有帮助!

library(shiny)
ui <-   fluidPage(
  actionButton('mybutton','press me'),
  textOutput('mytext'),
  textOutput('mytext2')
)

server <- function(input,output)
{
  click_times <- reactiveVal()
  observeEvent(input$mybutton, {
    click_times(c(click_times(),Sys.time()))
  })

  # print all intervals in seconds
  output$mytext <- renderText({
    if(length(click_times())<2)
    {'Less than two clicks!'} else {
      paste0('Time intervals: ', paste(round(diff(click_times()),2),collapse=' seconds, '),' seconds.')}
  })

  # print last interval in minutes:seconds format
  output$mytext2 <- renderText({
    if(length(click_times())<2)
    {'Less than two clicks!'} else {
      ct <- as.POSIXct(round(tail(diff(click_times()),1),2), origin = "1970-01-01", tz = "UTC")
      paste0('Last interval: ' ,format(ct,'%M:%S')) }
  })
}

shinyApp(ui,server)

enter image description here

答案 1 :(得分:2)

你可以用一个闭包来做到这一点。闭包允许函数在调用之间保持其状态。

每次运行timer()时,它都会创建一个新环境并初始化该环境中的时间。然后,它创建一个新功能,以维护对创建它的环境的访问。然后使用<<-运算符将x变量修改为一级,您可以在每次调用函数时存储时间。


library(shiny)

timer <- function(){
  x <- Sys.time()
  y <- function(){
    y <- x
    x <<- Sys.time()
    return(x-y)
  }
  return(y)
}

# Implement a simple shiny app with an action button that
# prints the result of running click()
ui <- fluidPage(
  actionButton("do", "Click Me")
)

server <- function(input, output, session) {
  # click is defined within the server function so each
  # session has their own click function with a stored
  # time.
  click <- timer()
  observeEvent(input$do, {print(click())})
}

shinyApp(ui, server)

有关此技术的更多信息,您可以阅读Hadley Wickham的Advanced R: Functional Programming

编辑:如果你想在第一次点击时忽略第一次点击/返回其他内容,你可以这样做:

library(shiny)

timer <- function(){
  x <- NULL
  y <- function(){
    y <- x
    x <<- Sys.time()
    if(is.null(y))
      return("first click")
    return(x-y)
  }
  return(y)
}

# Implement a simple shiny app with an action button that
# prints the result of running click()
ui <- fluidPage(
  actionButton("do", "Click Me")
)

server <- function(input, output, session) {
  # click is defined within the server function so each
  # session has their own click function with a stored
  # time.
  click <- timer()
  observeEvent(input$do, {print(click())})
}

shinyApp(ui, server)

答案 2 :(得分:0)

您可以使用包library(tictoc)。使用reactiveVal并使用按钮本身作为计数器。

library(shiny); library(tictoc)
ui <- fluidPage(actionButton("timer", "click me"), textOutput("text"))
server <- function(input, output, session) {
  time = reactiveVal()
  observeEvent(input$timer, handlerExpr = {
    time(capture.output(toc()))
    tic()})
  output$text = renderText({ifelse(is.null(time()), "start!", paste0(time(), " : Time difference between click No", input$timer, " and click No", max(0, input$timer - 1)))})
}
shinyApp(ui, server)