Rprospector
Rprospector

Reputation: 17

Highcharter and Shiny with reactive dataset/mutated dataset within server function not working

When I try to produce a highcharter barplot within Shiny using a dataset that is grouped and summarized based on the selectInput values and these same values are referenced within hcaes() I get the error "object 'input' not found"

I have also tried hcaes_string() and then I get "object 'My.Variable' not found" but when I just put in My.Variable, it will produce the hchart so it can interact with the dataset being created within the server function. Obviously I'd like to switch between My.Variable and My.Variable2 with the dropdown. I've tried assigning the summarized dataset to a reactive object, but then I get the error "Objects of class/type reactiveExpr/reactive/function are not supported by hchart (yet)."

I've been at this for hours and this is my first question on StackOverflow. I rigged up a sample dataset so that the code is reproducible and I've updated R and RStudio to the latest versions.

library('highcharter')
library('plyr')
library('dplyr')
library('tidyr')
library('lubridate')
library('stringr')
library('tools')
library('shiny')

#demo <- read.csv("data/name-change-analysis.csv",stringsAsFactors = FALSE)

indiv <- rep(c('p1','p2','p3','p4','p5'),4)
Name.Change <- rep(c('yes','yes','no','yes','no'),4)
Overall.Category <- rep(c('against','support','support','neutral','against'),4)
Race <- rep(c('Black','White','White','Asian','White'),4)
Gender <- rep(c('Male','Male','Male','Female','Male'),4)

demo <- as.data.frame(cbind(indiv,Name.Change,Overall.Category,Race,Gender))

ui <- 
  navbarPage(
    "Responses by demographics",
    tabPanel(
      "Manual labels",
      fluidPage(
        fluidRow(
          column(
            selectInput(
              "category",
              label = "Select a demographic category:",
              choices = c("Race",
                          "Gender" = "gender")
            ),
            width = 6
          ),
          column(
            selectInput(
              "name_or_overall",
              label = "Response Category",
              choices = c(
                "Name Change" = "Name.Change",
                "Overall Category" = "Overall.Category"
              ),
              width = "100%"
            ),
            width = 6
          )
        ),
        highchartOutput("hcontainer")
      )
    ),
    collapsible = TRUE
  )

server <- function(input, output, session) {
  

output$hcontainer <- renderHighchart({
  
  demo %>%
    group_by(input$category,input$name_or_overall) %>%
    summarise(count = n()) %>%
    hchart(type = "bar",
           hcaes(y = "count",
                 x = as.name(input$category),
                 group = as.name(input$name_or_overall))) %>%
    hc_plotOptions(bar = list(stacking = "percent")) %>%
    hc_tooltip(shared = TRUE)
  
})
}

shinyApp(ui,server)

Upvotes: 0

Views: 861

Answers (1)

YBS
YBS

Reputation: 21297

Try this

  output$hcontainer <- renderHighchart({
    df1 <- demo %>% mutate(var1=demo[[as.name(input$category)]], var2=demo[[as.name(input$name_or_overall)]])
    df <- df1 %>% group_by(var1,var2) %>% summarise(count = n())
    highchart() %>% 
      hc_add_series(df, type = "bar",
                    hcaes(y = "count",
                          x = "var1",
                          group = "var2")) %>%
      hc_plotOptions(bar = list(stacking = "percent")) %>%
      hc_tooltip(shared = FALSE)
  })

You will get the following output:

output

Upvotes: 0

Related Questions