2016-08-02 60 views
4

第一次在這裏發佈海報。我通常能夠在沒有發佈的情況下獲得我所有的答案,但是這個問題真的讓我感到困惑。我是一個沒有JavaScript經驗的中級R用戶。這是我想要做的:交互式數據表:在重新渲染表後保留列過濾器

我有一個數據表,使用交互式閃亮過濾器通過行動按鈕,我的數據的子集,也內置的數據過濾器。操作按鈕通過對數據幀進行子集化來執行批量過濾。我遇到的問題是,只要應用了其中一個批量過濾器,就會重新渲染數據表,並清除所有單個列過濾器。我希望能夠在數據被子集化和表格重新呈現時保持單個列過濾器處於活動狀態。

我已經設法發現,我可以使用輸入$ mytable_search_columns從數據表中輸出和隔離這些信息,但我不知道如何編寫將在重新呈現表時應用此條件的JavaScript。

library(shinyBS) 
library(DT) 

server <- function(input, output, session) { 

    df <- reactive({iris}) 

    df.sub <- reactive({ 
    if(input$buttonfilter == 0){ 
     df.sub <- df() 
    } 
    if(input$buttonfilter == 1){ 
     df.sub <- subset(df(), subset = Species == 'setosa') 
    } 
    df.sub 
    }) 

    output$mytable <- DT::renderDataTable(df.sub(), 
             filter = 'top') 
    output$filters <- renderText({input$mytable_search_columns}) 
} 
ui <- fluidPage(
    h3('Button Toggle Filter'), 
    bsButton("buttonfilter","Show only Setosa", type = 'toggle'), 
    br(), 
    br(), 
    h3('Current filters'), 
    textOutput('filters'), 
    br(), 
    br(), 
    DT::dataTableOutput('mytable') 



) 

shinyApp(ui = ui, server = server) 

非常感謝。

編輯:

OK我做了它,這樣它應該是可重複的(需要shinyBS和DT包)。

我想要做的是找到一種方法來保持當前的DT過濾器,當表重新呈現基於動作按鈕啓動的子集。在這個例子中,你可以看到表格重新渲染後,過濾器被清除。

謝謝!

+0

你可以創建一個JSFiddle或codepen來說明你的子集?不需要真實的數據... –

+0

嘿,Jeromy。我已經添加了一個使用Iris數據集的示例。謝謝! – Balter

+0

酷!呃......在哪裏?鏈接? –

回答

3

我找到了一種不使用JavaScript的方法。我真的很驚訝它的工作。我從來沒有要處理的包DT,但我認爲這是你想要的東西:

library(shinyBS) 
library(DT) 

server <- function(input, output, session) { 

    df <- reactive({ 
    if(input$buttonfilter %% 2 == 0){ 
     df.sub <- iris 
    } else { 
     df.sub <- subset(iris, subset = Species == 'setosa') 
    } 
    df.sub 
    }) 


    output$mytable <- DT::renderDataTable(isolate(df()), filter = 'top') 
    proxy <- dataTableProxy('mytable') 

    observe({ 
    replaceData(proxy, df(), resetPaging = FALSE) 
    }) 
} 

ui <- fluidPage(h3('Button Toggle Filter'), 
       bsButton("buttonfilter","Show only Setosa", type = 'toggle'), 
       br(),br(), 
       DT::dataTableOutput('mytable') 
) 

shiny::shinyApp(ui=ui,server=server) 

基本上,我們創造了我們的桌子的代理,並只需更換數據所呈現的表。有關詳情查看此頁面最底部:https://rstudio.github.io/DT/shiny.html

我沒有找到我的電腦上沒有提到的例子,但你可以去GitHub複製並粘貼:https://github.com/rstudio/DT/blob/master/inst/examples/DT-reload/app.R

希望這有助於。

+0

我曾嘗試過這種方式,無法使用它處理我的數據。如果你沒有證明它可以工作,我永遠不會繼續追求它。我已經得到它的工作!謝謝!! – Balter

+0

歡迎你。如果你接受答案會很高興! –

+0

完成。只是一個FYI,唯一的缺點是它需要DT的開發者版本,它帶有一些影響我的數據集的問題。但我能夠解決它。值得。再次感謝。 – Balter