2016-09-25 29 views
5

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

queriedData <- reactive({ 
       query <- paste0(...,input$a,...); 
       return(db$find(query)) 
       }) 

उत्पादन स्लॉट में मैं डेटा का संदर्भ लें:

सर्वर भाग में मैं एक प्रतिक्रियाशील समारोह है कि आदानों की कुछ का उपयोग कर एक प्रश्न बनाता है और फिर एक डेटाबेस से डेटा में खींचती है, उदाहरण के लिए है

x <- queriedData() 

का उपयोग करने में मेरे सवाल कर रहे हैं:

  • मेरा मानना ​​है कि डेटाबेस सर्वेक्षण में शामिल किया जाता है केवल जब आदानों कि फिर से कर रहे हैं प्रतिक्रियाशील कार्य परिवर्तन में फेर किया गया। क्या ये सही है?
  • परिणामस्वरूप, क्या मैं सोच रहा हूं कि इस प्रतिक्रियाशील फ़ंक्शन को कॉल करने से कोई प्रश्न नहीं निकलता है - यानी डेटा कैश किया जाता है और कैश डेटा प्रदान किया जाता है?
  • उन इनपुट के लिए जो क्वेरी का हिस्सा नहीं हैं, मुझे लगता है कि इन में परिवर्तन नए डेटाबेस क्वेरी का कारण नहीं बनते हैं। क्या ये सही है?
+1

मेरा मानना ​​है कि आपकी समझ सही है। परीक्षण करने का एक तरीका है कि आपके कार्यों में कुछ 'प्रिंट()' कथन डालें ताकि यह देखने के लिए कि क्या निकाल दिया जाता है। – SymbolixAU

+0

मुझे लगता है कि पहला बिंदु थोड़ा अलग है, प्रतिक्रियाशील मूल्य अवैध हो जाएगा जब आदानों यह परिवर्तन पर निर्भर करता है, लेकिन यह पुनः मूल्यांकन किया जाएगा जब कुछ आउटपुट अद्यतन करने के लिए प्रतिक्रियाशील जरूरतों का उपयोग करता है का कहना है। पर्यवेक्षक आपके पहले बिंदु के अनुसार काम करते हैं। –

उत्तर

2

आपके सवालों के जवाब के लिए:

  1. दरअसल, किसी भी प्रतिक्रियाशील अभिव्यक्ति केवल जब प्रतिक्रियाशील भाव यह उस पर निर्भर में से एक अद्यतन किया जाता है दोबारा सत्यापित किया गया है। चमकदार यह एक अवैध ध्वज को पास करने के लिए करता है जब भी एक प्रतिक्रियाशील अभिव्यक्ति का मूल्य अन्य सभी प्रतिक्रियाशील अभिव्यक्तियों में बदल जाता है जो उस पर निर्भर करता है। अगली बार जब इन अमान्य प्रतिक्रियाशील अभिव्यक्तियों का उपयोग किया जाता है, तो उनका पुनर्मूल्यांकन किया जाता है। तो आपके मामले में queriedData (जो एक प्रतिक्रियाशील अभिव्यक्ति है) को अमान्य कर दिया जाएगा और इसलिए प्रत्येक बार इसे input$a से अमान्य ध्वज प्राप्त होता है। चूंकि डेटा बेस क्वेरी उस गणना का हिस्सा है, आपकी धारणा सही है।
  2. यह निर्भर करता है। जब input$a नहीं बदला और इसलिए queriedData अमान्य नहीं है, तो यह केवल कैश किए गए डेटा को वापस कर देता है। input$a हालांकि बदल गया, queriedData का पुनर्मूल्यांकन किया गया है और इसलिए एक प्रश्न उत्पन्न होगा।
  3. के रूप में केवल प्रतिक्रियाशील भाव एक अमान्य ध्वज पारित कर सकते हैं, उन केवल जो कि वास्तव में पैदा कर सकता है एक और प्रतिक्रियाशील अभिव्यक्ति पुनर्गणना किया जाना है। यदि अन्य भाग प्रतिक्रियाशील नहीं हैं, तो वे भी अमान्य नहीं हो सकते हैं और इसलिए queriedData का पुनर्मूल्यांकन नहीं कर सकते हैं।

ध्यान रखें कि एक प्रतिक्रियाशील अभिव्यक्ति को इनपुट होने की आवश्यकता नहीं है। उदाहरण समझें:

query <- reactive({paste0(...,input$a,...)}) 
queriedData <- reactive({ 
       db$find(query()) 
       }) 
output$thedata <- renderDataTable(queriedData()) 

अब input$a में बदलाव query अमान्य हो जाएगी, इसकी पुनर्गणना ट्रिगर। query, एक प्रतिक्रियाशील अभिव्यक्ति, queriedData() को अमान्य कर देगा, इसके पुनर्मूल्यांकन को ट्रिगर करेगा। यह output$thedata को अमान्य कर देगा, और इसलिए उस भाग को फिर से गणना करने का कारण बनता है, जिसके परिणामस्वरूप डेटा तालिका में दिखाया गया नया डेटा होता है।