dynamically add plots to web page using shiny
Solution 1:
Perhaps this example due to Winston Chang is helpful:
Shiny example app with dynamic number of plots
Here is the full example just in case of linkrot:
server.R
max_plots <- 5
shinyServer(function(input, output) {
# Insert the right number of plot output objects into the web page
output$plots <- renderUI({
plot_output_list <- lapply(1:input$n, function(i) {
plotname <- paste("plot", i, sep="")
plotOutput(plotname, height = 280, width = 250)
})
# Convert the list to a tagList - this is necessary for the list of items
# to display properly.
do.call(tagList, plot_output_list)
})
# Call renderPlot for each one. Plots are only actually generated when they
# are visible on the web page.
for (i in 1:max_plots) {
# Need local so that each item gets its own number. Without it, the value
# of i in the renderPlot() will be the same across all instances, because
# of when the expression is evaluated.
local({
my_i <- i
plotname <- paste("plot", my_i, sep="")
output[[plotname]] <- renderPlot({
plot(1:my_i, 1:my_i, xlim = c(1, max_plots), ylim = c(1, max_plots), main = paste("1:", my_i, ". n is ", input$n, sep = ""))
})
})
}
})
ui.R
shinyUI(pageWithSidebar(
headerPanel("Dynamic number of plots"),
sidebarPanel(
sliderInput("n", "Number of plots", value=1, min=1, max=5)
),
mainPanel(
uiOutput("plots") # This is the dynamic UI for the plots
)
))
Solution 2:
To answer the question in the comment above, about how to dynamically return a list of objects (for instance, a plot, a table and a text), you can generate a list of appropriate outputs contained in a div tag in the renderUI you then match with the appropriate render functions in the for loop. For instance:
max_plots <- 5
shinyServer(function(input, output) {
# Insert the right number of plot output objects into the web page
output$plots <- renderUI({
plot_output_list <- lapply(1:input$n, function(i) {
plotname <- paste("plot", i, sep="")
plottitle <- paste("plottitle", i, sep="")
tablename <- paste("tablename", i, sep="")
tags$div(class = "group-output",
textOutput(plottitle, container = h3),
plotOutput(plotname, height = 280, width = 250),
tableOutput(tablename)
)
})
# Convert the list to a tagList - this is necessary for the list of items
# to display properly.
do.call(tagList, plot_output_list)
})
# Call renderPlot for each one. Plots are only actually generated when they
# are visible on the web page.
for (i in 1:max_plots) {
# Need local so that each item gets its own number. Without it, the value
# of i in the renderPlot() will be the same across all instances, because
# of when the expression is evaluated.
local({
my_i <- i
plotname <- paste("plot", my_i, sep="")
plottitle <- paste("plottitle", my_i, sep="")
tablename <- paste("tablename", my_i, sep="")
output[[plotname]] <- renderPlot({
plot(1:my_i, 1:my_i, xlim = c(1, max_plots), ylim = c(1, max_plots), main = paste("1:", my_i, ". n is ", input$n, sep = ""))
})
output[[plottitle]] <- renderText({paste("1:", my_i, ". n is ", input$n, sep = "")
})
output[[tablename]] <- renderTable({table(x = 1:my_i, y = 1:my_i)
})
})
}
})
I hope that helps!
Solution 3:
Dynamically add N plots as you want using shiny:
runApp(
list(
ui = fluidPage(
headerPanel('Tittle'),
sidebarPanel(
fileInput('file1', 'Choose File:'),
textInput("target", label="Target", value="Choose target"),
actionButton("addButton", "Go!"),
p('The button start the code server'),
p("This is UI")
),
mainPanel(
uiOutput("plots")
)),
#SERVER
server = function(input, output) {
dataset <- eventReactive(input$addButton, {
#Obtain the file and textinput
inFile <- input$file1
df <- read.csv(inFile$datapath)
df$target <- input$target
return(df)
})
output$plots <- renderUI({
df <- dataset()
n <- df$target[1]
plot_output_list <- lapply(1:n, function(i) {
plotname <- paste("plot", i, sep="")
plotOutput(plotname, height = 580, width = 550)
})
do.call(tagList, plot_output_list)
})
observe({
for (i in 1:length()) {
local({
plotname <- paste("plot", i, sep="")
output[[plotname]] <- renderPlot({
#function_plot is the function generate plot
function_plot()
})
})#endlocal
}
})
}
)
)
https://github.com/ericbellet/recomendacion-modelos/blob/master/shiny/generate_rocSHINY.R