How to display data in MainPanel based on user sel

2020-05-09 02:28发布

My dataframe looks like below, and I would like to build ShinyApp such that when user selects System from SidebarPanel only info. related to selected system gets displayed in mainpanel. Currently, below app displays entire datatable in mainpanel. I am new to shiny and I not sure how to hide datatable in mainpanel.

Is there any functionality available in Shiny ?

Provide explanation with code

DataFrame

> df <- data.frame("Users" =c('A',"B","A",'C','B'), "Date" = c('17 Mar 2019','15 Mar 2019','11 Mar 2019','20 Apr 2019',"21 Apr 2019"), "Systems" = c("Sys1", "Sys1","Sys2","Sys3","Sys4"), stringsAsFactors = FALSE)
> df
  Users        Date Systems
1     A 17 Mar 2019    Sys1
2     B 15 Mar 2019    Sys1
3     A 11 Mar 2019    Sys2
4     C 20 Apr 2019    Sys3
5     B 21 Apr 2019    Sys4

App so far..

library(shiny)
library(DT)
library(dplyr)
ui <- basicPage(
  h2("Different Systems"),
  sidebarLayout(
    sidebarPanel(
      selectInput('slct',"Select System",choices = df$Systems)
  ),
  mainPanel(
  DT::dataTableOutput("mytable")
)
)
)
server <- function(input, output) {
  #df$system<-rownames(df$Systems)
  output$mytable = DT::renderDataTable({
    df %>%
      filter(stringr::str_detect(Systems, as.character(input$slct)))

  })

}

shinyApp(ui, server)

1条回答
相关推荐>>
2楼-- · 2020-05-09 03:25

Option 1:

You ca use req() to ensure that input$slct must be available for the table to be displayed.

You only need to change your server code:

server <- function(input, output) {
    #df$system<-rownames(df$Systems)
    output$mytable = DT::renderDataTable({
        req(input$slct) # add this line
        df %>%
            filter(stringr::str_detect(Systems, as.character(input$slct)))

    })

}

Option 2:

You can use validate() and need make requirements and suggest user input.

server <- function(input, output) {
    #df$system<-rownames(df$Systems)
    output$mytable = DT::renderDataTable({
        validate(need(input$slct,"Please Select System")) # add this line
        df %>%
            filter(stringr::str_detect(Systems, as.character(input$slct)))

    })

}

Read those two articles for more information:

  1. https://shiny.rstudio.com/articles/validation.html
  2. https://shiny.rstudio.com/articles/req.html
查看更多
登录 后发表回答