2016-08-02 44 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