0
votes

I am tying to create an R shiny app and I would like to have two selectInput i.e. data set name and column name. Right now, I am able to get data set names in the first Input but I am not able to create dependent column selectIput (whose list will depend upon data set selected). Please guide.

require(shiny)
require(MASS)

a <- data(package = "MASS")[3]
b <- a$results[,3]

ui <- fluidPage(
  sidebarPanel(width = 2,

  selectInput(inputId = "dsname",label = "Select Dataset:",choices = c(b)),

  colnames <- names("dsname"), 

  selectInput(inputId = "columns", label = "Choose columns",
              choices  = c(colnames))                   
  )
)

server <- function(input,output) {}

shinyApp(ui <- ui, server <- server)
1

1 Answers

0
votes

In order to have "responsive" elements in Shiny, you need to wrap your expressions for computing the responsive elements in reactive({...}).

You could use renderUI in your server() and uiOutput in your ui() with something like this. Here is an example I had built for using some of R's data sets (iris, mtcars, and diamonds):

library(shinythemes)
library(shiny)
library(ggplot2)

ui <- fluidPage(theme = shinytheme("superhero"),
   titlePanel("Welcome to Responisve Shiny"),
   sidebarLayout(
      sidebarPanel(
          selectInput("data", "Dataset:",
                      choices = c("mtcars", "iris", "diamonds")
                      ),
         uiOutput("x_axis"),
         uiOutput("y_axis"),
         uiOutput("color")
      ),
      mainPanel(
         plotOutput("distPlot")
      )
   )
)
server <- function(input, output) {
    output$x_axis <- renderUI({
        col_opts <- get(input$data)
        selectInput("x_axis2", "X-Axis:",
                    choices = names(col_opts))
    })
    output$y_axis <- renderUI({
        cols2 <- reactive({
            col_opts2 <- get(input$data)
            names(col_opts2)[!grepl(input$x_axis2, names(col_opts2))]
        })
        selectInput("y_axis2", "Y-Axis:",
                    choices = cols2(),
                    selected = "hp")
    })
    output$color <- renderUI({
        col_opts <- get(input$data)
        selectInput("color", "Color:",
                    choices = names(col_opts),
                    selected = "cyl")
    })
   output$distPlot <- renderPlot({
       if(input$data == "mtcars"){
           p <- ggplot(mtcars, aes_string(input$x_axis2, input$y_axis2, color = input$color)) +
               geom_point()
       }
       if(input$data == "iris"){
           p <- ggplot(iris, aes_string(input$x_axis2, input$y_axis2, color = input$color)) +
               geom_point()
       }
       if(input$data == "diamonds"){
           p <- ggplot(diamonds, aes_string(input$x_axis2, input$y_axis2, color = input$color)) +
               geom_point()
       }
      print(p)
   })
}
shinyApp(ui = ui, server = server)