【问题标题】:Update data in shiny application without refreshing the whole application在闪亮的应用程序中更新数据而不刷新整个应用程序
【发布时间】:2016-06-24 23:18:14
【问题描述】:

我有一个使用 R shiny 库构建的实时数据可视化应用程序。我使用reactivePoll 函数从文件中定期重新加载数据。我不喜欢的是,每当数据重新加载时,整个应用程序都会刷新。

因此,例如,如果我有带有选择的DT 表输出,并且我使用此选择input$table_rows_selected,它会在数据重新加载时重置为NULL,这根本不是用户友好的。

是否可以在不中断用户的情况下更改数据输出?

更新。

这可以通过任何其他用于显示表格的包来实现 - googleVis 或其他吗?

工作示例。

library(shiny)
library(DT)

runApp(shinyApp(
  ui = fluidPage(dataTableOutput('table')),
  server = function(input, output, session) {
    pollData <- reactivePoll(4000, session,
                             checkFunc = function(){ Sys.time() },
                             valueFunc = function(){ data.frame(id = sample(letters[1:3]), a = runif(3), b = runif(3), c = runif(3)) })
    output$table <- renderDataTable({pollData()})
    proxy <- dataTableProxy('table')
    observeEvent(pollData(), {
      selectRows(proxy, input$table_rows_selected)
    })}
))

我从@NicE 答案中获取了这个示例并添加了 id 列。关键是@NicE 的答案是可以的,如果在该行由行号标识时需要选择某行。

现在假设当该行由某个 id 值标识时,我需要选择该行。也就是说,如果我选择 id 等于 b 的行,那么下次重新加载数据时,我希望选择具有相同 id 值的行。

【问题讨论】:

  • 这在DT 包中很常见。您将需要构建一些自定义的JS 来解决这个问题。或者,您可以使用 xtable 作为 blinking 不那么明显。看看这里stackoverflow.com/questions/26976860/…
  • 数据重新加载只是添加新行还是更新现有值?您可以使用dataTableProxy 更改表格而不重新渲染它。如果您只希望table_rows_selected 保留在新表上,您也可以在更新数据后以编程方式设置它们。
  • 它可以是一个只更改了几行的新表,但大多数时候它会更新值。 @NicE 你能解释一下“以编程方式设置它们”部分是什么意思吗?
  • 我建议做一些类似在 stackoverflow 上编辑问题的体验。弹出一个横幅,告诉用户有新数据可用。用户单击横幅以手动更新数据表。当然,这只适用于您的数据更新相对不频繁的情况。
  • 你能提供一个可行的例子吗?

标签: r shiny googlevis dt


【解决方案1】:

pollData 更新后创建数据表时,您可以使用dataTableProxy 选择行。 这是一个示例,数据框每 4 秒刷新一次:

library(shiny)
library(DT)

ui <- fluidPage(dataTableOutput("table"))

server <- function(input,output,session){
        values <- reactiveValues()
        pollData <- reactivePoll(4000, session,
                                 checkFunc=function(){
                                         Sys.time()
                                 },
                                 valueFunc=function(){                             
                                         data.frame(a=sample(c("a","b","c"),3),b=runif(3),c=runif(3),stringsAsFactors = F)
                                 })

        output$table <- renderDataTable({ pollData()})

        observe({
                values$selected <- pollData()$a[input$table_rows_selected]
        })

        proxy = dataTableProxy('table')
        observeEvent(pollData(),{
                selectRows(proxy, which(pollData()$a %in% values$selected))
        })
}

shinyApp(ui,server)

更新:在上面的代码中,当数据发生变化时,选择的行是与之前具有相同第一列的行。

【讨论】:

  • 请注意,这需要DT 的开发版本,因为dataTableProxy 命令在发布版本中不可用。你需要devtools::install_github('rstudio/DT')
  • 感谢您的回答。您能否根据我对问题的更新修改您的答案?问题是我需要一个由某个 id 值标识的行。
  • 只需保存 id 值,例如 save
  • @Sebastian 你能说得更具体些吗,我应该把这些代码行放在哪里?
  • 我更新了代码来做你想做的事,如果用户在示例数据的a列中选择了一个带有“b”的行,当数据发生变化时,该行将被选中。
猜你喜欢
  • 1970-01-01
  • 2017-12-05
  • 2013-01-31
  • 2017-10-14
  • 2020-11-03
  • 2021-10-21
  • 2020-05-06
  • 1970-01-01
  • 2017-11-18
相关资源
最近更新 更多