在 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)
我想用 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)