使用shinydataFilter保存输入状态

anauzrmj  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(96)
  • 我有一个复杂的应用程序,在这里我试图将其分解到最低限度,以展示我面临的问题。

我使用shinyDataFilter来过滤一个嵌套框。然而,我有一个嵌套框列表作为输入,对于每个嵌套框,我有一个与之关联的过滤器。

library(shiny)
# devtools::install_github("dgkf/shinyDataFilter")
library(shinyDataFilter)

ui <- fluidPage(
  titlePanel("Filter Data Example"),
  selectInput("dataset", "Select Dataset : ", c("df1", "df2")),
  uiOutput("data_filter"),
  dataTableOutput("table1"),
  dataTableOutput("table2")
)

server <- function(input, output, session) {
  list_data <- list(df1 = data.frame(col1 = factor(letters[1:5]), col2 = 1:5), 
      df2 = data.frame(col1 = factor(letters[3:18]), col2 = 3:18, col3 = 1:16))
  
rv <- reactiveValues()
  
  observe({
    rv$rv_child <- purrr::imap(list_data, function(x, y) 
                callModule(shiny_data_filter,paste0("data_filter_",y), data = x))
  })
  
  output$data_filter <- renderUI({
    req(input$dataset)
    nm <- paste0("data_filter_",input$dataset)
    shiny_data_filter_ui(nm)
  }) 
  
  output$table1 <- renderDataTable({
    req(rv$rv_child)
    rv$rv_child$df1()
  })
  
  output$table2 <- renderDataTable({
    req(rv$rv_child)
    rv$rv_child$df2()
  })
}

shinyApp(ui = ui, server = server)

字符串
要重现该问题,请运行以下代码,默认情况下,在表1中选择第一个表框。单击“添加过滤器”按钮后选择col1,然后选择几个值。在表1中选择df2,然后再次返回df1。现在可以看到表1已经使用之前选择的值进行了过滤,但是,输入丢失,这让用户感到困惑。我的目标是显示过滤表对应的过滤器输入,使它们保持一致。当用户回到df1时,他们会看到他们之前选择的输入。


的数据

cbwuti44

cbwuti441#

这个有用吗它保持所有过滤器可用,只是在点击下拉菜单中的一个项目时隐藏它们。过滤器现在在选择不同的数据框时不应该改变。
注意:在运行你的例子后,过滤器没有显示在我的环境中。这里可能还有一些包版本依赖的问题。

library(shiny)
# devtools::install_github("dgkf/shinyDataFilter")
library(shinyDataFilter)

ui <- fluidPage(
  titlePanel("Filter Data Example"),
  selectInput("dataset", "Select Dataset : ", c("df1", "df2")),
  tabsetPanel(id = "data_filters", type = "hidden"),
  dataTableOutput("table1"),
  dataTableOutput("table2")
)

server <- function(input, output, session) {
  list_data <- list(df1 = data.frame(col1 = factor(letters[1:5]), col2 = 1:5), 
                    df2 = data.frame(col1 = factor(letters[3:18]), col2 = 3:18, col3 = 1:16))
  
  lapply(names(list_data), \(i){
    insertTab(
      inputId = "data_filters",
      tabPanel(
        title = i,
        shiny_data_filter_ui(paste0("data_filter_", i))
      )
    )
  })
  
  observeEvent(input$dataset, {
    updateTabsetPanel(
      inputId = "data_filters", 
      selected = input$dataset
      )
  })
  
  rv <- reactiveValues()
  
  observe({
    rv$rv_child <- purrr::imap(list_data, function(x, y) 
      callModule(shiny_data_filter,paste0("data_filter_",y), data = x))
  })
  
  output$table1 <- renderDataTable({
    req(rv$rv_child)
    rv$rv_child$df1()
  })
  
  output$table2 <- renderDataTable({
    req(rv$rv_child)
    rv$rv_child$df2()
  })
}

shinyApp(ui = ui, server = server)

字符串
注2:如果只显示数据框和所选数据框的过滤器(input$dataset中的那个),我认为最好是为一个过滤器和表组合创建一个UI和服务器模块,然后为每个所需的数据框循环这个。但我猜这不是你想要的,对吗?

相关问题