2015-05-29 8 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

'प्लॉटऑटपुट 'के मुताबिक कोई" माउस बटन अप "संदेश नहीं लगता है, जिसे आपको क्लिक करने और ब्रश करने के बीच उचित रूप से अंतर करने की आवश्यकता होगी। एक वर्कअराउंड एक टाइमआउट (कहें, 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) 
संबंधित मुद्दे