0
votes

I have an app that subsets a data frame based on two variables and prints the result.

library(shiny)
library(tidyverse)

# Define a toy data frame in which variables are not crossed.
d = tibble(
    colour = c('blue','blue','yellow','yellow'),
    thing = c('the sea',"my lover's eyes", 'the sun', 'campari')
)


# Define UI for application that takes two vars and returns text
ui <- fluidPage(

    # Sidebar with two var filters
    sidebarLayout(
        sidebarPanel(
            selectInput("my_colour", "Pick a colour:", 
                        choices=unique(d$colour)),
            selectInput("my_thing", "Pick a thing:", 
                        choices=unique(d$thing))
        ),

        # Print text
        mainPanel(
           textOutput("my_text")
        )
    )
)

# Server logic: subset d based on input, print output
server <- function(input, output) {

    output$my_text <- renderText({
        d %>% 
            filter(
                colour == input$my_colour,
                thing == input$my_thing
            ) %>% 
            pull(thing) %>% 
            paste(collapse = ', ')
    })
}

# Run the application 
shinyApp(ui = ui, server = server)

The first sidebar input (my_colour) in principle restricts the second one (my_thing) since some things are yellow, others are blue.

Currently, picking a value for my_thing that doesn't exist in my_colour results in an empty string, which is fair enough.

I'd like to set things up so that the input choices for my_thing are restricted based on the input choice for my_colour so that when my_colour == yellow the only options available in the drop-down menu for my_thing are the sun and campari, while when my_colour == blue these are the sea and my lover's eyes.

This requires some sort of a reactive something and I'm not sure how it would work exactly.