Input for shiny app

Hi everybody, in the basic "Old Faithful Geyser data" shiny histogram app, I want to know how I can generalize the app to plot the histogram for other data frames in my current R session. Specifically, I would like to:

  1. create an selectInput widget with choice equal to the list of all the data frames in my current R-session
  2. upon choosing the data frame from the drop down list, the app will dynamically creates another selectInput widget with the choices equal to the column names.
  3. The app will do the histogram for the selected column (in 2) of the selected data frame (in 1).

I am currently stuck with part 1, the choice of my selectIntput and part 3, assigning the data frame to a variable inside the server.

Below is the basic app I am referring to. Thank you very much.

No user-supplied code found … so we’ve made some up. You’re welcome!

This is a Shiny web application. You can run the application by clicking

the 'Run App' button above.

Find out more about building applications with Shiny here:

http://shiny.rstudio.com/

library(shiny)

Define UI for application that draws a histogram

ui <- fluidPage(

# Application title
titlePanel("Old Faithful Geyser Data"),

# Sidebar with a slider input for number of bins 
sidebarLayout(
    sidebarPanel(
        sliderInput("bins",
                    "Number of bins:",
                    min = 1,
                    max = 50,
                    value = 30)
    ),

    # Show a plot of the generated distribution
    mainPanel(
       plotOutput("distPlot")
    )
)

)

Define server logic required to draw a histogram

server <- function(input, output) {

output$distPlot <- renderPlot({
    # generate bins based on input$bins from ui.R
    x    <- faithful[, 2]
    bins <- seq(min(x), max(x), length.out = input$bins + 1)

    # draw the histogram with the specified number of bins
    hist(x, breaks = bins, col = 'darkgray', border = 'white')
})

}

Run the application

shinyApp(ui = ui, server = server)

create an selectInput widget with choice equal to the list of all the data frames in my current R-session

You can list all variables using ls(), then it is just a matter of filter the data frames. One way to go is something like:

all_vars <- ls()

mask <- purrr::map_lgl(
  all_vars, 
  function(var_name){
     any(class(get(var_name)) %in% "data.frame")
  })

all_df <- all_vars[mask]

Now the second part:

assigning the data frame to a variable inside the server.

If all_df is your choice in the input (say input$df_name), then you can simply do inside the renderPlot:

output$distPlot <- renderPlot({
  req(input$df_name)
  data <- get(input$df_name)
  # ... and select the column and so on
```

Thank you very much for the solution.

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.