2016-03-10 19 views
5

Tôi có một ứng dụng để tạo dữ liệu trực quan hóa thời gian thực với thư viện R shiny. Tôi thực hiện tải lại dữ liệu định kỳ từ tệp bằng chức năng reactivePoll. Những gì tôi không thích về điều này là bất cứ khi nào dữ liệu tải lại toàn bộ ứng dụng làm mới.Cập nhật dữ liệu trong ứng dụng sáng bóng mà không cần làm mới toàn bộ ứng dụng

Vì vậy, ví dụ nếu tôi có DT đầu ra bảng có lựa chọn và tôi sử dụng lựa chọn này input$table_rows_selected nó sẽ đặt lại thành NULL bất cứ khi nào tải lại dữ liệu không thân thiện với người dùng.

Tổng thể có thể thay đổi đầu ra dữ liệu mà không làm gián đoạn người dùng không?

CẬP NHẬT.

Điều này có thể đạt được với bất kỳ gói nào khác để hiển thị bảng - googleVis hoặc khác không?

Ví dụ làm việc.

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

Tôi đã lấy ví dụ này từ câu trả lời @NicE và cột id được thêm vào. Vấn đề là câu trả lời @NicE là OK nếu cần một hàng nhất định khi hàng đó được xác định bằng số hàng.

Giả sử tôi cần một hàng để được chọn khi hàng đó được xác định bởi một số giá trị id. Đó là nếu tôi chọn một hàng có id bằng b, thì lần tải lại dữ liệu tiếp theo tôi muốn hàng được chọn có cùng giá trị id.

+0

Điều này rất phổ biến với gói 'DT'. Bạn sẽ cần phải xây dựng một số tùy chỉnh 'JS' để chăm sóc điều đó. Ngoài ra, bạn có thể sử dụng xtable như 'nhấp nháy' là không đáng chú ý. có một cái nhìn ở đây http://stackoverflow.com/questions/26976860/how-to-change-datatable-row-background-colour-based-on-the-condition-in-a-column –

+0

Tải lại dữ liệu chỉ cần thêm dòng mới hoặc cập nhật các giá trị hiện có? Bạn có thể sử dụng 'dataTableProxy' để thay đổi bảng mà không cần hiển thị lại nó. Nếu bạn chỉ muốn 'table_rows_selected' lưu lại trên bảng mới của mình, bạn cũng có thể đặt chúng theo lập trình sau khi cập nhật dữ liệu. – NicE

+0

Nó có thể là một bảng mới với vài hàng thay đổi nhưng hầu hết thời gian nó sẽ được cập nhật giá trị. @ NicE bạn có thể giải thích ý của bạn bằng cách "đặt chúng theo chương trình" một phần không? –

Trả lời

4

Bạn có thể sử dụng dataTableProxy để chọn các hàng khi dữ liệu được tạo sau khi cập nhật pollData. Dưới đây là một ví dụ, các dataframe được làm mới mỗi 4 giây:

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) 

Cập nhật: trên đoạn mã trên, khi thay đổi dữ liệu, các hàng được lựa chọn là những người có cùng cột đầu tiên làm trước đó.

+3

Chỉ cần lưu ý rằng điều này đòi hỏi phiên bản phát triển của 'DT', vì lệnh' dataTableProxy' không có sẵn trong phiên bản phát hành. Bạn cần 'devtools :: install_github ('rstudio/DT')' –

+0

Cảm ơn câu trả lời của bạn. Bạn có thể sửa đổi câu trả lời của mình dựa trên cập nhật câu hỏi của tôi không? Vấn đề là tôi cần một hàng được xác định bởi một số giá trị id. –

+1

Chỉ cần lưu giá trị id, giống như lưu <- pollData() [idvar, input $ table_rows_selected] và chọn chúng (pollData() [idvar,] == save) – Sebastian

Các vấn đề liên quan