2017-05-15 16 views
0

私は、タブセットパネルにいくつかのデータテーブルを持つ光沢のあるアプリケーションを実装しようとしていますが、このデータセットは同じ行と列を持ちます。私が実装したいのは、ユーザーが列をソートするときにタブを変更すると、データは最初の列番号と同じ列番号でソートされるということです。私はそれを実装しようとするこのアプリケーションを持っています:Shinyのタブ間でデータの並べ替えを維持する

library(DT) 
library(shiny) 
app <- shinyApp(
    ui = fluidPage(
    tags$head(
     # hides the default search functionality 
     tags$style(
     #HTML(".dataTables_filter, .dataTables_info { display: none; }"), 
     HTML(".shiny-input-container { display: none; }") 
    ) 
    ), 
    fluidRow(
     column(10, 
      "" 
    ), 
     column(2,    
      # adding new page filter 
      uiOutput("pageFilter") 
    ), 
     column(12, 
     tabsetPanel(id = "tab", 
     tabPanel('pressure', 
        DT::dataTableOutput('table1') 
     ), 
     tabPanel('mtcars', 
        DT::dataTableOutput('table2') 
     ) 
     ) 
    ) 
    ) 
), 
    server = function(input, output) { 

    global <- reactiveValues() 

    observe({ 
     global$val <- input$table1_state$start/input$table1_state$length + 1 
    }) 

    observe({ 
     global$val <- input$table2_state$start/input$table2_state$length + 1 
    }) 

    output$pageFilter <- renderUI({ 
     numericInput("page", "Page", max(global$val,1), min = 1) 
    }) 

    output$table1 <- DT::renderDataTable({ 
     iris 
    }, options = list(pageLength = 15, stateSave = TRUE)) 

    output$table2 = DT::renderDataTable({ 
     mtcars 
    }, options = list(pageLength = 15, stateSave = TRUE)) 

    # using new page filter 
    observeEvent({input$page; input$tab}, { 
     dataTableProxy("table1") %>% selectPage(global$val) 
     dataTableProxy("table2") %>% selectPage(global$val) 
    }) 
    } 
) 

runApp(app, launch.browser = TRUE) 

ご存じですか?

+0

あなたは、ソート列1タイプの昇順で最初のタブには、... 2つ目のタブ内のテーブルもその列1タイプの昇順でソートされる場合という、意味ですか? – BigDataScientist

+0

はい、正確です。ありがとう。 – JFernandez

答えて

1

あなたが知っている変数はinput$table1_stateです。ここでのトリックは、renderDataTable()内のデータテーブルを定義し、その中の設定を更新することです。私はまだ "振る"がどのように引き起こされたかを見ていない、明らかに注文が頻繁に変化するが、私はまだなぜそれを得るのか分からなかった。

library(DT) 
library(shiny) 
app <- shinyApp(
    ui = fluidPage(
    tags$head(
     # hides the default search functionality 
     tags$style(
     HTML(".dataTables_filter, .dataTables_info { display: none; }"), 
     HTML(".shiny-input-container { display: none; }") 
    ) 
    ), 
    fluidRow(
     column(10, 
      "" 
    ), 
     column(2,    
      # adding new page filter 
      uiOutput("pageFilter") 
    ), 
     column(12, 
      tabsetPanel(id = "tab", 
         tabPanel('pressure', 
            DT::dataTableOutput('table1') 
         ), 
         tabPanel('mtcars', 
            DT::dataTableOutput('table2') 
         ) 
      ) 
    ) 
    ) 
), 
    server = function(input, output) { 

    global <- reactiveValues() 

    observe({ 
     input$table1_state 
     isolate({ 
     global$val <- input$table1_state$start/input$table1_state$length + 1 
     if(!is.null(input$table1_state$order)){ 
      global$order <- input$table1_state$order 
     } 
     }) 
    }) 

    observe({ 
     input$table2_state 
     isolate({ 
     global$val <- input$table2_state$start/input$table2_state$length + 1 
     if(!is.null(input$table2_state$order)){ 
      global$order <- input$table2_state$order 
     } 
     }) 
    }) 

    output$pageFilter <- renderUI({ 
     numericInput("page", "Page", max(global$val, 1), min = 1) 
    }) 

    output$table1 <- DT::renderDataTable({ 
     datatable(iris, options = list(
     order = global$order, stateSave = TRUE, pageLength = 15) 
    ) 
    }) 

    output$table2 = DT::renderDataTable({ 
     datatable(mtcars, options = list(
     order = global$order, stateSave = TRUE, pageLength = 15) 
    ) 
    }) 

    # using new page filter 
    observeEvent({input$page; input$tab}, { 
     dataTableProxy("table1") %>% selectPage(global$val) 
     dataTableProxy("table2") %>% selectPage(global$val) 
    }) 

    } 
) 

runApp(app, launch.browser = TRUE) 
関連する問題