[R] Building a reactive plot with ggplot2 and shiny.

Santiago Paz santiago.l.paz at gmail.com
Mon Mar 14 15:35:50 CET 2016


I'm fairly new with R and shiny and I am trying to make an application
where users can select various variables from a data set and plot the
ratios of the variables in one graph.

Basically: - The user selects the number of ratios they want - The
user then selects which variable will be the numerator and which will
be the denominator. - The a plot should then appear with curves for
each ratio.

My main problem right now is that the plot isn't displayed until all
the numerators and denominators have been selected. I want it to look
such that when you finish specifying one ratio it plots it, then when
you specify another ratio it adds it to the graph. Basically I want
the plot to be reactive so that it updates as you select the ratios.
Here's a basic idea of the code

SERVER


    output$sopPlot <- renderPlot({

    data <- read.csv("data")

    # Introduce function that binds columns, useful when generating
the data frame that includes all ratios
      cbind.all <- function (...)
      {
        nm <- list(...)
        nm <- lapply(nm, as.matrix)
        n <- max(sapply(nm, nrow))
        do.call(cbind, lapply(nm, function(x) rbind(x, matrix(, n -

nrow(x), ncol(x)))))
      }

    # Some variables that are useful in the loop that creates the data
frame of the ratios

      ratio <- as.character(input$nRatios)
      rationum <- as.integer(substr(ratio,2,2))
      Ninput <- c(input$Num1, input$Num2)
      Dinput <- c(input$Den1, input$Den2)

      subData <- data.frame()

    # Loop that will analyze each ratio and create a data frame for
the number of ratios selected

      for (i in 1:rationum){

      numData <- subset(data, Ninput[i])
      numData <- aggregate(Q~Y, data = numData, FUN=sum)

      denData <- subset(data, Dinput[i])
      denData <- aggregate(Q~Y, data = denData, FUN=sum)

      # Combining numerator and denominator data
      subD <-  merge(numData, denData, by.x="Y", by.y="Y")

      # Dividing variables to generate ratio data
      rat<- as.vector(subD$Q.x/subD$Q.y)

      # Insert this data for the ratio into empty dataframe using cbind.all
      subData <- cbind.all(subData, rat)

      # naming each column
      num <- as.character(i)
      colnames(subData)[i] <- paste("Ratio",num, sep=" ")

      subData<- as.data.frame(subData)
    }

    #Reshape data
    subData.long <- melt(subData, id.vars = "Y")

    # Plot

      g <- ggplot(subData.long,aes(Y,value,color=variable))+geom_line()+geom_point()
      g + scale_y_continuous("Ratio") + scale_x_continuous("Year")

    })





UI



      sidebarPanel(
    conditionalPanelselectInput("nRatios", "How Many Ratios:",
                                       choices = c('0'='n0','1'='n1','2'='n2'))

    br()
    ),

    conditionalPanel(condition = "input.analysisType == 'ratio' &
(input.nRatios == 'n1' | input.nRatios == 'n2' | input.nRatios == 'n3'
| input.nRatios == 'n4' | input.nRatios == 'n5')",
                           p(strong("Ratio 1")),
                           selectizeInput("Num1",
                                          "Numerator 1:",
                                          choices = categories,
                                          multiple = TRUE),
                           selectizeInput("Den1",
                                          "Denominator 1:",
                                          choices = categories,
                                          multiple = TRUE),
                           br()

          ),

    # 2
          conditionalPanel(condition = "input.analysisType == 'ratio'
& (input.nRatios == 'n2' | input.nRatios == 'n3' | input.nRatios ==
'n4' | input.nRatios == 'n5')",
                           p(strong("Ratio 2")),
                           selectizeInput("Num2",
                                          "Numerator 2:",
                                          choices = categories,
                                          multiple = TRUE),
                           selectizeInput("Den2",
                                          "Denominator 2:",
                                          choices = categories,
                                          multiple = TRUE),
                           br()

          ),

    mainPanel(
        plotOutput("sopPlot"),
        textOutput("debug")
      )
    ))



I apologize if this is too much text.

I think the biggest problem is that the ratios are subsetted and
stored in subData in the for loop. And the plot is made once subData
is acquired.

Anyway, any help is appreciated. Thanks in advance.



More information about the R-help mailing list