在后续选项卡/可视化中使用DataTable排序

时间:2017-08-28 16:33:20

标签: r sorting datatables shiny

我正在准备一个shiny应用,并正在努力解决一个特定行为。我希望应用程序在初始页面上显示一个数据表(来自DT包),具有固有的排序功能(具体来说,变量名称旁边的向上/向下箭头):

datatable sorting

但是,我想在后续标签中使用排序信息。以下脚本中的图表确实按预期更新,但是如果我返回到tab1并重做排序 - 图表不会再次反转级别,我不确定原因。花了一些时间来修补这个问题,我认为问题是当排序完成时,情节没有被触发重新渲染(input$data_rows_all不被反应?)。这是虹膜数据集的MWE:

state_ex <- function(data = NULL){
  library(shiny)
  library(shinydashboard)
  library(DT)

  ## UI #############################
  ui = dashboardPage(
    dashboardHeader(title = "Save State Example"),
    dashboardSidebar(
      sidebarMenu(
        menuItem("Tab1", tabName = "tab1"),
        menuItem("Tab2", tabName = "tab2")
        )),
    dashboardBody(
      tabItems(
        tabItem(tabName = "tab1",
                h2("Tab1"),
                DT::dataTableOutput("data")),
        tabItem(tabName = "tab2",
                h2("Tab2"),
                plotOutput("plot"))
        )))

  ## SERVER #########################
  server = function(input, output, session) {
    dat <- reactive({
      df <- data
      return(df)
    })

    output$data <- DT::renderDataTable({
      DT::datatable(dat(), options = list(saveState = TRUE))
    })

    output$plot <- renderPlot({
      if (!is.null(input$data_rows_all)){
        sdat <- dat()
        means <- aggregate(input$data_rows_all ~ sdat$Species, 
                           FUN=mean)
        sdat$Species <- factor(sdat$Species,
                               levels = as.character(rev(means[,1])))
        plot(sdat$Species, sdat$Sepal.Length)
      } else plot(dat()$Species, dat()$Sepal.Length)
    })
  }

  runApp(list(ui = ui, server = server))
}

data(iris)
state_ex(iris)

我希望第二个标签中的图表按第一个标签中的Species列排序(如果用户更改了排序,则会更新排序)。

我已为数据表设置saveState()为true,但我不确定如何应用它如何分类到绘图。任何建议都将非常感谢!

1 个答案:

答案 0 :(得分:1)

input$tbl_rows_all为您提供排序行的索引,其中tbl是表对象的名称。 请参阅下面的一个小例子:

library(shiny)
library(DT)
ui <- fluidPage(
  plotOutput("plt"),
  dataTableOutput("tbl")
)

server <- function(input, output, session){
  output$plt <- renderPlot({
    if(!is.null(input$tbl_rows_all)) plot(mtcars[input$tbl_rows_all, 1])
  })
  output$tbl <- DT::renderDataTable({datatable(mtcars, options = list(stateSave = TRUE))})
}

shinyApp(ui = ui, server = server)