【发布时间】:2021-07-18 02:21:53
【问题描述】:
作为我正在进行的闪亮项目的一部分,我需要在用户按下操作按钮后的指定时间播放某些 mp3。
下面是一个简化的例子。该应用程序显示当前系统时间(并将其更新为时钟),显示指定的第一个时间点何时是(target1)以及距离该时间还剩多少时间。时间点 2 相同。为简单起见,这些时间点之间的差异为 30 秒。
在最后两段代码中,我试图让闪亮在系统时间等于 t1 时播放指定的音频文件,然后在时间达到 t2 时播放另一个音频文件。 但这部分不起作用。
你有什么建议吗?
谢谢
更新:
看起来这里的操作按钮造成了一些不必要的复杂性,所以我从 observeEvent 更改为 observe
我现在需要的只是在达到t1 和t2 点时播放音频文件。
这是基于此修改和以下建议的更新代码,但它仍然无法正常工作(即,当计时器到达 t1 或 t2 时,我听不到声音播放。
更新代码:
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