R闪亮:反应式DF,根据反应式嵌套IF语句进行过滤

时间:2018-08-17 13:52:26

标签: r shiny reactive nested-if

我正在尝试创建一个使用输入文件并允许用户通过应用多个条件并选择关键字以在所选列中查找 的应用来 过滤该应用 。< / p>

过滤逻辑:

  1. 在textInput小部件中输入关键字(用逗号分隔);通过selectInput,选择列以检查此类关键字是否出现在其中

  2. 之后使用AND或OR逻辑应用另一对textInput + selectInput条件

  3. 然后从第3个过滤器中排除包含所选列中包含关键字的行。

我附上mtcars示例。我创建了UI和服务器代码:

library(shiny)
library(tidyverse)
library(stringr)
library(dplyr)
library(DT)
library(gridExtra)
library(gdata)
library(data.table)

df<- as.data.table(mtcars)

ui <- fluidPage(

   # Application title
   titlePanel("example"),

   # Sidebar with a slider input for number of bins 
   sidebarLayout(
      sidebarPanel(
        #WELL 1. KEYS FILTER
        wellPanel(textInput("keys1", label = h3("Enter keywords separated by     comma:"), placeholder = "Enter text..."),
                  selectInput("cols1", "Select variables:", choices=colnames(df), multiple=T)),

        #AND/OR SELECTOR CONNECTING 1st AND 2nd FILTERS
        radioButtons(inputId="and_or",
                     label="",
                     c("AND"="&", 
                       "OR"="|"),
                     selected="&", inline=T),

        #WELL 2. KEYS2 FILTER
        wellPanel(textInput("keys2", label = h3("Enter keywords separated by comma:"), placeholder = "Enter text..."),
                  selectInput("cols2", "Select variables:", choices=colnames(df), multiple=T)),

        #WELL 3. EXCLUDER FILTER
        wellPanel(textInput("excluders", label = h3("Enter keywords to exclude separated by comma:"), placeholder = "Enter text..."),
                  selectInput("cols_excl", "Select variables:", choices=colnames(df), multiple=T)),
        actionButton("keys_button", "Filter"), 
        width=3),

      mainPanel(
        tableOutput("summary"),
        DT::dataTableOutput("table")
      )
   )
)



server <- function(input, output) {

  #FILTER_INDEX1
  keys_vector1 <- reactive({
    paste0(unlist(trim(strsplit(input$keys1,","))), collapse = "|")
  })
  keys_index1 <- reactive({
    which(!!rowSums(sapply(df[input$cols1], grepl, pattern = keys_vector1(),     ignore.case = TRUE)))
  })

  #FILTER_INDEX2
  keys_vector2 <- reactive({
    paste0(unlist(trim(strsplit(input$keys2,","))), collapse = "|")
  })
  keys_index2 <- reactive({
    which(!!rowSums(sapply(df[input$cols2], grepl, pattern = keys_vector2(), ignore.case = TRUE)))
 })

  #FILTER_INDEX2
  keys_vector3 <- reactive({
    paste0(unlist(trim(strsplit(input$excluders,","))), collapse = "|")
  })
  keys_index3 <- reactive({
    which(!!rowSums(sapply(df[input$cols_excl], grepl, pattern = keys_vector3(), ignore.case = TRUE)))
  })   



#SUMMARY TABLE  
  output$summary<- renderTable({
        df%>%
    summarize("Number of observations"=n())
  })

#FILTERED DATATABLE
  output$table <- DT::renderDataTable({

    DT::datatable(df[,], options = list(searching = FALSE))
  })


}


shinyApp(ui = ui, server = server)

产生以下结果: enter image description here

我现在正在努力使数据帧根据3个连续的用户输入进行过滤。

以下是我要执行的操作示例:

过滤器1:过滤在“碳水化合物”或“齿轮”列(通过input$keys1选择)中包含数字“ 4”(输入input$cols1)的行

过滤器2:到结果数据集,在“ am”列中添加也包含“ 0”的行(在input$keys2input$cols2中输入数据并在input$and_or

过滤器3:从结果数据集中,排除“ rm”列中包含“ Mazda”的行(通过在input$keys3input$cols3中输入数据)

我认为可以通过将每个过滤器的结果存储为索引向量,然后根据选择的AND / OR单选按钮对其应用交集/单位来完成此操作。

理想情况下,我只想在按下actionButton“过滤器”后才运行过滤器。我还计划将过滤后的数据框存储为反应对象,以下载并汇总图表。

我真的很感谢有人对如何实施此规则有想法/提示。

提前谢谢! :)

0 个答案:

没有答案