【问题标题】:R Shiny Ignore placeholder label/value filtering with selectInputR Shiny 使用 selectInput 忽略占位符标签/值过滤
【发布时间】:2021-11-14 11:53:56
【问题描述】:

用户界面

selectInput("marital_status", "Marital Status: ", choices = c("SELECT", setNames(marital_status$m_id,marital_status$m_name)))

服务器

selected_members <- reactive(
    
      tmk %>% filter(between(AGE, input$age[1], input$age[2])) %>% 
        filter(between(ROOMS, input$room[1], input$room[2])) %>% 
        filter(between(PMT, input$pmt[1], input$pmt[2])) %>% 
        filter(MARITAL_STATUS %in% input$marital_status)
  )

当前 MARITAL_STATUS 上的最后一个过滤器在 selected_memebers 数据帧中产生 0 结果,因为 input$marital_status 处的 selectInput 返回值在应用程序首次运行时初始化为“SELECT”,有什么方法可以选择“占位符”/“默认”要从过滤器中忽略,我不太确定确切的格式,任何帮助将不胜感激!

P.S:代码适用于带有 MARITAL_STATUS 输入值/选择的单个选择

【问题讨论】:

  • 我不确定它是否会有所帮助,但是当我遇到类似的事情时,我只是将反应式设置为 ifelse。即reactive({if(input$marital_status == "SELECT") {tmk} else {tmk%&gt;%filter(MARITAL_STATUS %in% input$marital_status) })
  • 您可以使用另一个 reactiveVal,它在 MARITAL_STATUS 更改时首先填充,但在此之前不填充
  • @Silentdevildoll 你的建议似乎没有按预期工作,if(input$marital_status == "SELECT") {tmk} else {tmk%>%filter(MARITAL_STATUS %in% input$marital_status)} tmk %>% 过滤器(介于(年龄,输入$age[1],输入$age[2]))%>% 过滤器(介于(房间,输入$room[1],输入$room[2]))% >% filter(between(PMT, input$pmt[1], input$pmt[2])) ... 这显示相同数量的记录与占位符和任何其他实际选择,我错过了什么吗?
  • @mnist 你能详细说明一下吗,请注意用户可以选择“占位符”/“选择”只是为了关闭婚姻状态过滤器或不时选择它的任何值
  • 您能否提供问题所需的uiserver 代码,以便在需要时连同必要的数据一起完全重现问题?

标签: r dplyr shiny


【解决方案1】:

只需在您的响应式内部的第一行添加一个req。请记住用{} 将您的表达式包装在reactive

selected_members <- reactive({
    req(input$marital_status != "SELECT")
    tmk %>% filter ...
})

【讨论】:

  • req(input$marital_status != "SELECT") ... 这会关闭所有过滤器,其他过滤器是否可能最初仍然工作(忽略 marital_status 过滤器)并返回一些行,即更大随着用户进一步向下选择,数据集开始变小
【解决方案2】:

如果您希望“过滤器”最初忽略占位符文本并仅在用户进行任何有效选择时搜索(或返回占位符文本,在这种情况下它返回更大的数据集,即跳过过滤器),以下是正确的语法

tmk %>% filter(between(AGE, input$age[1], input$age[2])) %>% 
        filter(between(ROOMS, input$room[1], input$room[2])) %>% 
        filter(between(PMT, input$pmt[1], input$pmt[2])) %>%
        {if(input$marital_status != "SELECT") filter(., MARITAL_STATUS == input$marital_status) else .}

【讨论】:

    猜你喜欢
    • 2021-08-04
    • 2020-10-19
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 2011-07-09
    • 2018-06-14
    • 2020-01-14
    相关资源
    最近更新 更多