Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Shiny : variable height of renderplot

Tags:

r

shiny

I would like to take the height of my plot reactive because sometimes I have to draw just one graph and sometimes two or three graphs. Here my code :

    output$myplot<-renderPlot({

    plot_to_draw <- data[data$code==input$code,"River_name"]

    plot(plot_to_draw)   

    number_of_plot <- length(plot_to_draw)

    },height = 500*number_of_plot)

But shiny reads the height of the plot just one time so that it's not reactive. Thank you for your answers !

like image 522
Estelle Duval Avatar asked Jan 14 '16 15:01

Estelle Duval


People also ask

What does the renderPlot function do in shiny?

renderPlot is an reactive function that can take input data from the ui. R script and feed it into the server. R script. It then actively updates the information within its function.

Does renderPlot work with Ggplot?

With ggplot2 graphics, the code in renderPlot should return a ggplot object; if instead the code prints the ggplot2 object with something like print(p) , then the coordinates for interactive graphics will not be properly scaled to the data space. See plotOutput() for more information about interactive plots.


2 Answers

I finally figuerd out a solution ;

server.R
output$myplot<-renderPlot({ 
plot_to_draw <- data[data$code==input$code,"River_name"] 
plot(plot_to_draw) 
number_of_plot <- length(plot_to_draw) 
},height = function(){500*number_of_plot})

ui.R
plotOutput(outputId="myplot",height = "auto")
like image 100
Estelle Duval Avatar answered Sep 21 '22 10:09

Estelle Duval


This is the solution that I finally got, after drudging with my app and thanks to all persons in this thread for your kind suggestions. Please don't mind the name of the variables.

In the server part:

  #I had to transform my imput into a data.frame, otherwise sqldf didn't work.
  country12<- reactive({as.data.frame(matrix(c(input$sel_country121),1,1))})
  question12<-reactive({
    country121 <- country12()
    sqldf("SELECT dp.Year, dp.Type_of_Product COUNT (*) as num_products12 FROM dataPanelV5 dp, country121 p WHERE dp.Country_name = p.V1 GROUP BY dp.Year, dp.Type_of_Product")})

#I use this function to calculate the number of different types of products resulting from the query, using unique() and calculating its length, as that number is the number of facets.
  n_facets12<-function(){
                      question121<- question12()
                      return (500*length(unique(question121$Type_of_Product)))}

  output$barplot12 <- renderPlot({ 

    question121<-question12()

    ggplot(question121,aes(x=factor(Year),y=num_products12,fill=Type_of_Product)) + geom_bar(stat="identity") + facet_grid(Type_of_Product ~ .,scales = "free_y") +
      geom_text(aes(label=num_products12), vjust=-0.2, colour="black")  + scale_x_discrete(breaks=question121$Year,labels=as.character(question121$Year),position = "top") + theme(legend.position="top",axis.title.y=element_blank(),axis.text.y = element_blank(),panel.grid.major.y = element_blank(),panel.grid.minor.y = element_blank()) + labs(fill="Type_of_Product", x="Year")


  },height = n_facets12)

#And it works!!
like image 33
ivan lorenzo Avatar answered Sep 19 '22 10:09

ivan lorenzo