我正在准备一个shiny
应用,并正在努力解决一个特定行为。我希望应用程序在初始页面上显示一个数据表(来自DT包),具有固有的排序功能(具体来说,变量名称旁边的向上/向下箭头):
但是,我想在后续标签中使用排序信息。以下脚本中的图表确实按预期更新,但是如果我返回到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,但我不确定如何应用它如何分类到绘图。任何建议都将非常感谢!
答案 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)