2016-03-10 5 views
5

Ich habe eine Anwendung für die Echtzeit-Datenvisualisierung mit R shiny Bibliothek erstellt. Ich mache periodische Daten neu laden von Datei mit reactivePoll Funktion. Was ich nicht mag ist, dass wenn die Daten neu geladen werden, die ganze Anwendung aktualisiert wird.Aktualisieren Sie Daten in glänzenden Anwendung, ohne die gesamte Anwendung zu aktualisieren

So zum Beispiel, wenn ich DT Tabellenausgabe mit Auswahl und ich verwende diese Auswahl input$table_rows_selected es NULL zurücksetzt, wenn Daten neu geladen, die überhaupt nicht benutzerfreundlich ist.

Ist es insgesamt möglich, die Datenausgabe zu ändern, ohne den Benutzer zu unterbrechen?

UPDATE.

Kann dies mit jedem anderen Paket für die Anzeige von Tabellen erreicht werden - googleVis oder andere?

Arbeitsbeispiel.

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

Ich habe dieses Beispiel aus @NicE Antwort entnommen und ID-Spalte. Der Punkt ist, dass @NicE-Antwort OK ist, wenn eine bestimmte Zeile ausgewählt werden muss, wenn diese Zeile durch die Zeilennummer identifiziert wird.

Angenommen, ich brauche eine Zeile, die ausgewählt wird, wenn diese Zeile durch einen ID-Wert identifiziert wird. Das heißt, wenn ich eine Zeile mit id gleich b auswähle, möchte ich beim nächsten Neuladen von Daten die Zeile mit demselben ID-Wert auswählen.

+0

Dies ist sehr häufig mit 'DT' Paket. Sie müssen einige benutzerdefinierte 'JS' erstellen, um das zu erledigen. Alternativ können Sie xtable verwenden, da das "Blinken" nicht wahrnehmbar ist. Schau mal hier http://stackoverflow.com/questions/26976860/how-to-change-datatable-row-background-colour-based-on-the-condition-in-a-column –

+0

Ist das Daten neu laden nur hinzufügen neue Zeilen oder Aktualisierung bereits bestehender Werte? Sie können 'dataTableProxy' verwenden, um die Tabelle zu ändern, ohne sie erneut zu rendern. Wenn Sie möchten, dass "table_rows_selected" nur in Ihrer neuen Tabelle verbleibt, können Sie sie auch nach dem Aktualisieren der Daten programmatisch setzen. – NicE

+0

Es kann eine neue Tabelle mit wenigen Zeilen sein, die geändert wird, aber die meiste Zeit wird es Wert aktualisieren. @NicE kannst du erklären was meinst du mit "programmatisch setzen" teil? –

Antwort

4

Sie können dataTableProxy verwenden, um Zeilen auszuwählen, wenn das Datenobjekt nach einem pollData-Update erstellt wird. Hier ist ein Beispiel, die Datenrahmen alle 4 Sekunden aktualisiert wird:

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) 

Update: auf dem obigen Code, wenn sich die Daten ändern, die ausgewählten Zeilen diejenigen sind, die die gleiche erste Spalte wie zuvor haben.

+3

Nur eine Anmerkung, dass dies die Entwicklungsversion von 'DT' erfordert, da der Befehl' dataTableProxy' in der Release-Version nicht verfügbar ist. Sie benötigen 'devtools :: install_github ('rstudio/DT')' –

+0

Vielen Dank für Ihre Antwort. Könnten Sie Ihre Antwort basierend auf meinem Update der Frage überarbeiten? Das Problem ist, dass ich eine Zeile brauche, die durch einen ID-Wert identifiziert wird. –

+1

Speichern Sie einfach den ID-Wert, etwa save <- pollData() [idvar, input $ table_rows_selected] und wählen Sie sie mit (pollData() [idvar,] == speichern) – Sebastian