我想将反应式计时器重置为零,然后再次开始计数到10000。
如果您在10秒钟内按下重置按钮,则永远不会打印“定时器触发”。
我认为这可能有效,但是没有。
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)
}
答案 0 :(得分:1)
这应该做:
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)
答案 1 :(得分:0)
我不是100%肯定我了解您想要的行为。如果您按“重置”,则计时器应重新从0开始,否则不应打印“计时器触发”。因为使用reactiveTimer
或invalidateLater
,您的代码将每x毫秒重新执行一次。
我想出了这个小例子。如果希望在按下“重置”时不显示“定时器触发”,则必须包括loopit()
部分。如果您只想重置计时器,请使用loopit()
删除行。
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)
}