R 重置反应计时器
我想将反应计时器重置为零,然后再次开始计数到10000 如果在10秒内按下重置按钮,“计时器触发”将不会打印 我想这可能行得通,但不行R 重置反应计时器,r,shiny,R,Shiny,我想将反应计时器重置为零,然后再次开始计数到10000 如果在10秒内按下重置按钮,“计时器触发”将不会打印 我想这可能行得通,但不行 require('shiny') if (interactive()) { ui <- fluidPage( actionButton("reset_button", "Reset") ) server <- function(input, output) { autoInvalidate <- reacti
require('shiny')
if (interactive()) {
ui <- fluidPage(
actionButton("reset_button", "Reset")
)
server <- function(input, output) {
autoInvalidate <- reactiveTimer(10000)
observe({
autoInvalidate()
print ("timer fires")
})
observeEvent(input$reset_button,
{
autoInvalidate <- reactiveTimer(10000)
print("reset")
}
)
}
shinyApp(ui, server)
}
require('shinny'))
if(interactive()){
ui这应该做到:
library(shiny)
ui <- fluidPage(
actionButton("reset_button", "Reset"),
textOutput("text")
)
server <- function(input, output, session) {
v <- reactiveValues(timer = Sys.time()+5)
observe({
invalidateLater(100)
if(v$timer <= Sys.time()){
v$timer <- Sys.time()+5
print("timer fires")
}
})
observeEvent(input$reset_button,{
v$timer <- Sys.time()+5
print("reset")
})
}
shinyApp(ui, server)
库(闪亮)
ui我不能100%确定我是否理解您想要的行为。如果您按下“重置”,计时器是否应该再次从0开始,或者“计时器触发”是否永远不会被打印。因为使用reactiveTimer
或invalidaterater
时,您的代码将每x毫秒重新执行一次
我举了一个小例子。如果你想在按下“重置”时“timer fires”永远不会出现,你必须包括loopit()
部分。如果你只是想重置计时器,那么就用loopit()
删除行
require('shinny'))
if(interactive()){
ui这将立即触发“观察”并在按下“重置”后重新执行它。我不确定所需的行为应该是什么,但我认为OP的第1行和第2行在某种程度上相互矛盾。这种方法对我来说效果很好。也许你在想observe()
无效,当使用重置按钮更改v$timer
时,会重新计算该值?这是真的,但如果计时器值仍在将来,则if()
条件为假,因此不会按预期发生任何事情。
require('shiny')
if (interactive()) {
ui <- fluidPage(
actionButton("reset_button", "Reset")
)
start = Sys.time()
n=10000
server <- function(input, output) {
loopit <- reactiveVal(TRUE)
observe({
invalidateLater(n)
if (loopit()) {
print(paste("start: ", start))
if (Sys.time() > start+(n/1000)) {
print ("timer fires")
}
}
})
observeEvent(input$reset_button, {
start <<- Sys.time()
loopit(FALSE)
print("reset")
})
}
shinyApp(ui, server)
}