2016-07-21 22 views
1

Mit dem DT-Paket können Sie die Indizes ausgewählter Zeilen mit input$tableID_rows_selected abrufen. Dies funktioniert hervorragend für Tabellen, die keine gefilterten Daten enthalten. Wenn wir jedoch einen gefilterten Datensatz haben, können wir diesen Ansatz nicht verwenden, da die Zeilenindizes deaktiviert sind.Wie bekomme ich die Daten aus den ausgewählten Zeilen einer gefilterten Datentabelle (DT)?

Für ein gefiltertes Dataset dann, wie würden wir die Daten in den ausgewählten Zeilen einer Datentabelle erhalten?

Im Folgenden habe ich eine grundlegende glänzende App veröffentlicht, die vier Tabellen anzeigt: Die erste ist das ursprüngliche mtcars-Dataset und die zweite ruft die ausgewählten Zeilen in der ersten ab. Die dritte und die vierte tun das gleiche, aber nach dem Filtern der Datenmenge auf dem "Filter" SliderInput.

library(shiny) 
library(DT) 
library(dplyr) 

ui <- fluidPage(
    DT::dataTableOutput("origTable"), 
    DT::dataTableOutput("origTableSelected"), 
    sliderInput("filter", label = "Filter by cyl", min = 4, max = 8, step = 2, value = 6), 
    DT::dataTableOutput("filteredTable"), 
    DT::dataTableOutput("filteredTableSelected") 
) 


server <- function(input, output, session) { 

    output$origTable <- DT::renderDataTable({ 
    datatable(
     mtcars, 
     selection = list(mode = "multiple"), 
     caption = "Original Data" 
    ) 
    }) 

    origTable_selected <- reactive({ 
    ids <- input$origTable_rows_selected 
    mtcars[ids,] 
    }) 

    output$origTableSelected <- DT::renderDataTable({ 
    datatable(
     origTable_selected(), 
     selection = list(mode = "multiple"), 
     caption = "Selected Rows from Original Data Table" 
    ) 
    }) 

    output$filteredTable <- DT::renderDataTable({ 
    datatable(
     filter(mtcars, cyl == input$filter), 
     selection = list(mode = "multiple"), 
     caption = "Filtered Table (based on cyl)" 
    ) 
    }) 

    filteredTable_selected <- reactive({ 
    ids <- input$filteredTable_rows_selected 
    mtcars[ids,] 
    }) 

    output$filteredTableSelected <- DT::renderDataTable({ 
    datatable(
     filteredTable_selected(), 
     selection = list(mode = "none"), 
     caption = "Table that gets data from unfiltered original data" 
    ) 
    }) 
} 

shinyApp(ui = ui, server = server) 

Antwort

3

Eine Möglichkeit: in Ihre filteredTable_selected() Funktion, in dem Sie die Daten sind Erstellen Sie in Ihrem vierten DT setzen werde, verwenden filter(mtcars, cyl == input$filter) wie Sie für Ihre dritte Tabelle tat statt mtcars. Auf diese Weise stimmen die Zeilenindizes überein.

Wenn Sie sich über Leistungsprobleme bei größeren Datensätzen sorgen, filtern Sie die Daten einfach in einem reaktiven Ausdruck, der die Ausgabe zwischenspeichert. Auf diese Weise filtern Sie nicht mehr als die eingegebenen $ Filterwertänderungen.

server <- function(input, output, session) { 
    filteredTable_data <- reactive({ 
    filter(mtcars, cyl == input$filter) 
    }) 

    output$filteredTable <- DT::renderDataTable({ 
    datatable(
     filteredTable_data(), 
     selection = list(mode = "multiple"), 
     caption = "Filtered Table (based on cyl)" 
    ) 
    }) 

    filteredTable_selected <- reactive({ 
    ids <- input$filteredTable_rows_selected 
    filteredTable_data()[ids,] 
    }) 

    output$filteredTableSelected <- DT::renderDataTable({ 
    datatable(
     filteredTable_selected(), 
     selection = list(mode = "none"), 
     caption = "Table that gets data from unfiltered original data" 
    ) 
    }) 
} 
+0

Ich schrieb eine Frage und dann herausgefunden. Ich dachte, ich würde es posten, damit andere es wissen. https://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ – tbadams45

+0

@wheilhereislight ja sicher, es ist toll und glücklich, dass Sie Ihre Ergebnisse mit geteilt haben uns, Danke – Learner