2017-03-24 12 views
5

मैं एक चमकदार ऐप डिज़ाइन कर रहा हूं जिसमें plotly स्कैटर प्लॉट शामिल है। मैं चाहता हूं कि उपयोगकर्ता event_data फ़ंक्शन का उपयोग करके किसी ईवेंट को रिकॉर्ड करने के लिए ग्राफ़ पर क्लिक करने में सक्षम हो, लेकिन फिर actionButton के क्लिक पर उस ईवेंट को साफ़ करने में सक्षम हो। कुछ उदाहरण कोड नीचे देखा जा सकता है:साजिश पर क्लिक करें ईवेंट डेटा

library(shiny) 
library(plotly) 

ui <- fluidPage(
    actionButton("clearEvent", label = "clear event"), 
    verbatimTextOutput("plotVal"), 
    plotlyOutput('plot1') 
) 

server <- function(input, output, session) { 
    output$plot1 <- renderPlotly({ 
    d <- diamonds[sample(nrow(diamonds), 1000), ] 
    plot_ly(d, x = ~carat, y = ~price, color = ~carat, 
      size = ~carat, text = ~paste("Clarity: ", clarity)) 
    }) 

    output$plotVal <- renderPrint({ 
    e <- event_data("plotly_click") 
    if (is.null(e)) { 
     NULL 
    } else { 
     e 
    } 
    }) 

    observeEvent(input[["clearEvent"]], { 
    e <- NULL 
    }) 
} 

shinyApp(ui = ui, server = server) 

यह घटना की तरह स्पष्ट नहीं है, हालांकि मैं उम्मीद करता हूं। event_data के लिए कोड में देखकर यह दिखाता है कि यह शायद इसलिए है क्योंकि यह session ऑब्जेक्ट के भीतर ही संग्रहीत है। कोई विचार है कि मैं इसे कैसे ओवरराइट कर सकता हूं?

एकमात्र समान चीज़ जो मैंने पार की है वह Clear plotly click event है लेकिन यह बहुत हैकी है और मेरे लिए काम नहीं कर रहा है।

उत्तर

2

अपने उदाहरण में, e सिर्फ renderPrint में और observeEvent में परिभाषित किया गया है और नहीं विश्व स्तर पर तो भी e अगर observeEvent में बदल गया है, यह renderPrint में कुछ भी ट्रिगर नहीं करता।

आप इस के लिए reactiveValues उपयोग कर सकते हैं: जब भी उपयोगकर्ता प्लॉट या बटन पर क्लिक करें

data <- reactiveValues(e=NULL) 

    observe({ 
    data$e <- event_data("plotly_click") 
    }) 

    output$plotVal <- renderPrint({ 
    e <- data$e 
    if (is.null(e)) { 
     NULL 
    } else { 
     e 
    } 
    }) 

    observeEvent(input[["clearEvent"]], { 
    data$e <- NULL 
    }) 

data$e बदल गया है, और के बाद से वहाँ renderPrint में data$e पर निर्भरता, जब भी data$e बदल गया है अद्यतन हो जाता है वह यह है कि ।

0

पिछला उत्तर आंशिक रूप से समस्या हल करता है, हालांकि, उपयोगकर्ता फिर से उसी प्लॉटली मार्कर पर क्लिक नहीं कर सकता है, कम से कम कोई अपडेट ट्रिगर नहीं किया गया है। यही कारण है कि समस्या को मैन्युअल shinyjs साथ event_data("plotly_click") के स्रोत रीसेट करके घेरने की कोशिश की जा सकती है:

library(shiny) 
library(plotly) 
library(shinyjs) 

ui <- shinyUI(
    fluidPage(
    useShinyjs(), 
    # code to reset plotlys event_data("plotly_click", source="A") to NULL -> executed upon action button click 
    # note that "A" needs to be replaced with plotly source string if used 
    extendShinyjs(text = "shinyjs.resetClick = function() { Shiny.onInputChange('.clientValue-plotly_click-A', 'null'); }"), 
    actionButton("reset", "Reset plotly click value"), 
    plotlyOutput("plot"), 
    verbatimTextOutput("clickevent") 
) 
) 


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

    output$plot <- renderPlotly({ 
    plot_ly(mtcars, x=~cyl, y=~mpg) 
    }) 

    output$clickevent <- renderPrint({ 
    event_data("plotly_click") 
    }) 

    observeEvent(input$reset, { 
    js$resetClick() 
    }) 
}) 

shinyApp(ui, server) 
संबंधित मुद्दे