【问题标题】:How to use dplyr::filter with input values in a reactive environment?如何在反应式环境中将 dplyr::filter 与输入值一起使用?
【发布时间】:2021-09-05 05:44:54
【问题描述】:

我试图让用户在数据集中选择一个变量diamonds。然后,将弹出一个复选框组(包含该变量中的所有唯一名称)。例如,如果我选择 diamonds 数据集的“颜色”列,则会出现一组复选框(在本例中为 E、I、J、H、F、G、D)。然后,用户应该能够通过只检查他们想要的颜色来按颜色过滤数据集。但是,当我在数据上使用filter 时,表格除了标题之外什么都没有显示。我想知道这里发生了什么,如果有人知道吗?谢谢!

MWE:

用户界面:

data("diamonds")
data1 <- diamonds
ui <-  fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput("class", label = "Class", choices = c("NONE", names(data1)), selected = "NONE")
    ),
    mainPanel(
      uiOutput("classtype"),
      tableOutput("table")
    )
  )
)

服务器:

server <- function(input, output, session) {
  output$classtype <- renderUI({
    if (input$class != "NONE") {
      checkboxGroupInput("classtype", label = "Class Type", choices = sapply(classlist(), unique))
    }
  })
  
  classlist <- reactive({
    data1 %>% 
      select(input$class)
  })

  output$table <- renderTable({
    data1 %>%
      filter(input$class %in% input$classtype)
  })
}

根据 Checkbox Group Input 文档,我认为 filter 会起作用,因为服务器将接收输入作为所选值的字符向量。我在这里遗漏了什么吗?

编辑:为了澄清,我的主要目的是能够过滤这些数据并将其用于多种目的。

【问题讨论】:

    标签: r dplyr shiny


    【解决方案1】:

    问题在于您的filter()。您必须将其作为symbol 传递。试试这个,

    server <- function(input, output, session) {
            output$classtype <- renderUI({
                    if (input$class != "NONE") {
                            checkboxGroupInput("classtype", label = "Class Type", choices = sapply(classlist(), unique))
                    }
            })
            
            classlist <- reactive({
                    data1 %>% 
                            select(input$class)
            })
            
            output$table <- renderTable({
                    data1 %>%
                            filter(!!sym(input$class) %in% input$classtype)
            })
            
    }
    

    这相当于下面的非shiny问题,

    mtcars %>% filter("cyl" == 6)
    
    

    这将返回一个空的data.frame。但是,如果您相应地对其进行修改,它将为您提供所需的内容,

    mtcars %>% filter(!!sym("cyl") == 6)
    

    【讨论】:

      【解决方案2】:

      问题在于input$class 只是一个带有变量名的字符串。为了使您的应用程序正常工作,您可以使用例如.data 代词“告诉”dplyr,您的意思是名称为 input$class 的变量。此外,我添加了一个 if 以确保您的应用在选择变量之前不会中断:

      server <- function(input, output, session) {
        output$classtype <- renderUI({
          if (input$class != "NONE") {
            checkboxGroupInput("classtype", label = "Class Type", choices = classlist())
          }
        })
      
        classlist <- reactive({
          unique(data1[[input$class]])
        })
      
        output$table <- renderTable({
          if (input$class != "NONE") {
            data1 %>%
              filter(.data[[input$class]] %in% input$classtype)  
          }
        })
      }
      

      【讨论】:

        【解决方案3】:

        去检查包DT:当我需要在 Shiny 中的表格进行交互时,我会使用它。这很容易理解,并且可以很好地过滤数据。

        【讨论】:

        • 感谢您的链接!我目前也在我的应用程序中使用 DT,但这肯定会帮助我改进我的应用程序。但是,我希望能够根据用户输入过滤我的数据并将其存储,以便它可以用于多种用途,例如绘制图表。我可能应该在我的问题中澄清这一点,我很抱歉。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-22
        • 2021-09-07
        • 2019-09-04
        • 2021-05-17
        相关资源
        最近更新 更多