user9568744
user9568744

Reputation: 91

Clicking through plots in Shiny app

In my Shiny app, I use a for loop to make different plots and I would like the user to be able to click through each one. How would I achieve this as it currently just goes to the final plot?

library(shiny)

server <- function(input, output, session) {

  # data
  v <- c(9,8,7,8,9,5,6,7,4,3)
  w <- c(3,4,2,3,3,3,2,3,4,5)
  x <- c(1,3,4,6,2,4,6,8,6,3)
  y <- c(4,5,2,4,2,1,2,5,7,8)
  z <- c(5,9,8,6,4,6,8,9,6,7)
  df <- data.frame(v, w, x, y, z)

  # initial plot that will allow user to change parameters (haven't implemented yet)
  output$plot <- renderPlot(plot(df[[1]],df[[2]]))

  # wait until the button is triggered
  observeEvent(input$run, {
    for (i in 5){
      output$plot <- renderPlot(plot(df[[1]],df[[i]], main = i))
    }
    })
  }

ui <- fluidPage(
  actionButton("run", "Generate"),
  plotOutput("plot")
)

shinyApp(ui = ui, server = server)

Upvotes: 0

Views: 685

Answers (2)

Saurabh Chauhan
Saurabh Chauhan

Reputation: 3221

You just need to use the variable that will maintain the count for each click:

    library(shiny)
    server <- function(input, output, session) {          
      # data
      v <- c(9,8,7,8,9,5,6,7,4,3)
      w <- c(3,4,2,3,3,3,2,3,4,5)
      x <- c(1,3,4,6,2,4,6,8,6,3)
      y <- c(4,5,2,4,2,1,2,5,7,8)
      z <- c(5,9,8,6,4,6,8,9,6,7)
      df <- data.frame(v, w, x, y, z)

      # initial plot that will allow user to change parameters (haven't implemented yet)
      output$plot <- renderPlot(plot(df[[1]],df[[2]]))        

     count<-0   # This is the counter which keeps track on button count

      observeEvent(input$run, {
        count <<- count + 1 # Increment the counter by 1 when button is click
        if(count<6){
          # Draw the plot if count is less than 6
          output$plot <- renderPlot(plot(df[[1]],df[[count]],main = count))
        }
        else{
        # Reset the counter if it is more than 5
         count <- 0
        }             
      })
    }

    ui <- fluidPage(
      actionButton("run", "Generate"),
      plotOutput("plot")
    )

    shinyApp(ui = ui, server = server)

Upvotes: 1

Sri Pallavi
Sri Pallavi

Reputation: 196

Instead of using for loop you can try by directly using the action button click count i.e. input$run.The following code will generate the plots one by one till the click count is less than or equal to 5 and then returns to initial plot as soon the as click count exceeds 5. You can modify the else statement as per your wish.

observeEvent(input$run, {
if(input$run <= 5){
  output$plot <- renderPlot(plot(df[[1]],df[[input$run]], main = input$run))
}else output$plot <- renderPlot(plot(df[[1]],df[[2]]))
})

Hope this might be helpful

Upvotes: 1

Related Questions