2016-03-10 29 views
5

R shiny kitaplığı ile gerçek zamanlı veri görselleştirme oluşturmak için bir uygulama var. Periyodik veri reactivePoll işlevini kullanarak dosyadan yeniden yüklerim. Bu konuda sevmediğim şey, veri yeniden yüklendiğinde tüm uygulamanın yenilenmesidir. Verileri tüm uygulama yenilemeden parlak bir uygulama olarak güncelleştirin

Yani örneğin ben seçimle DT tablo çıktı varsa ve ben NULL için bu sıfırlar bu seçimi input$table_rows_selected her kullandığınızda tüm kullanıcı dostu değildir veri reloads.

Kullanıcı verisini kesintiye uğratmadan veri çıkışını değiştirmek genel olarak mümkün mü?

UPDATE.

Bu, tabloları görüntülemek için başka herhangi bir paket ile elde edilebilir - googleVis veya diğer?

Çalışma örneği.

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

Ben @NicE cevabını bu örneği alınmış ve kimliği sütunu ekledik. Bu satırın satır numarasıyla tanımlandığında belirli bir sıranın seçilmesi gerekiyorsa, @NicE cevabının OK olması önemlidir.

Şimdi, bu satırın bir kimlik değeriyle tanımlanması durumunda seçilecek bir satıra ihtiyacım var. Diğer bir deyişle, eşit b ile bir satır seçtiğimde, bir sonraki veri yeniden yüklendiğinde, satırın aynı kimlik değeriyle seçilmesini istiyorum.

+0

Bu "DT" paketi ile çok yaygındır. Bununla ilgilenmek için bazı özel JS 'kurmanız gerekecek. Alternatif olarak, xtable'ı “yanıp sönen” olarak algılanabilecek kadar kullanamazsınız. bir göz atın http://stackoverflow.com/questions/26976860/how-to-change-datatable-row-background-colour-based-on-the-condition-in-a-column –

+0

Veri yeniden yükleniyor mu? yeni çizgiler mi yoksa mevcut değerler mi güncelleniyor? Tabloyu yeniden oluşturmadan değiştirmek için 'dataTableProxy' kullanabilirsiniz. Yeni tablonuzda "table_rows_selected" ifadesinin kalmasını istiyorsanız, verileri güncelledikten sonra programatik olarak da ayarlayabilirsiniz. – NicE

+0

Birkaç satır değişmiş yeni bir tablo olabilir, ancak çoğu zaman değer güncellenir. @NicE, "onları programlı olarak ayarla" kısmı ile ne demek istediğini açıklayabilir misiniz? –

cevap

4

Bir pollData güncelleştirmesinden sonra oluşturulabilir olduğunda satır seçmek için dataTableProxy kullanabilirsiniz. Burada dataframe 4 saniyede bir yenilenir, bir örnek verilmiştir:

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) 

güncelle: Veri değişiklikleri, seçilen satır, daha önce olduğu gibi aynı birinci sütuna sahip olanlar, yukarıda kod ile.

+3

Sadece "DTT" nin geliştirme sürümü gerektirdiğine dikkat edin, çünkü dataTableProxy komutu yayın sürümünde mevcut değildir. İhtiyacınız var: devtools :: install_github ('rstudio/DT') ' –

+0

Cevabınız için teşekkür ederiz. Sorunuzu güncellememi temel alarak cevabınızı gözden geçirebilir misiniz? Sorun şu ki, bazı kimlik değerleriyle tanımlanan bir satıra ihtiyacım var. –

+1

Kaydetmek için <- pollData() [idvar, $ table_rows_selected] gibi bir değer girin ve bunları seçin (pollData() [idvar,] == save) – Sebastian