【问题标题】:Run shiny events at specified system times在指定的系统时间运行闪亮的事件
【发布时间】:2021-07-18 02:21:53
【问题描述】:

作为我正在进行的闪亮项目的一部分,我需要在用户按下操作按钮后的指定时间播放某些 mp3。

下面是一个简化的例子。该应用程序显示当前系统时间(并将其更新为时钟),显示指定的第一个时间点何时是(target1)以及距离该时间还剩多少时间。时间点 2 相同。为简单起见,这些时间点之间的差异为 30 秒。

在最后两段代码中,我试图让闪亮在系统时间等于 t1 时播放指定的音频文件,然后在时间达到 t2 时播放另一个音频文件。 但这部分不起作用。

你有什么建议吗?

谢谢

更新:

看起来这里的操作按钮造成了一些不必要的复杂性,所以我从 observeEvent 更改为 observe 我现在需要的只是在达到t1t2 点时播放音频文件。 这是基于此修改和以下建议的更新代码,但它仍然无法正常工作(即,当计时器到达 t1t2 时,我听不到声音播放。

更新代码:



library(shiny)



# Define UI for displaying current time ----
ui <- fluidPage(
  
  h2(textOutput("currentTime")),
  br(),
  br(),
  h2(textOutput("target1")),
  h2(textOutput("till1")), 
  br(),
  br(),
  h2(textOutput("target2")), 
  h2(textOutput("till2")), 
  uiOutput('my_audio1'), 
  uiOutput('my_audio2') 
)



server <- function(input, output, session) {
  
  
  
  output$currentTime <- renderText({
    invalidateLater(1000, session)
    paste("The current time is", Sys.time())
  })
  
  t1 <- isolate({
    Sys.time() + 5
  })
  
  t2 <- isolate({
    Sys.time() + 10
  })
  
  
  output$target1 <- renderText({
    
    paste("Target:1", t1)
  })
  
  output$target2 <- renderText({
    
    paste("Target:2", t2)
  })
  
  output$till1 <- renderText({
    invalidateLater(1000, session)
    
    paste("Seconds till target 1:", t1-Sys.time())
  })
  
  output$till2 <- renderText({
    invalidateLater(1000, session)
    
    paste("Seconds till target 2:", t2-Sys.time())
  })
  
  
  
  observe({
    if(Sys.time() >= t1 & Sys.time() <= t2) {
      
      output$my_audio1 <-renderUI(tags$audio(src = "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-3.mp3", type = "audio/mp3", autoplay = NA, controls = NA, style="display:none;"))
      
    }
  })
  
  
  observe({
    if(Sys.time() >= t2){
      
      output$my_audio2 <-renderUI(tags$audio(src = "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-7.mp3", type = "audio/mp3", autoplay = NA, controls = NA, style="display:none;"))
      
    }
  })
  
  
}

# Create Shiny app ----
shinyApp(ui, server)

以前的代码

library(shiny)
 


# Define UI for displaying current time ----
ui <- fluidPage(
  
  h2(textOutput("currentTime")),
  br(),
  br(),
  h2(textOutput("target1")),
  h2(textOutput("till1")), 
  br(),
  br(),
  h2(textOutput("target2")), 
  h2(textOutput("till2")), 
  
  actionButton("play", "Start"), 
  br(),
  br()
  
)


 
server <- function(input, output, session) {
  
  
 
  output$currentTime <- renderText({
    invalidateLater(1000, session)
    paste("The current time is", Sys.time())
  })
  
  t1 <- isolate({
    Sys.time() + 30
  })
  
  t2 <- isolate({
    Sys.time() + 60
  })
  
    
  output$target1 <- renderText({
 
      paste("Target:1", t1)
    })
  
  output$target2 <- renderText({
 
      paste("Target:2", t2)
    })
  
  output$till1 <- renderText({
    invalidateLater(1000, session)
 
    paste("Seconds till target 1:", t1-Sys.time())
  })
   
  output$till2 <- renderText({
    invalidateLater(1000, session)
 
    paste("Seconds till target 2:", t2-Sys.time())
  })
  
 
  
  observeEvent(input$play, {
    if(Sys.time() == t1){
      
      insertUI(selector = "#play",
               where = "afterEnd",
               ui = tags$audio(src = "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3", type = "audio/mp3", autoplay = NA, controls = NA, style="display:none;")  
      ) 
    }
  })
  
  
  observeEvent(input$play, {
    if(Sys.time() == t2){
      
      insertUI(selector = "#play",
               where = "afterEnd",
               ui = tags$audio(src = "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-7.mp3", type = "audio/mp3", autoplay = NA, controls = NA, style="display:none;")  
      ) 
    }
  })
  
  
}

# Create Shiny app ----
shinyApp(ui, server)

【问题讨论】:

  • 我会尝试使用'shinyjs'包的delay函数。
  • @StéphaneLaurent 感谢您的指导。会试一试并发布更新。
  • @StéphaneLaurent 我试过了,但我无法指定某个时间点(例如 12:30:00)。该函数仅支持使用毫秒。我尝试使用一些数学(例如减法)但没有奏效。你有什么额外的指导吗?延迟功能网上的例子不多。谢谢

标签: r shiny shiny-reactivity


【解决方案1】:

我认为问题出在Sys.time() == t1

如果您注意到您的倒计时从未达到 0(此时 Sys.time() 将等于 t1),因此很难在正确的时刻点击该按钮。

不确定您的目标是什么,但您可以使用Sys.time() &gt;= t1 修复它,这样您就可以在时间过去后播放音频。

您可以使用Sys.time() &gt;= t1 &amp; Sys.time() &lt;=t2 使其仅在两次之间可用。

如果您希望按钮单击接近“精确”时间,您可以使用Sys.time() &gt;= t1 - 30 &amp; Sys.time() &lt;= t1 + 30 提供一个 1 秒的窗口。

您可以将其中任何一个与 cmets 中提到的 shinyjs 中的 delay() 函数结合使用以获得更多选项。

【讨论】:

  • 感谢这些建议。这是完全有道理的,但由于某种原因,我仍然无法使其工作。为简单起见,我通过删除action button 在问题主干中添加了另一个修改。如果可以请看一下。我只想在Sys.time() 等于t1t2 时播放音频。
猜你喜欢
  • 2019-05-20
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
相关资源
最近更新 更多