[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