在 Shiny 中跟踪响应时间

Tracking Response Time in Shiny

我想用 Shiny 编写一个程序来跟上与各种对象交互所花费的响应时间。最简单的模拟类似于计时匹配游戏,其中用户必须 select 一个特定的 object/stimulus,我希望能够稍后(即,在应用程序完成后)找出每个回复是否正确。

我已经知道该程序的大部分内容;但是,无论如何,我在 Shiny 中找不到跟上响应时间的方法,更不用说作为与反应元素交互的函数了。根据初步搜索,似乎 Javascript 可能有解决方案;但是,我知道零 Javascript 经验,也没有任何将它与 Shiny 集成的经验。

有谁知道使用现有 R/Shiny 语言来执行可用于计时对多个对象的响应的计数计时器的方法?或者,有没有人有更好的解决方案来计时我可能遗漏的响应?

编辑:上述问题已解决,但在答案的扩展中出现了新问题

我最初将其作为评论留下,但它太长了,不符合长度要求。我提出了一个新问题。这一次,我想保留一个 运行 选项卡,记录任意两次点击之间花费的时间,但不知道用户可能提交了多少次点击。我已经使用给定的代码尝试了一些,但我无法让它工作(下面的相关部分,没有其他任何改变):

if(total_timestamps == 2){
     duration <- rbind(duration, as.numeric(difftime(new_val[2],new_val[1],units = "secs")))
     new_val[1] <- new_val[2]
     new_val <- new_val[-2, ]
     click_timestamps(new_val)
           ### other things to do 
  }

我的想法是切换旧值和新值,然后删除最旧的值,为新值腾出空间继续循环,但它并没有像我希望的那样工作。想法或帮助?

您不需要 JavaScript。您可以创建一个反应值,并在每次单击元素时为其附加值。如果你需要观察多个不同的元素,那就写更多的观察者。

library(shiny)

ui <- fluidPage(
  actionButton("button","Click"),
  tags$h2("Response Time"),
  tags$div(id = "duration")
)

server <- function(input, output, session) {
    click_timestamps <- reactiveVal(NULL)
    observeEvent(input$button,{
        new_val <- append(click_timestamps(),Sys.time())
        # set click timestamp
        click_timestamps(new_val)

        total_timestamps <- length(new_val)
        if(total_timestamps == 2){
            duration <- as.numeric(difftime(new_val[2],new_val[1],units = "secs"))
            insertUI(
                selector = "#duration",
                ui = tags$p(paste0("Seconds between clicks: ", duration))
            )
            # reset click timestamp
            click_timestamps(NULL)
        }



    })

}

shinyApp(ui, server)