我有一个运行很长的进程的闪亮应用程序,我想提醒用户该进程实际上正在运行。在下面的示例中,我有一个切换开关,它以 1 秒的延迟执行一段代码(我的实际应用程序运行了大约 20 秒),并且我有一个 HTML 输出框,它应该让用户知道正在发生的事情。但是,由于底层引导过程仅在函数退出后更新 UI 元素,因此用户只能看到最后一条消息“完成”。
我已经看到类似这样的其他问题,其中的答案建议创建一个反应值,然后将 renderUI() 函数包装在一个 observe() 函数中(例如,这里),但这也有同样的问题。
我还尝试将 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)