r - 在Shiny R中,有没有办法在observeEvent之后立即运行observeEvent而没有延迟(renderUI的问题)?

标签 r audio shiny volume

好吧,我的标题有点令人困惑,但让我解释一下。

我正在使用 renderUI 来获取音频标签,但是,我想以较低的音量启动音频,因为它太大声了。

下面的代码工作正常,除了因为我添加了延迟,它以较高的音量开始,然后迅速转到较低的音量,但它仍然非常明显。降低延迟没有帮助,我已经尝试过了。如果我删除延迟,两个observeEvents将同时运行,并且音量不会改变。如果我将 js$runs 标签(降低音量)移动到第一个observeEvent 中,它也将不起作用。我认为这是因为在observeEvent完全完成之前renderUI实际上并没有渲染。另外,我认为我无法删除 renderUI,因为在我的完整应用程序中,我需要用户输入来播放音频。

有没有办法最初以较低的音量启动音频标签? 或者有没有办法立即运行renderUI,这样就不会出现延迟?

感谢所有帮助,谢谢。

library(shiny)
library(shinyjs)


jsCode <- 'shinyjs.runs = function setHalfVolume() {document.getElementById("myaudio").volume = 0.2;}'

get_audio <- function(){
    tags$audio(id = "myaudio", controls = NA, autoplay = NA, tags$source(src="aud.mpeg"))
}


ui <- fluidPage(
    useShinyjs(),
    extendShinyjs(text = jsCode),

    uiOutput("my_audio"),

    actionButton("guessbutton", "Submit")
)

server <- function(input, output) {
    observeEvent(input$guessbutton, {
        output$my_audio <- renderUI(get_audio())
        #js$runs()
    })

    observeEvent(input$guessbutton, {
        delay(100, js$runs())
    })
}

shinyApp(ui = ui, server = server)

最佳答案

据我所知,您需要删除 renderUI 才能使其正常工作。否则,当您尝试立即降低音量时,音频标记的 id 将不存在(请参阅浏览器的控制台以获取相应的错误消息)。

我建议您仅生成一次音频标签,并降低应用或 session 启动时的音量,同时动态更改音频标签的 src 参数。

请参阅以下内容:

library(shiny)
library(shinyjs)

if(!dir.exists("www")){
    dir.create("www")
}

if(!file.exists("./www/Flamenco.ogg")){
    # for license see: https://commons.wikimedia.org/wiki/File:JCZA_-_JCzarnecki-Flamenco.ogg
    download.file("https://upload.wikimedia.org/wikipedia/commons/7/76/JCZA_-_JCzarnecki-Flamenco.ogg", destfile = "./www/Flamenco.ogg", mode = "wb") 
}

ui <- fluidPage(
    useShinyjs(),
    tags$audio(id = "myaudio", controls = NA, autoplay = NA, src = ""),
    p(),
    actionButton("guessbutton", "Submit")
)

server <- function(input, output) {
    runjs("document.getElementById('myaudio').volume = 0.2;") # initially reduce volume
    observeEvent(input$guessbutton, {
        runjs(sprintf("document.getElementById('myaudio').src = '%s';", "Flamenco.ogg")) # dynamically change src, replace "Flamenco.ogg" with your user input
    })
}

shinyApp(ui = ui, server = server)

PS:如果要隐藏,可以使用shinyjs的hiddenhideshowconditionalPanel用户的音频标签,直到按下该按钮。

关于r - 在Shiny R中,有没有办法在observeEvent之后立即运行observeEvent而没有延迟(renderUI的问题)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60665381/

相关文章:

android - Opus Codec Android 转换码流

r - 如何根据shiny R上的用户信息使用actionButton对数据框进行子集化

R Shiny - 如何通过 checkboxGroupInput 进行过滤

javascript - R Shiny - 将 'remove' 按钮添加到框标题

json - 使用 R 发布 JSON

r - 如何使用 bnlearn 和 graphviz 绘制具有实例化节点的贝叶斯网络?

r - 设置 read_excel 来猜测一些列类型

R - 将每行中变量的前两次更改为 NA

javascript - 如何删除 Javascript 中音轨之间的停顿

android - 有什么方法可以将音频/声音文件链接到Eclipse图形布局 View 中的按钮?