2017-10-16 1 views
0

Die Zeilen in einer Tabelle können sich dynamisch ändern, aber vorhandene Zeilenauswahlen durch einen Benutzer sollten beibehalten werden. Ausgewählte Zeilen werden nach ihrem Zeilenindex gespeichert. Wenn also ein neues datatable() gerendert wird, wie behalten Sie die ausgewählten Zeilen bei?Wie Sie eine DT-Datatable-Zeilenauswahl in einer R Shiny-App fixieren

Antwort

0

Die Lösung besteht aus zwei Teilen. Zuerst kann der selection Parameter in datatable() eine Liste des Formulars list(mode='multiple', selected=c(1,3))

nehmen Der zweite Teil ist zu bestimmen, welche ausgewählte Zeilen in der neuen Tabelle bleiben. Eine Lösung für den zweiten Teil besteht darin, eine Kopie der Datentabelle als Sitzungsvariable zu speichern. Wenn eine neue Datentabelle generiert wird, wird die alte Tabelle mit der neuen verglichen. Ein neuer Satz ausgewählter Zeilenindizes wird basierend auf den gemeinsamen Zeilen in der alten und der neuen Tabelle berechnet. Die Zeilenindizes in der neuen Tabelle werden unter Verwendung eines which(newkeys %in% oldkeys) Idioms gefunden.

Hier ist ein Beispiel:

library(shiny) 

ui <- fluidPage(
    checkboxInput('yellow.only', 'Yellow Only'), 
    uiOutput('fruit.selection'), 
    DT::dataTableOutput("dt.fruit.selection") 
) 

server <- function(input, output) { 

    fruit.options <- reactive({ 
    all.fruits <- c(grape='Grape', banana='Banana', papaya='Papaya', raspberry='Raspberry') 
    yellow.fruits <- c(FALSE, TRUE, TRUE, FALSE) 
    all.fruits[yellow.fruits | !input$yellow.only] 
    }) 

    fruit.options.df <- reactive({ 
    data.frame(fruits=fruit.options(), some.other.col=nchar(fruit.options())) 
    }) 

    output$fruit.selection <- renderUI({ selectInput('fruit', 'Fruit', choices=fruit.options(), selected=input$fruit, multiple=TRUE, selectize=FALSE, size=length(fruit.options())) }) 

    output$dt.fruit.selection <- DT::renderDataTable({ 
    if (!exists('fruit.options.cache') || identical(fruit.options.cache, fruit.options.df())) { 
     rows.selected <- isolate(input$dt.fruit.selection_rows_selected) 
    } else { 
     rows.selected <- which(fruit.options.df()$fruit %in% fruit.options.cache$fruits[isolate(input$dt.fruit.selection_rows_selected)]) 
    } 

    fruit.options.cache <<- fruit.options.df() 
    DT::datatable(fruit.options.cache, rownames=FALSE, selection=list(mode="multiple", selected=rows.selected)) 
    }) 
} 

# Run the application 
shinyApp(ui = ui, server = server) 

Dies auch aus RStudio mit shiny::runGist("https://gist.github.com/dkulp2/7ebb1c936d08f3434127e58d7798af28") ausgeführt werden kann

Verwandte Themen