Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Changing select input choices in r Shiny

Tags:

r

shiny

I am trying to build an app using Shiny. It will contain 2 dropdowns, one will show the name of 7 different sectors- it,bank,steel,fmcg etc. The other dropdown should contain list of name of companiesof selected sector, i.e list of names will be dynamic.

1.I am not getting any idea about how to change list of names of 2nd dropdown dynamically, for eg. if we select "IT" 2nd dropdown should contain "infosys" ,"tcs" etc, if we select "Bank", 2nd dropdown musr show "SBI","ICICI" etc.

ui.R

library(shiny)
shinyUI(fluidPage(
titlePanel("Forecasting of stock prices and their accuracies"),

sidebarLayout(
sidebarPanel(
radioButtons("rd",
             label="Select time range for training dataset",
             choices=list("23 month","18 month","12 month","6 month"),
             selected="23 months"),

selectInput("sector",
            label="select a sector",choices=list("IT"=1,"Bank"=2,"Power"=3,"Steel"=4,        
"FMCG"=5,"Infrastructure"=6,"Automobile"=7 ),                  
            selected=1),


selectInput("stock",
            label="select a option",choices=list("co.1"=1,"co.2"=2,
"co.3"=3,"co.4"=4,"co.5"=5,"
co.6"=6,"co.7"=7,"co.8"=8),
            selected=1)

),
mainPanel("Display results",
        textOutput("summary"),
        tableOutput("view"))
)
))

server.R

shinyServer(function(input, output) {
datasetInput <- reactive({
 if(input$sector=="1"){
 switch(input$stock, 
               "1" = Infy,
               "2" = TCS,
               "3" = Wipro,
               "4" = TechM)}

 else if(input$sector=="2"){
   switch(input$stock, 
          "1" = SBIN,
          "2" = ICICI,
          "3" = HDFC,
          "4" = Axis,
          "5" = IDBI,
          "6" = PSB,
          "7" = BOI,
          "8" = Bob
   )}
})

output$view<-renderTable({
 head(datasetInput(),n=10)
})

})
like image 252
user2969490 Avatar asked Apr 28 '14 07:04

user2969490


1 Answers

If your data is in a data.frame with variables to represent industry and stock, you could use renderUI to dynamically create the second selectInput.

ui.R

library(shiny)
shinyUI(fluidPage(
  titlePanel("Forecasting of stock prices and their accuracies"),

  sidebarLayout(
    sidebarPanel(
      radioButtons("rd",
                   label="Select time range for training dataset",
                   choices=list("23 month","18 month","12 month","6 month"),
                   selected="23 months"),
      uiOutput("Box1"),
      uiOutput("Box2")
    ),
    mainPanel("Display results",
              tableOutput("view"))
  )
))  

server.R

library(shiny)
biz = data.frame(
  Sector = c("a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"), 
  Stock = c("Infy","TCS","Wipro","TechM","SBIN","ICICI","HDFC", "Axis", "IDBI", "PSB","BOI","Bob"),
  stringsAsFactors = FALSE
)
shinyServer(function(input, output) {


  output$Box1 = renderUI(selectInput("sector","select a sector",c(unique(biz$Sector),"pick one"),"pick one"))


  output$Box2 = renderUI(
    if (is.null(input$sector) || input$sector == "pick one"){return()
    }else selectInput("stock", 
                      "Select a stock", 
                      c(unique(biz$Stock[which(biz$Sector == input$sector)]),"pick one"),
                      "pick one")
  )


  subdata1 = reactive(biz[which(biz$Sector == input$sector),])
  subdata2 = reactive(subdata1()[which(subdata1()$Stock == input$stock),])

  output$view = renderTable({
    if(is.null(input$sector) || is.null(input$stock)){return()
    } else if (input$sector == "pick one" || input$stock == "pick one"){return()

    } else return(subdata2())
  })

})
like image 135
Paul de Barros Avatar answered Nov 16 '22 04:11

Paul de Barros