我正在尝试创建一个使用输入文件并允许用户通过应用多个条件并选择关键字以在所选列中查找 的应用来 过滤该应用 。< / p>
过滤逻辑:
在textInput小部件中输入关键字(用逗号分隔);通过selectInput,选择列以检查此类关键字是否出现在其中
之后使用AND或OR逻辑应用另一对textInput + selectInput条件
然后从第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)
我现在正在努力使数据帧根据3个连续的用户输入进行过滤。
以下是我要执行的操作示例:
过滤器1:过滤在“碳水化合物”或“齿轮”列(通过input$keys1
选择)中包含数字“ 4”(输入input$cols1
)的行>
过滤器2:到结果数据集,在“ am”列中添加也包含“ 0”的行(在input$keys2
,input$cols2
中输入数据并在input$and_or
)
过滤器3:从结果数据集中,排除“ rm”列中包含“ Mazda”的行(通过在input$keys3
和input$cols3
中输入数据)
我认为可以通过将每个过滤器的结果存储为索引向量,然后根据选择的AND / OR单选按钮对其应用交集/单位来完成此操作。
理想情况下,我只想在按下actionButton“过滤器”后才运行过滤器。我还计划将过滤后的数据框存储为反应对象,以下载并汇总图表。
我真的很感谢有人对如何实施此规则有想法/提示。
提前谢谢! :)