0

am trying to create a shiny app allows user to select column from multiple dataframes and search for values in selected columns. however am getting no data! where am passing 'input$select' as an argument to "startswith" function, what I know 'startswith' function takes a vector of character as an argument to match with string. here is my app, what am doing wrong? Thanks

library(shiny)
library(shinydashboard)
library(DT)

Name <- c("Martin Lawrence", "Will Smith", "Harrison Ford", "Tom Hanks")
Age <- c(55, 50, 85, 60)
Table1 <- data.frame(Name, Age, stringsAsFactors = F)
Table1 <- data.table::data.table(Table1)

Name <- c("Jim Carrey", "Mark Wahlberg", "Harrison Ford", "Tom Hanks")
Age <- c(55, 45, 85, 60)
Table2 <- data.frame(Name, Age, stringsAsFactors = F)
Table2 <- data.table::data.table(Table2)



ui <- dashboardPage(
  dashboardHeader(title = "Searching Dashboard"),
  dashboardSidebar(
    width = 300,
    sidebarMenu(
      sidebarSearchForm(
        textId = "searchText",
        buttonId = "searchButton",
        label = "Search Dataset"
      ),
      tags$br(),
      menuItem(
        "Show Data",
        tabName = "tabset3",
        icon = icon("info",
                    lib = "font-awesome")
        ),
      selectInput("select1", "Select columns to display from Table1", names(Table1), multiple = FALSE),
      tags$br(),
      selectInput("select2", "Select columns to display from Table2", names(Table2), multiple = FALSE)
    )
  ),
  dashboardBody(scrollx = TRUE,
                tabItems(
                  tabItem(tabName = "tabset3",
                          fluidRow(
                            tabBox(
                              title = "Matching Data",
                              tags$head(tags$style()),
                              id = "tabset3",
                              height = "550px",
                              width = "500px",
                              tabPanel("Table 1",
                                       div(style = 'overflow-x: scroll;', DTOutput('table1'))),
                              tabPanel("Table 2",
                                       div(style = 'overflow-x: scroll;', DTOutput('table2'))),
                              )
                          ))
                ),),
)
server <- function(input, output, session) {
  
  output$table1 <- renderDT({
    req(input$searchButton == TRUE)
    Table1[startsWith(input$select1, input$searchText)]
  })
  
  output$table2 <- renderDT({
    req(input$searchButton == TRUE)
    Table2[startsWith(input$select2, input$searchText)]
  })
}
shinyApp(ui , server)
Ahmed
  • 1

1 Answers1

0

Something like this, please note that its key sensitive Will and will are different searches. Better also to put into separate reactive expressions...

  d1 <- eventReactive(input$searchButton,{
    Table1[startsWith(Table1[[input$select1]], input$searchText)]
  })
  
  output$table1 <- renderDT({
    d1()
  })
  
  d2 <- eventReactive(input$searchButton,{
    Table2[startsWith(Table2[[input$select2]], input$searchText)]
  })
  
  output$table2 <- renderDT({
    d2()
  })

for key seansitive searches, you can use tolower

  d1 <- eventReactive(input$searchButton,{
    Table1[startsWith(tolower(Table1[[input$select1]]), tolower(input$searchText))]
  })
  
  output$table1 <- renderDT({
    d1()
  })
  
  d2 <- eventReactive(input$searchButton,{
    Table2[startsWith(tolower(Table2[[input$select2]]), tolower(input$searchText))]
  })
  
  output$table2 <- renderDT({
    d2()
  })
Pork Chop
  • 28,528
  • 5
  • 63
  • 77