В Shiny R есть ли способ запустить наблюдающее событие сразу после наблюдаемого события без задержки (проблема с renderUI)? - PullRequest
1 голос
/ 13 марта 2020

Хорошо, мой заголовок немного запутанный, но позвольте мне объяснить.

Я использую renderUI для получения звукового тега, однако я хочу запустить звук на более низкой громкости, потому что он просто слишком громкий.

Приведенный ниже код работает нормально, за исключением того, что я добавил задержку, она запускается при увеличении громкости и быстро переходит в более низкую громкость, но она все еще очень заметна. Понижение задержки не помогает, я пробовал. Если я уберу задержку, два события наблюдения будут выполняться одновременно, и громкость не изменится. Если я переместу тег js $ run (который уменьшает громкость) внутри первого наблюдателя, он тоже не будет работать. Я думаю, что это потому, что 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)

1 Ответ

1 голос
/ 13 марта 2020

Насколько я могу судить, вам нужно сбросить 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: вы можете используйте блестящие js 'hidden, hide и show или conditionalPanel, если вы хотите скрыть звуковую метку от своего пользователя, пока эта кнопка не будет нажата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...