2016-03-10 23 views
5

Ho un'applicazione per la visualizzazione di dati in tempo reale realizzata con la libreria R shiny. I dati periodici vengono ricaricati dal file utilizzando la funzione reactivePoll. Quello che non mi piace di questo è che ogni volta che i dati ricaricano l'intera applicazione si aggiorna.Aggiornare i dati nell'applicazione lucida senza aggiornare l'intera applicazione

Così per esempio se devo DT uscita tavola con la selezione e utilizzo questa selezione input$table_rows_selected reimposta a NULL ogniqualvolta ricariche di dati che non è facile da usare affatto.

È possibile modificare l'output dei dati in generale senza interrompere l'utente?

AGGIORNAMENTO.

Questo può essere ottenuto con qualsiasi altro pacchetto per la visualizzazione di tabelle - googleVis o altro?

Esempio di lavoro.

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) 
    })} 
)) 

Ho preso questo esempio da @NicE risposta e ha aggiunto colonna ID. Il punto è che la risposta @NicE è OK se è necessario selezionare una determinata riga quando tale riga è identificata dal numero di riga.

Ora supponiamo di aver bisogno di una riga da selezionare quando quella riga è identificata da qualche valore di identificazione. Cioè se seleziono una riga con id uguale b, la prossima volta che i dati si ricaricano voglio che la riga sia selezionata con lo stesso valore id.

+0

Questo è molto comune con il pacchetto 'DT'. Dovrai creare alcuni 'JS 'personalizzati per prendertene cura. In alternativa puoi usare xtable perché il 'lampeggio 'non è così evidente. dai un'occhiata qui http://stackoverflow.com/questions/26976860/how-to-change-datatable-row-background-colour-based-on-the-condition-in-a-column –

+0

I dati si ricaricano aggiungendo nuove linee o aggiornamento di valori già esistenti? Si potrebbe usare 'dataTableProxy' per cambiare la tabella senza ri-renderla. Se desideri semplicemente che il parametro table_rows_selected rimanga sulla nuova tabella, puoi anche impostarli in modo programmatico dopo aver aggiornato i dati. – NicE

+0

Può essere una nuova tabella con poche righe modificate, ma il più delle volte sarà l'aggiornamento del valore. @NicE puoi spiegare cosa intendi per "impostarli programmaticamente"? –

risposta

4

È possibile utilizzare un dataTableProxy per selezionare le righe quando il databile viene creato dopo un aggiornamento pollData. Ecco un esempio, il dataframe viene aggiornato ogni 4 secondi:

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) 

Aggiornamento: sul codice sopra, quando i dati vengono modificati, le righe selezionate sono quelli che hanno la stessa prima colonna come in precedenza.

+3

Solo una nota che richiede la versione di sviluppo di 'DT', poiché il comando' dataTableProxy' non è disponibile nella versione di rilascio. Hai bisogno di 'devtools :: install_github ('rstudio/DT')' –

+0

Grazie per la risposta. Potresti rivedere la tua risposta in base al mio aggiornamento della domanda? Il problema è che ho bisogno di una riga identificata da qualche valore id. –

+1

Basta salvare il valore id, qualcosa come save <- pollData() [idvar, input $ table_rows_selected] e selezionali con (pollData() [idvar,] == save) – Sebastian