gpt4 book ai didi

r - 在Shiny R中,是否有一种方法可以在没有延迟(带有renderUI的问题)的observeEvent之后立即运行observeEvent?

转载 作者:行者123 更新时间:2023-12-02 22:52:36 24 4
gpt4 key购买 nike

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

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

下面的代码可以正常工作,除了我添加了延迟外,它从较高的音量开始并迅速转到较低的音量,但仍然非常引人注意。尝试减少延迟没有帮助。如果消除延迟,则两个watchEvents将同时运行,并且不会更改音量。如果我将js $ runs标记(降低了音量)移到第一个watchEvent内,则也不会起作用。我认为这是因为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中,是否有一种方法可以在没有延迟(带有renderUI的问题)的observeEvent之后立即运行observeEvent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60665381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com