R 闪亮的过滤器更新不会显示变量的所有模式

R 闪亮的过滤器更新不会显示变量的所有模式,r,shiny,R,Shiny,我正在尝试构建一个可以过滤数据表的动态应用程序,我想要的是当我为我的第一个变量选择一个模式时,我的下一个过滤器将被更新,并且只针对我的第一个过滤器和第三个过滤器对应的模式 我从一个反应式应用程序开始,但它似乎不起作用,因为我必须始终保留“所有”选项,以显示其他模式,然后将其删除…有可能做到这一点吗? 因此,我决定添加一个操作按钮,但似乎无法很好地处理更新输入 我怎样才能修好它?谢谢 我的应用程序示例: library(shiny) library(dplyr) library(DT) ui &

我正在尝试构建一个可以过滤数据表的动态应用程序,我想要的是当我为我的第一个变量选择一个模式时,我的下一个过滤器将被更新,并且只针对我的第一个过滤器和第三个过滤器对应的模式 我从一个反应式应用程序开始,但它似乎不起作用,因为我必须始终保留“所有”选项,以显示其他模式,然后将其删除…有可能做到这一点吗? 因此,我决定添加一个操作按钮,但似乎无法很好地处理更新输入

我怎样才能修好它?谢谢

我的应用程序示例:

library(shiny)
library(dplyr)
library(DT)

ui <- fluidPage(

  titlePanel("Title"),

  sidebarLayout(
    sidebarPanel(width=3,
                 selectInput("filter1", "Filter 1", multiple = T, choices = c("All", LETTERS)),
                 selectInput("filter2", "Filter 2", multiple = T, choices = c("All", as.character(seq.int(1, length(letters), 1)))),
                 selectInput("filter3", "Filter 3", multiple = T, choices = c("All", letters)),
                 actionButton("goButton", "Go!"),
                 p(class = 'text-center', downloadButton('dl', 'Download Data'))
    ),

    mainPanel(
      DT::dataTableOutput("tableprint")
    )
  )
)

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

  output$tableprint <- DT::renderDataTable({

    # Data
    df <- tibble(LETTERS = rep(LETTERS, 2), Numbers = as.character(1:52),
                 letters = paste(LETTERS, Numbers, sep = ""))

    df1 <- df

    if("All" %in% input$filter1){
      df1
    } else if (length(input$filter1)){
      df1 <- df1[which(df1$LETTERS %in% input$filter1),]
    }

    if("All" %in% input$filter2){
      df1
    } else if (length(input$filter2)){
      df1 <- df1[which(df1$Numbers %in% input$filter2),]
    }

    if("All" %in% input$filter3){
      df1
    } else if (length(input$filter3)){
      df1 <- df1[which(df1$letters %in% input$filter3),]
    }

    input$goButton

    # Update selectInput choices based on the filtered data. Update 'selected' to reflect the user input.
    updateSelectInput(session, "filter1", choices = c("All", df$LETTERS), selected = input$filter1)
    updateSelectInput(session, "filter2", choices = c("All", df1$Numbers), selected = input$filter2)
    updateSelectInput(session, "filter3", choices = c("All", df1$letters), selected = input$filter3)

    datatable(df1)

  })

  output$dl <- downloadHandler('mydata.csv', content = function(file) {

    # Data
    df <- tibble(LETTERS = rep(LETTERS, 2), Numbers = as.character(1:52),
                 letters = paste(LETTERS, Numbers, sep = ""))

    df1 <- df

    if("All" %in% input$filter1){
      df1
    } else if (length(input$filter1)){
      df1 <- df1[which(df1$LETTERS %in% input$filter1),]
    }

    if("All" %in% input$filter2){
      df1
    } else if (length(input$filter2)){
      df1 <- df1[which(df1$Numbers %in% input$filter2),]
    }

    if("All" %in% input$filter3){
      df1
    } else if (length(input$filter3)){
      df1 <- df1[which(df1$letters %in% input$filter3),]
    }


    # Update selectInput choices based on the filtered data. Update 'selected' to reflect the user input.
    updateSelectInput(session, "filter1", choices = c("All", df$LETTERS), selected = input$filter1)
    updateSelectInput(session, "filter2", choices = c("All", df1$Numbers), selected = input$filter2)
    updateSelectInput(session, "filter3", choices = c("All", df1$letters), selected = input$filter3)

    datatable(df1)

    write.csv(df1, file)
  })
}

# Run the application 
shinyApp(ui = ui, server = server)
库(闪亮)
图书馆(dplyr)
图书馆(DT)

ui当我在
Filter1
中选择A和B时,数据集是
字母的子集,带有
A
B
Filter2
中的选项是
1,2,27,28
Filter3
中的选项是
A1、B2、A27、B28
。当我在
Filter2
中选择
1
时,
Filter3
中的选项为
A1
,当
Filter2
中也选择了
2
时,
Filter3
将更新为
A1
A27
作为选项。您没有用于
Filter2
Filter3
All
选项。这是你期待的吗

library(shiny)
library(dplyr)
library(DT)

ui <- fluidPage(

  titlePanel("Title"),

  sidebarLayout(
    sidebarPanel(width=3,
                 selectInput("filter1", "Filter 1", multiple = TRUE, choices = c("All", LETTERS)),
                 selectInput("filter2", "Filter 2", multiple = TRUE, choices = c("All", as.character(seq.int(1, length(letters), 1)))),
                 selectInput("filter3", "Filter 3", multiple = TRUE, choices = c("All", letters))    ),

    mainPanel(
      DT::dataTableOutput("tableprint")
    )
  )
)

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

  output$tableprint <- DT::renderDataTable({

    # Data
    df <- tibble(LETTERS = rep(LETTERS, 2), Numbers = as.character(1:52),
                 letters = paste(LETTERS, Numbers, sep = ""))

    df1 <- df

    if("All" %in% input$filter1){
      df1
    } else if (length(input$filter1)){
      df1 <- df1[which(df1$LETTERS %in% input$filter1),]
    }

    # Update selectInput choices based on the filtered data. Update 'selected' to reflect the user input.
    updateSelectInput(session, "filter1", choices = c("All", df$LETTERS), selected = input$filter1)
    updateSelectInput(session, "filter2", choices = c("All", df1$Numbers), selected = input$filter2)



    if("All" %in% input$filter2){
      df1
    } else if (length(input$filter2)){
      df1 <- df1[which(df1$Numbers %in% input$filter2),]
    }
    updateSelectInput(session, "filter3", choices = c("All", df1$letters), selected = input$filter3)

    if("All" %in% input$filter3){
      df1
    } else if (length(input$filter3)){
      df1 <- df1[which(df1$letters %in% input$filter3),]
    }
    datatable(df1)

  })
}

# Run the application 
shinyApp(ui = ui, server = server)
库(闪亮)
图书馆(dplyr)
图书馆(DT)

ui不确定您想要什么:您的过滤器按预期更新在第一个过滤器中选择一个,然后尝试在第二个过滤器中选择两个模式,我无法修复它,我需要添加“全部”以选择这两个模式。当我选择1时,我不能选择27…所以只需将您的
updateSelectInput
s移动到第一个过滤器之后和其他两个过滤器之前,这样df1仍将包含所有模式。但是添加过滤器是一项艰巨的任务,在第一个过滤器完成后,我会移动更新ElcTinputs,但我没有得到你的第二个建议?它是否能像预期的那样工作?谢谢,是的,这就是功能性,只是我想在过滤器上也有“所有”选项请,您知道如何删除DT::DataTable中编号行的第一列吗?在
DataTable
函数中包括
rownames=FALSE
datatable(df1,rownames=FALSE)
非常有用,我们花了2天时间找到了类似的解决方案,只是想知道,如果我们不想显示表,因此只想使用此功能更新过滤器值,我们如何才能实现同样的效果?