2017-08-28 31 views
1

我正在準備shiny應用程序,我正在努力應對一種特定的行爲。我想應用到初始頁面上呈現的數據表(從DT包)與固有排序功能(具體而言,向上/向下箭頭的變量名旁):在隨後的選項卡/可視化中利用DataTable排序

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()爲數據表的真實,但我不知道如何應用它如何排序到情節。任何建議將非常感激!

+0

順便說一句,我看'STR(DAT()'(反應DataTable對象),並且我沒有看到存儲在涉及對象物的內部的任何信息如何在應用程序中對它進行排序和顯示 –

回答

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) 
+0

謝謝!我不明白'input $ tbl_rows_all'的意義,這非常棒,這讓我非常接近一個可行的解決方案。正如我在解決方案中所描述的那樣,更改排序確實更新了繪圖(根據需要),但是如果我回到tab1並再次反轉排序 - 繪圖不會更新任何想法? –

+0

(部分解決方案已移動到問題) –

相關問題