【问题标题】:Forcing updates to htmlOutput within a long running function在长时间运行的函数中强制更新 htmlOutput
【发布时间】:2021-11-09 22:01:57
【问题描述】:

我有一个运行很长进程的 Shiny 应用程序,我想提醒用户该进程实际上正在运行。在下面的示例中,我有一个切换开关,它以 1 秒的延迟执行一段代码(我的实际应用程序运行了大约 20 秒),并且我有一个 HTML 输出框,它应该让用户知道正在发生的事情。但是,由于底层引导过程仅在函数退出后更新 UI 元素,因此用户只能看到最后一条消息“完成”。

我已经看到类似这个问题的其他问题,其中的答案建议创建一个反应值,然后将 renderUI() 函数包装在一个 observe() 函数中(例如here),但这也有同样的问题。

我还尝试将 htmlOutput() 包装在 shinycssloaders 包中的 withSpinner() 中,但我收到一条错误消息,提示“需要 TRUE/FALSE 的地方缺少值”。我假设这是来自 shinydashboardPlus 因为它不喜欢 tagList() 元素中的 withspinner() 输出。我希望这至少会在 HTML 输出上给我一个动画微调器,表明它正在运行。

非常感谢任何有关使此特定设置正常工作的意见或向用户提供有关该过程处于活动状态的一些反馈的替代方法。

library(shiny)
library(shinycssloaders)
library(shinydashboard)
library(shinydashboardPlus)
library(shinyWidgets)

# Define UI for application that draws a histogram
ui <- dashboardPage(skin = 'blue', 
                    
shinydashboardPlus::dashboardHeader(title = 'Example',
    leftUi = tagList(
        switchInput(inputId = 'swtLabels', label = 'Labels', value = TRUE,
                    onLabel = 'Label 1', offLabel = 'Label 2',
                    onStatus = 'info', offStatus = 'info', size = 'mini', 
                    handleWidth = 230),
        htmlOutput(outputId = 'labelMessage')
        #withSpinner(htmlOutput(outputId = 'labelMessage')) # leads to error noted in text
        )
    ),
    dashboardSidebar(),
    dashboardBody()
)

server <- function(input, output) {
  rv <- reactiveValues() 
  rv$labelMessage <- 'Start' 

  observeEvent(input$swtLabels, {
     rv$labelMessage <- 'Updating labels...'
     Sys.sleep(1)
     rv$labelMessage <- 'Done'
  })

  output$labelMessage <- renderUI(HTML(rv$labelMessage))
}

# Run the application 
shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: r shinydashboardplus shinycssloaders


    【解决方案1】:

    我使用shinyjs package 找到了解决方法,代码如下。带回家的信息是,通过使用 shinjs::html(),对 htmlOutput 的影响是立竿见影的。我什至在最后添加了一个花哨的淡出来隐藏消息。

    它确实创建了另一个包依赖项,但它解决了问题。我确信有一种方法可以编写一个小的 JavaScript 函数并将其添加到 Shiny 应用程序以实现相同的结果。不幸的是,我不懂 JavaScript。 (在 Shiny 应用中包含 JS 代码的参考资料 - JavaScript Events in ShinyAdd JavaScript and CSS in Shiny

    library(shiny)
    library(shinycssloaders)
    library(shinydashboard)
    library(shinyjs)
    library(shinydashboardPlus)
    library(shinyWidgets)
    
    # Define UI for application that draws a histogram
    ui <- dashboardPage(skin = 'blue', 
                        
    shinydashboardPlus::dashboardHeader(title = 'Example',
        leftUi = tagList(
            useShinyjs(),
            switchInput(inputId = 'swtLabels', label = 'Labels', value = TRUE,
                        onLabel = 'Label 1', offLabel = 'Label 2',
                        onStatus = 'info', offStatus = 'info', size = 'mini', 
                        handleWidth = 230),
            htmlOutput(outputId = 'labelMessage')
            #withSpinner(htmlOutput(outputId = 'labelMessage')) # leads to error noted in text
            )
        ),
        dashboardSidebar(),
        dashboardBody()
    )
    
    server <- function(input, output) {  
      observeEvent(input$swtLabels, {
         shinyjs::html(id = 'labelMessage', html = 'Starting...')
         shinyjs::showElement(id = 'labelMessage')
         Sys.sleep(1)
         shinyjs::html(id = 'labelMessage', html = 'Done') 
         shinyjs::hideElement(id = 'labelMessage', anim = TRUE, animType = 'fade', time = 2.0) 
      })
    }
    
    # Run the application 
    shinyApp(ui = ui, server = server)
    

    【讨论】:

      猜你喜欢
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多