Ben
Ben

Reputation: 1522

How to select a column from a dynamic input variable?

I'm using flexdashboard and shiny to choose which variable to plot:

varSelectInput("button_var_fir"
               , "Select first num variable"
               , data = df_scat,
                multiple = FALSE
               )

ggplot(df_scat, aes(x = !!input$button_var_fir, y = Gen_type, fill = stat(x))) +
  geom_point(size= 3, alpha = .075) 

it works fine, so far. My problem is, that I would like to subset the data e.g via

df$variable > 0
ggplot(df_scat, aes(x = df$!!input$button_var_fir > 0, y = Gen_type, fill = stat(x))) +
      geom_point(size= 3, alpha = .075) 

but this doesn't work due to the $!!. How can I solve this?

Upvotes: 0

Views: 1059

Answers (2)

Dan Adams
Dan Adams

Reputation: 5254

In {ggplot2}, which uses tidy evaluation, you can use the .data pronoun to dynamically select variables. It's nicely explained outside the {shiny} context in this answer too. This doesn't apply in {plotly} so you can either select with x = data[[input$column]] or x = get(input$column). This is also explained in this question.

Here's a small example to demonstrate how to do this for each plotting function.

library(plotly)
library(tidyverse)
library(shiny)

nbins <- 10

ui <- fluidPage(titlePanel("Dynamic Variable Selection"),
                sidebarLayout(sidebarPanel(
                  selectInput(
                    inputId = "y1",
                    label = "Select variable",
                    choices = names(mtcars))),
                mainPanel(plotOutput(outputId = "ggplot"),
                          plotlyOutput(outputId = "plotly"))))

server <- function(input, output) {
  # dynamically pull variable in ggplot
  output$ggplot <- renderPlot({
    mtcars %>%
      ggplot(aes(x = .data[[input$y1]])) +
      geom_histogram(bins = nbins) +
      ggtitle("ggplot")})
  # dynamically pull variable in plotly
    output$plotly <- renderPlotly({
    mtcars %>%
        plot_ly(x = .[[input$y1]], type = "histogram", nbinsx = nbins) %>% 
        layout(title = list(text = "Plotly"),
               xaxis = list(title = input$y1))
      })
    }

shinyApp(ui = ui, server = server)

screenshot

Upvotes: 2

Georgery
Georgery

Reputation: 8117

Maybe what you want is

df[[input$button_var_fir]] > 0

instead of df$!!input$button_var_fir > 0.


Addition:
You want to subset the data that goes into the plot, right? What I would actually do is subsetting the dataframe itself before it goes into the plot function. When you use the tidyverse this could be what you want:

df_scat %>%
    filter(!!input$button_var_fir > 0) %>%
    ggplot(aes(x = !!input$button_var_fir, y = Gen_type, fill = stat(x))) +
    geom_point(size= 3, alpha = .075) 

Upvotes: 0

Related Questions