简体   繁体   中英

Observe double click conditional on side panel input in R Shiny

I'm working on a Shiny app for a project where a ggplot is the main interface for the user. Depending on input from the sidebar, I'd like the app to record coordinates for two events: a single click (which I have working), or a double click (which is where I'm stuck). Essentially, I'd like to be able to create a way to record a starting and ending point based on sidebar conditions. Here's a brief example:

library(shiny)
library(ggplot2)

ui = pageWithSidebar(
  headerPanel("Example"),
  sidebarPanel(
    radioButtons("color", "Pick Color", c("Pink", "Green", "Blue")),
    selectInput("shape", "Select Shape:", c("Circle", "Triangle"))
  ),
  mainPanel(
    fluidRow(column(width = 6,
                    h4("Click plot to add points"),
                    plotOutput("plot1", click = "plot_click"),
                    actionButton("rem_point", "Remove Last Point")),
             column(width = 6,
                    h4("Table of points on plot"),
                    tableOutput("table")))
  )
)

server = function(input, output){

  values = reactiveValues()
  values$DT = data.frame(x = numeric(),
                         y = numeric(),
                         color = factor(),
                         shape = factor())

  output$plot1 = renderPlot({
    ggplot(values$DT, aes(x = x, y = y)) +
      geom_point(aes(color = color,
                     shape = shape), size = 5) +
      lims(x = c(0, 100), y = c(0, 100)) +
      theme(legend.position = "bottom") +
      scale_color_discrete(drop = FALSE) +
      scale_shape_discrete(drop = FALSE)
  })

  observeEvent(input$plot_click, {
    add_row = data.frame(x = input$plot_click$x,
                         y = input$plot_click$y,
                         color = factor(input$color, levels = c("Pink", "Green", "Blue")),
                         shape = factor(input$shape, levels = c("Circle", "Triangle")))
    values$DT = rbind(values$DT, add_row)
  })

  observeEvent(input$rem_point, {
    rem_row = values$DT[-nrow(values$DT), ]
    values$DT = rem_row
  })

  output$table = renderTable({
    values$DT[, c('color', 'shape')]
  })
}

shinyApp(ui, server)

In this example, when the user selects Green or Blue, I'd like to only record the single click as the starting point and record NA for the end point. When they select Pink, I'd like to record the single click as the starting point and the double click as the ending point. Any help would be greatly appreciated!

(Example created by @blondeclover on a question from earlier .)

Found a solution! Just create an observeEvent() to observe a double click and update values$DT with the new information.

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