2015-05-29 34 views
8

我想在我的閃亮應用中有一個情節,用戶可以點擊或選擇某些區域,所以我使用的點擊和筆刷參數爲plotOutput。我的問題是,當啓動畫筆時,也會調用點擊處理程序。我想知道點擊是什麼時候發生的,並且我想知道何時製作畫筆,但如果點擊是畫筆的一部分,那麼我想忽略它。ggplot2:如何區分點擊刷?

例如:在下面的應用程序中,如果您只是刷(單擊某處並拖動鼠標),您將看到「單擊」消息以及「刷」消息。在這種情況下,我只想得到「刷」消息。

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") 
    }) 
    } 
)) 
+1

根據'plotOutput',似乎沒有「鼠標按鈕向上」的消息,您需要在點擊和刷牙之間正確區分。一種解決方法是定義超時(例如200毫秒),僅在超時後處理點擊事件,並相應地在該超時後忽略所有的刷事件。是否有一個原因,而不是簡單地聽取雙擊事件? – krlmlr

+0

我不想僅僅因爲用戶體驗而使用dblclick,它更簡單,點擊更有意義。 也許我只是需要睡覺(上午4:30),但我不知道你的建議如何解決我的問題,但我想了一下,似乎沒有照顧我的問題 –

+0

如果在最後一次單擊事件之後,畫筆事件發生少於200毫秒,則您處理它。如果不是,你會忽略它。你只能在事件發生後200毫秒處理點擊,你必須爲此設置某種計時器。 – krlmlr

回答

0

我知道這只是一種變通方法,但我對這個唯一的解決辦法是撤消當刷被激活的最後一次點擊的動作;我需要這個用戶可以點擊添加點的情節。 使用刷牙將首先創建點並在釋放點擊按鈕後將其移除。 只是一個缺點:有時你點擊並沒有注意到做一個微型畫筆,在這種情況下,它不會明顯創建點。我的應用:

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)