【问题标题】:Shiny update infobox without new render没有新渲染的闪亮更新信息框
【发布时间】:2019-09-12 15:20:12
【问题描述】:

我需要定期刷新信息框中显示的数据,但每次更新时都会呈现一个新的信息框,从而导致用户体验不佳。

我尝试过使用 futures/promises 进行异步处理,但 renderinfobox 仍然会在数据更新时呈现一个新框。这是我的代码:

invalidateLater(30000)
results <-future({testFuture()})
return(value(results))

我希望能够在整个查询期间更新信息框的基础数据,而不会使 ui 元素变暗。

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。
  • 我没有可以分享的可重现示例。就像我连接到数据库以运行查询以更新信息框一样。我遇到的问题是,当我运行 aync 查询时,信息框会在整个查询期间呈现,从而导致用户体验不太理想。有 renderinfobox 经验的人会确切地知道我在说什么。
  • output$example &lt;- renderInfoBox({ values &lt;- future({exampleFunction})infoBox("example box", value = prettyNum(as.numeric(values[1]),big.mark = ","), subtitle = HTML(paste(values[-1], collapse = ' &lt;br&gt;')), icon = icon("server"), color = 'blue') })&lt;code&gt;

标签: r shiny infobox


【解决方案1】:

您可以只重新渲染信息框的 titlevalue,而不是每次值更改时重新渲染信息框,正如我通过创建输出元素。我创建了一个可以刷新信息框以在秒级别显示当前时间的工作示例。

library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(title = "Test App"),
  dashboardSidebar(),
  dashboardBody(
    infoBox("TestBox", value = textOutput("currentTime"), subtitle = NULL,
            icon = shiny::icon("bar-chart"), color = "aqua", width = 4,
            href = NULL, fill = FALSE)
  )
)

server <- function(input, output, session) {

  output$currentTime <- renderText({
    invalidateLater(1000, session)
    paste(Sys.time())
  })

}

shinyApp(ui = ui, server = server)

用这个试试你的代码,如果有帮助,请告诉我!

【讨论】:

    猜你喜欢
    • 2018-05-30
    • 2021-08-31
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-30
    • 2015-01-11
    • 2016-06-12
    相关资源
    最近更新 更多