2017-08-07 58 views
0

在下面的基本示例中,我希望每次用户添加过滤器时都更新所有过滤器。datatable过滤器更新动态

UI:

library(shiny) 
library(DT) 

fluidPage(
    fluidRow(
    column(4, 
     DT::dataTableOutput("dt") 
    ) 
) 
) 

服务器:

library(shiny) 

shinyServer(function(input, output) { 
    df <- data.frame(var1 = c(rep("A",3),rep("B",3)), var2 = c("x","y","x","z","x","s"), var3 = c(1:6)) 

output$dt <- renderDataTable({ 
    DT::datatable(df, filter = 'top') 
    }) 

}) 

当应用于无过滤:

enter image description here

当我VAR1为 “A”,sz应用过滤器仍然保留在v中的建议标签中即使有没有价值sz

enter image description here

+0

将使用'selectInput'下拉菜单的解决方案工作,还是只想使用列筛选器? – krish

+0

这是我实际的解决方法,我想知道是否有完整的DT解决方案。 – qfazille

回答

0

这是如果我使用selectInput的过滤器我会怎么做AR2过滤器。可能不是最好的解决方案,但它一直为我工作。

代码ui.r

library(shiny) 
library(DT) 

fluidPage(
    fluidRow(
    column(4,selectizeInput("var1", label = "Var 1", choices = NULL, multiple = TRUE)), 
    column(4,selectizeInput("var2", label = "Var 2", choices = NULL, multiple = TRUE)), 
    column(4,selectizeInput("var3", label = "Var 3", choices = NULL, multiple = TRUE)), 
    column(4,DT::dataTableOutput("dt") 
    ) 
) 
) 

代码server.R

library(shiny) 

shinyServer(function(input, output, session) { 
    df <- data.frame(var1 = c(rep("A",3),rep("B",3)), var2 = c("x","y","x","z","x","s"), var3 = c(1:6)) 

    updateSelectizeInput(session, 'var1', choices = sort(unique(df$var1)), server = TRUE) 
    updateSelectizeInput(session, 'var2', choices = sort(unique(df$var2)), server = TRUE) 
    updateSelectizeInput(session, 'var3', choices = sort(unique(df$var3)), server = TRUE) 

    filterData <- function(dataset){ 
    df <- dataset 
    if (!is.null(input$var1)){ 
     df <- df[which(df$var1 == input$var1),] 
    } 
    if (!is.null(input$var2)){ 
     df <- df[which(df$var2 == input$var2),] 
    } 
    if (!is.null(input$var3)){ 
     df <- df[which(df$var3 == input$var3),] 
    } 
    df 
    } 

    output$dt <- renderDataTable({ 
    DT::datatable(filterData(df)) 
    }) 

    getwhich<-function(){ 
    whichs<-which(df$var3 == df$var3) 

    if(!is.null(input$var1)){ 
     whichs<-intersect(whichs,which(df$var1 %in% input$var1)) 
    } 
    if(!is.null(input$var2)){ 
     whichs<-intersect(whichs,which(df$var2 %in% input$var2)) 
    } 
    if(!is.null(input$var3)){ 
     whichs<-intersect(whichs,which(df$var3 %in% input$var3)) 
    } 
    return(whichs) 
    } 

    observe({ 
    w<-getwhich() 
    if(is.null(input$var1)){ 
     updateSelectizeInput(session,"var1",choices=sort(unique(df$var1[w]))) 
    } 

    }) 

    observe({ 
    w<-getwhich() 
    if(is.null(input$var2)){ 
     updateSelectizeInput(session,"var2",choices=sort(unique(df$var2[w]))) 
    } 

    }) 

    observe({ 
    w<-getwhich() 
    if(is.null(input$var3)){ 
     updateSelectizeInput(session,"var3",choices=sort(unique(df$var3[w]))) 
    } 

    }) 


}) 

希望这有助于。