播放声音时,我希望能够使用另一个按钮停止播放。或者当再次按下播放按钮时,声音的播放应该停止,然后从头开始播放。
我在 R Shiny 中使用闪亮js 努力实现这一点,但没有成功。这是我的代码:
library(shiny)
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
shiny::actionButton('sound' ,'Play sound'),
shiny::actionButton('stopper','Stop sound')
)
server <- function(input, output) {
observeEvent(input$sound,
{
shinyjs::runjs("snd.pause();")
shinyjs::runjs("var snd = new Audio('https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3'); snd.play();")
})
observeEvent(input$stopper,
{
shinyjs::runjs("snd.pause();")
})
}
shinyApp(ui = ui, server = server)
该代码的灵感来自以下代码:https://community.rstudio.com/t/how-to-stop-audio-with-shinyjs/122650.
因此,我们的想法是,在按下“播放声音”按钮后,可以使用“停止声音”按钮提前停止播放,或者当过早按下“播放声音”按钮时,播放应该停止并随后从头开始。
这有可能吗?
解决方法很简单,你需要在调用
snd
之前全局定义shinyjs
,而不是直接在shinyjs
中定义它。
library(shiny)
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
shiny::actionButton('sound' ,'Play sound'),
shiny::actionButton('stopper','Stop sound'),
tags$script("var snd;")
)
server <- function(input, output) {
observeEvent(input$sound,
{
shinyjs::runjs("snd.pause();")
shinyjs::runjs("snd = new Audio('https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3'); snd.play();")
})
observeEvent(input$stopper,
{
shinyjs::runjs("snd.pause();")
})
}
shinyApp(ui = ui, server = server)
原因是每个
runjs
位于不同的函数调用范围内;当你想在另一个snd
中使用runjs
时,它是undefined
,因为当前作用域或父作用域没有这个变量,所以你要先全局定义它。您可能想搜索有关 JS 中作用域如何工作的更多详细信息。