ggplot2:如何区分点击刷子?

Dea*_*ali 11 r ggplot2 shiny

我希望在我的闪亮应用程序中有一个用户可以点击或选择某些区域的情节,所以我使用的是click和brush参数plotOutput.我的问题是,当启动画笔时,也会调用单击处理程序.我想知道什么时候点击,我想知道什么时候刷子,但如果点击是刷子的一部分,那么我想忽略它.

示例:在以下应用程序中,如果您只是刷(单击某处并拖动鼠标),则会收到"单击"消息以及"刷子"消息.我希望在这种情况下只获得"刷"消息.

library(shiny)
library(ggplot2)
runApp(shinyApp(
  ui = fluidPage(
    plotOutput("plot", click = "click", brush = "brush")
  ),
  server = function(input, output, session) {
    output$plot <- renderPlot({
      ggplot(mtcars, aes(wt, mpg)) + geom_point()
    })
    observeEvent(input$click, {
      cat("clicked\n")
    })
    observeEvent(input$brush, {
      cat("brushed\n")
    })
  }
))
Run Code Online (Sandbox Code Playgroud)

age*_*nis 1

我知道这只是一种解决方法,但我唯一的解决方案是在激活画笔时撤消最后一次单击的操作;我需要这个来绘制用户可以通过单击添加点的图。使用笔刷将首先创建点,并在释放单击按钮后将其删除。只是一个缺点:有时您会在没有注意到的情况下单击并进行微刷,在这种情况下,它不会明显地创建点。我的应用程序:

library(shiny); library(dplyr); library(ggplot2)

ui <- fluidPage(
     fluidRow(

          h1("add by clicking anywhere on the plot"),
          plotOutput("mainplot",
                     click="mainplot_click",
          brush=brushOpts(id="mainplot_brush"))
     ),
     fluidRow(
          actionButton("add", "add"),
          actionButton("reset", "reset")
     )
)

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

     vals = reactiveValues(
          keeprows = rep(TRUE, nrow(mtcars)),
          mydata = mtcars
     )

     observeEvent(input$mainplot_click, handlerExpr = {
          my.x = input$mainplot_click$x
          my.y = input$mainplot_click$y
          vals$mydata <- vals$mydata %>% bind_rows(data.frame("wt"=my.x, "mpg"=my.y))
     })

     output$mainplot = renderPlot({
          temp = vals$mydata
          ggplot() +geom_point(data=temp, col="black", fill="white", size=3) + aes(x=wt, y=mpg)
     })

     observeEvent(input$mainplot_brush, handlerExpr = {
           vals$mydata <- vals$mydata %>% head(-1)
     })

     observeEvent(input$reset, handlerExpr = {
          vals$mydata <- mtcars
          vals$keeprows <- rep(TRUE, nrow(mtcars))
     })
     session$onSessionEnded(stopApp)
}

shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)