R如果行包含字符串,则对过滤器有光泽

时间:2020-10-28 16:23:53

标签: r shiny reactive

我正在使用R Shiny输出表,但是在reactive的{​​{1}}部分进行过滤时遇到了麻烦。在此示例中,我使用的是renderDataTable表,并且尝试按mtcars进行过滤:

type

当前,library(shiny) library(DT) ui <- fluidPage( titlePanel("MTCARS"), sidebarLayout( sidebarPanel(id="sidebar", textInput("type", label = "Type", placeholder = "Type"),) , mainPanel( dataTableOutput("data") ) ) ) server <- function(input, output, session) { selected <- reactive({ if (length(input$type) != 0) { mtcars$type %in% input$type } else { TRUE } }) output$data <- renderDataTable(mtcars[selected(),]) } shinyApp(ui = ui, server = server) 根据用户输入的mtcars$type %in% input$type来过滤表。但是,我要对此进行修改,以便:

  1. 文本不必完全匹配。如果用户键入type,则将显示包含Honda Civic的行。
  2. 该表需要从整个表开始。尽管有if / else语句,但目前启动时没有行。

1 个答案:

答案 0 :(得分:1)

mtcars没有任何列类型,因此我必须创建一个。我使用stringr::str_detect来包含部分匹配的类型。

library(shiny)
library(DT)

data <- mtcars %>%
  rownames_to_column(var = "type")

ui <- fluidPage(
  titlePanel("MTCARS"),
  sidebarLayout(
    sidebarPanel(id="sidebar",
                 textInput("type",
                           label = "Type", 
                           placeholder = "Type"),)
    ,
    mainPanel(
      dataTableOutput("data")
    )
  )
)

server <- function(input, output, session) {
  selected <- reactive({
    if (length(input$type) != 0) {
      stringr::str_detect(data$type, input$type)
    } else {
      TRUE
    }
  })
  output$data <- renderDataTable(data[selected(),])
}

shinyApp(ui = ui, server = server)