2016-11-22 2 views
2

Ich verwende das DT-Paket, um eine Datentabelle in meiner shiny App anzuzeigen. Da ich verschiedene Datensätze zur Verfügung stelle, habe ich Optionsfelder, um sie auszuwählen, und die Datentabelle wird automatisch aktualisiert.Ausgewählte Zeilen beim Ändern des Datensatzes in glänzender DT-Datentabelle beibehalten

Was ich tun möchte, ist die Vorauswahl der verfügbaren Zeilen von df1 in df2 beim Umschalten der Datensätze. Im Moment wird meine Auswahl immer gelöscht. Wenn ich versuche, die ausgewählten Zeilen zu speichern (die beiden Zeilen auskommentieren), wird meine Tabelle direkt zurückgesetzt.

library(shiny) 
library(DT) 

df1 <- data.frame(names=letters, 
        values=1:26) 
df2 <- data.frame(names=letters, 
        values=(1:26)*2)[seq(1,26,2),] 

ui <- shinyUI(
    fluidPage(
    sidebarLayout(
     sidebarPanel(
     radioButtons("dataset", label=h5("Select dataset"), 
        choices=list("df1"='df1', 
            "df2"='df2'), 
        selected='df1', inline=TRUE) 
    ), 
     mainPanel(
     DT::dataTableOutput("name_table") 
    ) 
    ) 
) 
) 

Server-Seite ...

server <- function(input, output, session) { 
    getDataset <- reactive({ 
    result <- list() 
    result[['dataset']] <- switch(input$dataset, 
        'df1'=df1, 
        'df2'=df2) 
    # result[['selection']] <- 
    # as.numeric(input$name_table_rows_selected) 
    return(result) 
    }) 
    output$name_table <- DT::renderDataTable({ 
    DT::datatable(getDataset()[['dataset']], 
        options=list(pageLength=5)) 

    }) 
    name_proxy = DT::dataTableProxy('name_table') 
} 

shinyApp(ui, server) 

Ich benutzte die DT Tabelle, da ich den Proxy und einige Interaktion mit der Datentabelle müssen.

Antwort

3

können Sie ausgewählte Zeilen nur speichern, wenn df wie

server <- function(input, output, session) { 
    dd=reactiveValues(select=NULL) 

    observeEvent(input$dataset,{ 
    dd$select=as.numeric(isolate(input$name_table_rows_selected)) 
    }) 

    getDataset <- reactive({ 
    result <- list() 
    result[['dataset']] <- switch(input$dataset, 
            'df1'=df1, 
            'df2'=df2) 

    return(result) 
    }) 
    output$name_table <- DT::renderDataTable({ 
    DT::datatable(getDataset()[['dataset']], 
        options=list(pageLength=5), 
        selection = list(mode = 'multiple', selected =dd$select ) 
    ) 

    }) 
    name_proxy = DT::dataTableProxy('name_table') 
} 

shinyApp(ui, server) 

Oder ein wenig Modifikation von @drmariod Variante ändern gehen: Verwenden Sie eventReactive statt reactive

server <- function(input, output, session) { 
    getDataset <- eventReactive(input$dataset,{ 
    result <- list() 
    result[['dataset']] <- switch(input$dataset, 
            'df1'=df1, 
            'df2'=df2) 
    result[['selection']] <- testing() 
    return(result) 
    }) 
    testing <- function() { 
    list(selected=as.numeric(input$name_table_rows_selected)) 
    } 
    output$name_table <- DT::renderDataTable({ 
    DT::datatable(getDataset()[['dataset']], 
        options=list(pageLength=5), 
        selection=getDataset()[['selection']]) 

    }) 
    name_proxy = DT::dataTableProxy('name_table') 
} 
+0

, das sieht gut aus! Danke für beide Vorschläge! – drmariod

1

Hm, es sieht so aus, als hätte ich eine Lösung gefunden, aber ich frage mich, ob es eine bessere Lösung gibt.

server <- function(input, output, session) { 
    getDataset <- reactive({ 
    result <- list() 
    result[['dataset']] <- switch(input$dataset, 
        'df1'=df1, 
        'df2'=df2) 
    result[['selection']] <- testing() 
    return(result) 
    }) 
    testing <- function() { 
    list(selected=as.numeric(input$name_table_rows_selected)) 
    } 
    output$name_table <- DT::renderDataTable({ 
    DT::datatable(getDataset()[['dataset']], 
        options=list(pageLength=5), 
        selection=getDataset()[['selection']]) 

    }) 
    name_proxy = DT::dataTableProxy('name_table') 
} 

Ich frage mich, manchmal kommt eine processing Nachricht. und bei jedem Klick blinkt der Tisch kurz "..." Wäre toll, eine bessere Antwort zu bekommen.

Verwandte Themen