简体   繁体   中英

Click Interactive Plot in R Shiny

I'm trying to create a plot with a bunch of boxes and then when a box gets clicked on it gets colored in up. I'm having two issues with this. 1. I can't figure out a way for the figure to update dynamically when I click. 2. I can't figure out how to store the values that come out of the click input variable so that I have stored all previous clicks and would be able to color in multiple boxes. You can see a few ways I've tried to solve and test either of the two issues and I'm not having any luck. Any help with either issue would be appreciated.

ui <- fluidPage(
   
   # Application title
   titlePanel("Boxes"),
   
   sidebarLayout(
      sidebarPanel(
         textOutput("text")),
      
      # Get it it's a pun
      mainPanel(
         plotOutput("boxPlot",click = "test")
      )
   )
)

# Define server logic required to draw a histogram
server <- function(input, output) {
  
  vals <- reactiveValues(x=NA,y=NA,test=NA)
  observeEvent(input$click, {
    vals$x <- c(vals$x,input$test$x)
    vals$y <- c(vals$y,input$test$y)
    vals$test <- input$test$x
  })
  
  output$boxPlot <- renderPlot({
    
    par(mai=c(0,0,0,0))
    plot(1,ylim=c(2,15),xlim=c(2,15),type='n',yaxs='i',xaxs='i',ylab='',xlab='',axes=F)
    for (i in 2:15) {
      abline(v=i)
      abline(h=i)
    }
    observeEvent(input$click, {      rect(floor(input$test$x),floor(input$test$y),ceiling(input$test$x),ceiling(input$test$y),col='blue')})
    # if (length(vals$x) > 0) {
      # rect(floor(vals$x[1]),floor(vals$y[1]),ceiling(vals$x[1]),ceiling(vals$y[1]),col='blue')
    # }
  })
  # output$text <- renderText(vals$x[length(vals$x)])
  output$text <- renderText(vals$test)
  
}
# Run the application 
shinyApp(ui = ui, server = server)

This might be a simple solution.

You should only have one single observeEvent for your click event. In that observeEvent , store your x and y values as reactiveValues as you current are doing.

Then, your renderPlot should plot the grid lines and filled in rectangles based on your reactiveValues . By including input$boxPlot_click (as I called it) in renderPlot the plot will be redrawn each click.

library(shiny)

ui <- fluidPage(
  titlePanel("Boxes"),
  sidebarLayout(
    sidebarPanel(
      textOutput("text")),
    mainPanel(
      plotOutput("boxPlot", click = "boxPlot_click")
    )
  )
)

server <- function(input, output) {
  
  vals <- reactiveValues(x=NA,y=NA)
  
  observeEvent(input$boxPlot_click, {
    vals$x <- c(vals$x,input$boxPlot_click$x)
    vals$y <- c(vals$y,input$boxPlot_click$y)
  })
  
  output$boxPlot <- renderPlot({
    input$boxPlot_click
    par(mai=c(0,0,0,0))
    plot(1,ylim=c(2,15),xlim=c(2,15),type='n',yaxs='i',xaxs='i',ylab='',xlab='',axes=F)
    for (i in 2:15) {
      abline(v=i)
      abline(h=i)
    }
    for (i in seq_along(length(vals$x))) {
      rect(floor(vals$x),floor(vals$y),ceiling(vals$x),ceiling(vals$y),col='blue')
    }
  })
  
  output$text <- renderText(paste0(vals$x, ', ' , vals$y, '\n'))
  
}

shinyApp(ui = ui, server = server)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM