在Shinny R中,有没有一种方法可以在observeEvent之后立即运行observeEvent而不延迟(renderUI的问题)?

在Shinny R中,有没有一种方法可以在observeEvent之后立即运行observeEvent而不延迟(renderUI的问题)?,r,audio,shiny,volume,R,Audio,Shiny,Volume,好吧,我的标题有点混乱,但让我解释一下 我正在使用renderUI获取音频标签,但是,我希望以较低的音量启动音频,因为它太吵了 下面的代码工作得很好,只是因为我添加了延迟,它从较高的音量开始,很快进入较低的音量,但仍然非常明显。降低延迟没有帮助,我已经试过了。如果我删除延迟,两个ObserveEvent将同时运行,并且卷不会更改。如果我在第一个observeEvent中移动js$runs标记(这会降低音量),它也不会工作。我认为这是因为renderUI在observeEvent完全完成之前不会实

好吧,我的标题有点混乱,但让我解释一下

我正在使用renderUI获取音频标签,但是,我希望以较低的音量启动音频,因为它太吵了

下面的代码工作得很好,只是因为我添加了延迟,它从较高的音量开始,很快进入较低的音量,但仍然非常明显。降低延迟没有帮助,我已经试过了。如果我删除延迟,两个ObserveEvent将同时运行,并且卷不会更改。如果我在第一个observeEvent中移动js$runs标记(这会降低音量),它也不会工作。我认为这是因为renderUI在observeEvent完全完成之前不会实际渲染。此外,我认为我不能删除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)
库(闪亮)
图书馆(shinyjs)

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

我建议您只生成一次音频标记,并在应用程序或会话启动时减少音量,同时动态更改音频标记的
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)
库(闪亮)
图书馆(shinyjs)
如果(!dir.存在(“www”)){
创建目录(“www”)
}
如果(!file.exists(“./www/Flamenco.ogg”)){
#有关许可证,请参阅:https://commons.wikimedia.org/wiki/File:JCZA_-_JCzarnecki-Flamenco.ogg
下载文件(“https://upload.wikimedia.org/wikipedia/commons/7/76/JCZA_-_JCzarnecki-Flamenco.ogg“,destfile=“./www/Flamenco.ogg”,mode=“wb”)
}
用户界面