2017-09-29 35 views
7

पर क्लिक करें मैं plot_ly स्कैटर प्लॉट के साथ एक चमकदार ऐप बना रहा हूं। मैं प्लॉट और datatable (डीटी से) के बीच जानकारी साझा करने के लिए SharedData ऑब्जेक्ट (क्रॉसस्टॉक पैकेज से) का उपयोग कर रहा हूं।आर प्लॉटली की घटनाओं की प्रतिक्रिया को अक्षम करें

समस्या तब होती है जब आप साजिश में किसी बिंदु पर क्लिक करते हैं, यह अन्य सभी बिंदुओं का रंग मंद करता है और चयनित बिंदु के लिए किंवदंती में प्रवेश जोड़ता है, और एक बार ऐसा होता है तो ऐसा कोई प्रतीत नहीं होता है इसे पूर्ववत करने के लिए। मैं इन दृश्य परिवर्तनों को अक्षम करना चाहता हूं लेकिन अभी भी साजिश क्लिक का पता लगाने में सक्षम हूं।

यह समस्या नहीं होती है, तो मैं सिर्फ एक प्रतिक्रियाशील data.frame बजाय एक SharedData वस्तु की plot_ly कॉल का डेटा पैरामीटर में उपयोग करते हैं, लेकिन फिर event_data साजिश से datatable में एक पंक्ति का चयन करने के लिए पर्याप्त जानकारी नहीं है । (। x और y बिंदु निर्देशांक बिंदु सांख्यिक तैर रहे हैं, तो डेटा के खिलाफ निर्देशांक द्वारा मिलान अवांछित परिणाम प्राप्त हो सकते हैं)

यहाँ एक डेमो mtcars उपयोग कर रहा है:

library(shiny) 
library(DT) 
library(plotly) 
library(data.table) 
library(crosstalk) 

### UI function --------- 
ui <- fluidPage(
    fluidRow(
    plotlyOutput('my_graph', height = '400px') 
), 
    fluidRow(
    dataTableOutput('my_table') 
) 
) 

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

### SharedData object ---- 
    filtered_data <- reactive({ 
    data.table(mtcars, keep.rownames = TRUE) 
    }) 

    shared_data <- reactive({ 
    req(filtered_data()) 
    SharedData$new(filtered_data(), ~rn) 
    }) 

### my_graph ---- 
    output$my_graph <- renderPlotly({ 
    p <- plot_ly(shared_data(), 
       x = ~disp, 
       y = ~mpg, 
       color = ~factor(carb), 
       source = 'm') 
    p 
    }) 

### my_table --------- 
    output$my_table <- renderDataTable({ 
    datatable(shared_data()$data(), 
       selection = 'single') 
    }) 

    observe({ 
    click_detect = plotly::event_data('plotly_hover', source = 'm') 
    str(click_detect) 

    dataTableProxy('my_table') %>% 
     selectRows(match(click_detect$key, shared_data()$data()$rn)) 
    }) 
} 

shinyApp(ui, server) 

उत्तर

2

क्यों ऐसा होता है मुझे धड़कता है लेकिन मैं दो संभावित कामकाज देख सकता हूं।


फोर्स Plotly को 1.

if (click_detect$curveNumber != 0) { 
     output$my_graph <- renderPlotly({ 
      p <- plot_ly(shared_data(), 
         x = ~disp, 
         y = ~mpg, 
         color = ~factor(carb), 
         source = 'm', 
         marker = list(opacity = 1)) 
      p 
     })  
     } 

ड्राबैक सभी मार्करों की पारदर्शिता सेट करने: ग्राफ flickers।


अपना filterRows कथन बदलें। मुझे आपका डेटा नहीं पता है, लेकिन mtcars के लिए आप carb (curveNumber के माध्यम से) और फिर pointNumber के माध्यम से फ़िल्टर कर सकते हैं।

dataTableProxy('my_table') %>% selectRows(
     which(mtcars$carb == sort(unique(mtcars$carb))[[click_detect$curveNumber + 1]])[[click_detect$pointNumber + 1]]) 
+0

पहला समाधान वास्तव में इतनी अच्छी तरह से काम नहीं करता है, लेकिन दूसरे का उपयोग कर कम से कम एक समाधान के रूप करीब आता है, एक 'एक' SharedData' वस्तु के स्थान पर data.frame'। यह मेरा पहला उपहार है इसलिए मैं यहां प्रोटोकॉल का थोड़ा अनिश्चित हूं। मुझे एसओ मेटा की जांच करने की आवश्यकता हो सकती है, लेकिन अभी के लिए मैं बक्षीस का पुरस्कार दूंगा लेकिन फिर भी उस उत्तर के लिए बाहर रहूंगा जो सीधे 'साझाडेटा' ऑब्जेक्ट के उपयोग की इजाजत देता है और केवल कामकाज की बजाय साजिश क्लिक की दृश्य प्रतिक्रिया को अक्षम करता है । धन्यवाद! –

+0

धन्यवाद! मैं कोड पर कुछ और काम करने की कोशिश करूंगा और बाद में इसे अपडेट करूँगा अगर मुझे बेहतर जवाब मिल जाए। –

संबंधित मुद्दे