在后续选项卡/可视化中利用数据表排序

问题描述 投票:0回答:1

我正在准备一个

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

datatable sorting

但是,我想在后续选项卡中使用排序信息。以下脚本中的绘图确实按预期更新,但是如果我返回到 tab1 并重做排序 - 绘图不会再次反转级别,我不确定为什么。花了一些时间对此进行修改后,我认为问题在于排序完成后不会触发绘图重新渲染(

input$data_rows_all
不是反应性的?)。这是 iris 数据集的 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,但我不确定如何将其排序方式应用到绘图中。

r sorting shiny dt
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.