单击同一按钮之间的时间间隔-R

单击同一按钮之间的时间间隔-R,r,shiny,R,Shiny,很抱歉问了个愚蠢的问题。我很肯定它有一个简单的解决方案,但我仍然无法找到它 我有一个动作按钮,我点击它几次,我应该有两次点击之间的时间间隔 示例, 我现在点击按钮,两分钟后再点击,第二次点击后再点击4分钟,第三次点击后再点击5分钟,依此类推 2分钟=第二次单击和第一次单击之间的时间差 4分钟=第三次单击和第二次单击之间的时间差 5分钟=第四次单击和第三次单击之间的时间差 我可以用两个按钮,这很简单,但用一个按钮,我不知道它会是什么 谢谢,这里有一个简单的例子。您可以将所有单击时间存储在react

很抱歉问了个愚蠢的问题。我很肯定它有一个简单的解决方案,但我仍然无法找到它

我有一个动作按钮,我点击它几次,我应该有两次点击之间的时间间隔

示例,

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

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

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

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

我可以用两个按钮,这很简单,但用一个按钮,我不知道它会是什么


谢谢,这里有一个简单的例子。您可以将所有单击时间存储在
reactiveVal
中,在任何时候单击
action按钮
时使用
observeEvent
更新此向量,并在此向量上使用
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)
库(闪亮)

ui您可以通过闭包来实现这一点。闭包允许函数在调用之间保持其状态


每次运行
timer()
时,它都会创建一个新环境并初始化该环境中的时间。然后,它创建了一个新函数,用于维护对创建它的环境的访问。然后使用
可以使用包
库(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)
库(闪亮);图书馆(tictoc)

到目前为止,你用一个按钮尝试了什么?就像小菜一碟。这是一个很好的解决方案。然而,这种技术的一个缺点是,如果你在一台服务器上(或本地)托管你的应用程序,并且多个用户共享一个进程,那么它将不起作用-尝试通过在浏览器中复制粘贴URL一次打开两个会话。如果用户1单击,然后用户2单击,您将获得用户2上次单击和用户1上次单击之间的时间间隔,而不是一个用户后续单击之间的时间间隔。这是因为
@Florian你当然是对的。我已经编辑了我原本应该写的答案。使用
@Eumenedies的好处,我没有想到,这确实是一个简单而干净的解决方案。@Eumenedies,我该如何忽略您解决方案中的第一次单击?因为我第一次点击时不应该得到答案。只是出于好奇@Florian。你的解决方案是几分钟而不是几秒钟?因为您使用了diff函数。您可以将数字除以60得到秒数,然后执行
number%%60
得到分钟数。或者,您可以转换到
POSIXct
并从那里格式化,请参阅我的更新答案。