在 Shiny R 中,有没有办法在 observeEvent 之后立即 运行 observeEvent 而没有延迟(renderUI 问题)?
In Shiny R, is there a way to run an observeEvent right after an observeEvent with no delay (issue with renderUI)?
好的,我的标题有点令人困惑,但让我解释一下。
我正在使用 renderUI 获取音频标签,但是,我想以较低的音量开始播放音频,因为它实在是太大声了。
下面的代码工作正常,除了因为我添加了延迟,它以较高的音量开始并迅速进入较低的音量,但它仍然非常引人注目。降低延迟没有帮助,我试过了。如果我删除延迟,两个 observeEvents 将同时 运行 并且音量不会改变。如果我在第一个 observeEvent 中移动 js$运行s 标签(降低音量),它也不会起作用。我认为这是因为 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)
据我所知,您需要删除 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)
PS:如果您想对用户隐藏音频标签,可以使用 shinyjs 的 hidden
、hide
和 show
或 conditionalPanel
直到那个按钮被按下。
好的,我的标题有点令人困惑,但让我解释一下。
我正在使用 renderUI 获取音频标签,但是,我想以较低的音量开始播放音频,因为它实在是太大声了。
下面的代码工作正常,除了因为我添加了延迟,它以较高的音量开始并迅速进入较低的音量,但它仍然非常引人注目。降低延迟没有帮助,我试过了。如果我删除延迟,两个 observeEvents 将同时 运行 并且音量不会改变。如果我在第一个 observeEvent 中移动 js$运行s 标签(降低音量),它也不会起作用。我认为这是因为 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)
据我所知,您需要删除 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)
PS:如果您想对用户隐藏音频标签,可以使用 shinyjs 的 hidden
、hide
和 show
或 conditionalPanel
直到那个按钮被按下。