Search code examples
rfunctionggplot2shinyhistogram

My own function to plot a histogram doesn't work in Shiny


I have written a function that it works perfectly in a simple script but not in shiny. This function creates an histogram.

If I try to plot the histogram without Shiny, it works.

val <- c(2.1490626,3.7928443,2.2035281,1.5927854,3.1399245,2.3967338,3.7915825,4.6691277,3.0727319,2.9230937,2.6239759,3.7664386,4.0160378,1.2500835,4.7648343,0.0000000,5.6740227,2.7510256,3.0709322,2.7998003,4.0809085,2.5178086,5.9713330,2.7779843,3.6724801,4.2648527,3.6841084,2.5597235,3.8477471,2.6587736,2.2742209,4.5862788,6.1989269,4.1167091,3.1769325,4.2404515,5.3627032,4.1576810,4.3387921,1.4024381,0.0000000,4.3999099,3.4381837,4.8269218,2.6308474,5.3481382,4.9549753,4.5389650,1.3002293,2.8648220,2.4015338,2.0962332,2.6774765,3.0581759,2.5786137,5.0539080,3.8545796,4.3429043,4.2233248,2.0434363,4.5980727)
df1 <- data.frame(val)
df1$type <- "Type 1"
val <- c(3.7691229,3.6478055,0.5435826,1.9665861,3.0802654,1.2248374,1.7311236,2.2492826,2.2365337,1.5726119,2.0147144,2.3550348,1.9527204,3.3689502,1.7847986,3.5901329,1.6833872,3.4240479,1.8372175,0.0000000,2.5701453,3.6551315,4.0327091,3.8781182)
df2 <- data.frame(val)
df2$type <- "Type 2"
df3 <- rbind(df1, df2)
bins = 10
min = NULL
max = NULL

histogram_function <- function(data, bins, min, max){
  hist <- ggplot(data, aes(val, fill=type)) +
    geom_histogram(position = "identity", colour = "grey40", bins = bins) +
    ggtitle("Here must be a title") +
    xlab("Values") +
    ylab("Frequency") +
    facet_grid(type ~ .)  
  return(hist)
}

histogram_function(data=df3, bins=bins, min=min, max=max)

image1

However, If I try to do the same thing in Shiny, I cannot get any histogram.

Note that I have saved the data into a reactive function since in my original shiny app I load a file which it has more information (but with the same format that here)

My code in Shiny.

library(shiny)
library(ggplot2)

histogram_function <- function(data, bins, min, max){
  hist <- ggplot(data, aes(val, fill=type)) +
    geom_histogram(position = "identity", colour = "grey40", bins = bins) +
    ggtitle("Here must be a title") +
    xlab("Values") +
    ylab("Frequency") +
    facet_grid(type ~ .)  
  return(hist)
}

ui <- fluidPage(
  
  # Application title
  titlePanel("My shiny app"),
  
  sidebarLayout(
  
    mainPanel(
      plotOutput("histogram")
    )
  )
)

server <- function(input, output) {
  
  dataframe <- reactive({
    val <- c(2.1490626,3.7928443,2.2035281,1.5927854,3.1399245,2.3967338,3.7915825,4.6691277,3.0727319,2.9230937,2.6239759,3.7664386,4.0160378,1.2500835,4.7648343,0.0000000,5.6740227,2.7510256,3.0709322,2.7998003,4.0809085,2.5178086,5.9713330,2.7779843,3.6724801,4.2648527,3.6841084,2.5597235,3.8477471,2.6587736,2.2742209,4.5862788,6.1989269,4.1167091,3.1769325,4.2404515,5.3627032,4.1576810,4.3387921,1.4024381,0.0000000,4.3999099,3.4381837,4.8269218,2.6308474,5.3481382,4.9549753,4.5389650,1.3002293,2.8648220,2.4015338,2.0962332,2.6774765,3.0581759,2.5786137,5.0539080,3.8545796,4.3429043,4.2233248,2.0434363,4.5980727)
    df1 <- data.frame(val)
    df1$type <- "Type 1"
    val <- c(3.7691229,3.6478055,0.5435826,1.9665861,3.0802654,1.2248374,1.7311236,2.2492826,2.2365337,1.5726119,2.0147144,2.3550348,1.9527204,3.3689502,1.7847986,3.5901329,1.6833872,3.4240479,1.8372175,0.0000000,2.5701453,3.6551315,4.0327091,3.8781182)
    df2 <- data.frame(val)
    df2$type <- "Type 2"
    df3 <- rbind(df1, df2)
    return(df3)
  })
  
  draw_histogram <- reactive({
    hist <- histogram_function(data = dataframe(), bins = 10, min = NULL, max = NULL)
    return(hist)
  })
  
  output$histogram <- renderPlot({
    h <- draw_histogram()
    return(h)
  })
}

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

Am I doing something wrong in Shiny? I don't know what is going on.

Thanks in advance,

Regards


Solution

  • You use a sidebarLayout where you need to define the sidebarPanel and the mainPanel. In your example you don't define the sidebarPanel which leads to the error. You can either use an empty sidebarPanel or simply only use the fluidPage

    Change the ui, then it works:

    ui <- fluidPage(
      
      # Application title
      titlePanel("My shiny app"),
      
      sidebarLayout(
        sidebarPanel(),
        mainPanel(
          plotOutput("histogram")
        )
      )
    )