在不刷新整个应用程序的情况下更新闪亮应用程序中的数据
Update data in shiny application without refreshing the whole application
我有一个使用 R shiny
库构建的实时数据可视化应用程序。我使用 reactivePoll
函数从文件中定期重新加载数据。我不喜欢的是,每当数据重新加载时,整个应用程序都会刷新。
例如,如果我有 DT
table 输出 selection 并且我使用这个 selection input$table_rows_selected
它重置为 NULL
每当数据重新加载时,这对用户来说根本不友好。
是否可以在不打扰用户的情况下更改数据输出?
更新。
这可以用任何其他显示 tables - 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 答案是可以的,如果需要某行 selected 当该行由行号标识时。
现在假设当某行由某个 id 值标识时,我需要对该行进行 selected。也就是说,如果我 select 一行的 id 等于 b,那么下次重新加载数据时,我希望该行 select 具有相同的 id 值。
在 pollData
更新后创建数据表时,您可以使用 dataTableProxy
到 select 行。
这是一个例子,数据框每 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)
更新:在上面的代码中,当数据发生变化时,select编辑的行是具有与之前相同的第一列的行。
我有一个使用 R shiny
库构建的实时数据可视化应用程序。我使用 reactivePoll
函数从文件中定期重新加载数据。我不喜欢的是,每当数据重新加载时,整个应用程序都会刷新。
例如,如果我有 DT
table 输出 selection 并且我使用这个 selection input$table_rows_selected
它重置为 NULL
每当数据重新加载时,这对用户来说根本不友好。
是否可以在不打扰用户的情况下更改数据输出?
更新。
这可以用任何其他显示 tables - 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 答案是可以的,如果需要某行 selected 当该行由行号标识时。
现在假设当某行由某个 id 值标识时,我需要对该行进行 selected。也就是说,如果我 select 一行的 id 等于 b,那么下次重新加载数据时,我希望该行 select 具有相同的 id 值。
在 pollData
更新后创建数据表时,您可以使用 dataTableProxy
到 select 行。
这是一个例子,数据框每 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)
更新:在上面的代码中,当数据发生变化时,select编辑的行是具有与之前相同的第一列的行。