我正在准备一个
shiny
应用程序,并且正在努力解决一种特定的行为。我希望应用程序在初始页面上显示一个数据表(来自 DT 包),并具有固有的排序功能(特别是变量名称旁边的向上/向下箭头):
但是,我想在后续选项卡中使用排序信息。以下脚本中的绘图确实按预期更新,但是如果我返回到 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,但我不确定如何将其排序方式应用到绘图中。
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)