2016-06-19 16 views
5

चमकदार प्रचार में प्रतिक्रियाशील अभिव्यक्तियां जहां उन्हें जाना है, में परिवर्तनशील अभिव्यक्तियां बदलती हैं। हम isolate के साथ इस व्यवहार में से कुछ को दबा सकते हैं, लेकिन क्या हम अपने स्वयं के तार्किक अभिव्यक्ति के आधार पर प्रसारित होने वाले परिवर्तनों को दबा सकते हैं?सशर्त प्रतिक्रियाशीलता चमकदार

मैं जो उदाहरण देता हूं वह एक साधारण स्कैटरप्लॉट है, और हम abline के साथ क्रॉसहेयर खींचते हैं जहां उपयोगकर्ता क्लिक करता है। दुर्भाग्यवश, चमकदार परिणाम को एक नई साजिश मानता है, और हमारा क्लिक मान NULL पर रीसेट कर दिया जाता है ... जिसे बदले में सामान्य रूप से प्रचारित करने के लिए मूल्य के अपडेट के रूप में माना जाता है। साजिश को फिर से खींचा गया है, और NULLabline दोनों तर्कों को पारित किया गया है।

मेरा हैक (नीचे टिप्पणी की गई है) renderPlot कॉल में एक शर्त डालना है जो प्लॉटिंग निर्देशांक के लिए कुछ गैर-प्रतिक्रियाशील चर अपडेट करता है, केवल तभी जब क्लिक मान गैर- NULL होते हैं। यह छोटे भूखंडों के लिए ठीक काम करता है, लेकिन वास्तव में यह प्लॉट दो बार खींचा जा रहा है।

यह करने के लिए एक बेहतर तरीका क्या है? क्या सही तरीका है?

सर्वर फ़ाइल:

library(shiny) 

shinyServer(function (input, output) 
{ 
    xclick <- yclick <- NULL 
    output$plot <- renderPlot({ 
    #if (!is.null(input$click$x)){ 
     xclick <<- input$click$x 
     yclick <<- input$click$y 
    #} 
    plot(1, 1) 
    abline(v = xclick, h = yclick) 
    }) 
}) 

यूआई फ़ाइल:

library(shiny) 

shinyUI(
    basicPage(
    plotOutput("plot", click = "click", height = "400px", width = "400px") 
) 
) 
+0

अपने 'if' बयान के बाद से' renderPlot' कुछ हद तक स्थिर है, आप क्या आप चाहते हैं करने के लिए इस उदाहरण यह है जब यह –

+0

काम नहीं करता है का एक उदाहरण प्रदान करने के लिए अच्छा हो सकता है के साथ आप क्या चाहते करने के लिए लगता है –

+0

जैसे [0] [http://shiny.rstudio.com/reference/shiny/latest/actionButton.html) की तरह इन परिवर्तनों को आमंत्रित करने के लिए केवल 'आरएचएचटीएस' या 'हाईचार्टर' जैसी अधिक उन्नत लाइब्रेरी का उपयोग करना चाहिए? – alistaire

उत्तर

2

विंस्टन इस समस्या "राज्य" संचय कॉल - आप न केवल मौजूदा डेटा प्रदर्शित करना चाहते हैं, लेकिन पिछले भूखंड द्वारा उत्पन्न कुछ (इसके बारे में जानने के लिए सबसे अच्छी जगह https://www.rstudio.com/resources/videos/coordinated-multiple-views-linked-brushing/ पर है)

मूलभूत विचार अपने स्वयं के प्रतिक्रियाशील मूल्यों का सेट बनाना है, और उन्हें अद्यतन करते समय ई साजिश पर उपयोगकर्ता क्लिक करता है। उन्हें अगले क्लिक तक अमान्य नहीं किया जाएगा, इसलिए आपको परिपत्र व्यवहार नहीं मिलता है।

library(shiny) 

shinyApp(
    shinyUI(basicPage(plotOutput("plot", click = "click"))), 
    function(input, output) { 
    click <- reactiveValues(x = NULL, y = NULL) 
    observeEvent(input$click, { 
     click$x <- input$click$x 
     click$y <- input$click$y 
    }) 

    output$plot <- renderPlot({ 
     plot(1, 1) 
     abline(v = click$x, h = click$y) 
    }) 
    } 
) 
+0

धन्यवाद! क्या मैं इसे इस से ले सकता हूं कि हम वर्तमान में अपनी तार्किक अभिव्यक्ति के साथ अमान्यताओं को नियंत्रित नहीं कर सकते? मुझे लगता है कि यह समाधान 'ignoreNULL = TRUE' रखने वाले निरीक्षण पर निर्भर करता है, और सामान्य स्थिति में, अगर इनपुट इनपुट $ x' 2 या कुछ था तो हम अद्यतन को दबा नहीं सकते। यदि ऐसा है, तो मैं परिपत्र व्यवहार को रोकने के लिए और अधिक संदर्भ देने के लिए प्रश्न को संपादित कर सकता हूं। –

+0

आप कर सकते हैं, लेकिन यह trickier होगा। मुझे लगता है कि एक नया सवाल पूछना बेहतर हो सकता है – hadley

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