【问题标题】:Reactive data table in Shiny with optional filtering带有可选过滤的 Shiny 中的反应性数据表
【发布时间】:2020-04-14 08:09:28
【问题描述】:

我在创建一个简单的 Shiny 应用程序时遇到了双重问题。我知道这个主题在其他几个问题中也有所涉及,但是在研究了它们之后,我还没有找到一个可以完全涵盖我的问题的问题。

我想渲染 mtcars 表(全 32 行作为默认选项),然后我想对允许多选的齿轮数量应用反应式过滤器。

以下代码在许多方面都不起作用:

  1. 除非设置了齿轮过滤器,否则不会渲染 mtcars 表。相反 - 我在应用程序中收到一条错误消息:“结果的长度必须为 32,而不是 0”

  2. 选择多个档位等级不能正确叠加。当我分别选择每个齿轮号时,表格会正确呈现,但是,可以说,当我结合显示齿轮号 3 和 4 时,我只返回 10 行,这是不正确的。

提前感谢您的帮助。

 ui <- fluidPage(
  sidebarLayout(
    mainPanel(

      selectInput("pickvalue", label = "Gears", mtcars$gear,
                  selected = NULL, multiple = T)),


      tableOutput("tableOut")

    )
  )


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


 gears <- reactive({
    mtcars %>%  filter(gear == input$pickvalue) %>% select(-gear)
  })

  output$tableOut<- renderTable({gears()
  })

}

shinyApp(ui = ui, server=server)

【问题讨论】:

  • 如果允许多个选项按...过滤,我相信您想要gear %in% input$pickvalue

标签: r datatable shiny datatables reactive-programming


【解决方案1】:

你的问题的关键是

  1. 当您的输入为 NULL(即当您第一次打开应用程序时)时创建一个 if statement,它只会输出数据集
  2. 选择多个输入时,需要使用%in%运算符

见下面的代码:

ui <- fluidPage(
  sidebarLayout(
    mainPanel(

      selectInput("pickvalue", label = "Gears", unique(mtcars$gear),
                  selected = NULL, multiple = T)),


    tableOutput("tableOut")

  )
)


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


  gears <- reactive({

    dat <- mtcars

    if (!is.null(input$pickvalue)){dat <- dat %>% filter(gear %in% input$pickvalue)} 

    dat <- dat %>% select(-gear)

    return(dat)

  })

  output$tableOut<- renderTable({gears()})

}

shinyApp(ui = ui, server=server)

【讨论】:

  • 谢谢!我猜我会有关于 updateSelectInput 的增量问题。假设我有额外的 selectInput 子句,例如 Carb:selectInput("pickvalue2", label = "Carb", unique(mtcars$carb), selected = NULL, multiple = T)), Carb 有 6 个唯一值,并非所有值都结合在一起具有 Gears 的 3 个独特值。是否可以响应式更新 selectInputs,使其仅显示 Gears 和 Carbs 的现有组合并且不返回空行?
  • 是的,您需要使用 uiOutput/renderUI 将第二个 selectInput 放在服务器端,然后根据 input$pickvalue 的选择过滤选项
  • 谢谢,但哪个是“第二个”,因为在这种情况下我可以开始使用 Carb 或 Gears 进行过滤
  • 如果您希望 Carb 或 Gears 成为第一个过滤器,那么您必须将它们都放在服务器中,并在使用另一个过滤器时使用一些观察来捕获。这变得更加复杂但可行
  • 哦,我明白了,我从来没有实现过任何观察者/动作,这似乎有点太多了。你有什么好的教程可以让我学习吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
相关资源
最近更新 更多