2015-07-06 4 views
5

मान लें कि हमारे पास अपने स्वयं के इनपुट लेबल के साथ विजेट्स का एक सेट है। हम एक प्रतिक्रियाशील ऑब्जेक्ट कैसे बना सकते हैं जिसका मूल्य वह वर्ण है जो संशोधित अंतिम विजेट की इनपुट आईडी का प्रतिनिधित्व करता है?चमकदार प्रतिक्रियाशील चर बनाना जो इंगित करता है कि कौन सा विजेट अंतिम बार संशोधित किया गया था

उदाहरण के लिए, अगर हम

है ui.R

shinyUI(fluidPage(
    textInput('txt_a', 'Input Text A'), 
    textInput('txt_b', 'Input Text B") 
)) 

server.R

shinyServer(function(input, output) { 
    last_updated_widget <- reactive({ 
     #hypothetical code that indicates ID value of last updated widget 
    }) 
}) 

इस प्रकार वांछित परिणाम है। यदि उपयोगकर्ता पहले टेक्स्ट बॉक्स को संशोधित करता है, तो last_updated_widget() का मान "txt_a" होगा। यदि वे दूसरे बॉक्स को संशोधित करते हैं, तो last_updated_widget() का मान "txt_b" बन जाता है। मैं ऐसे परिणाम की तलाश में हूं जो मूल्य को निर्धारित करने के स्पष्ट सामान्यीकरण तक विस्तारित करता है जो कि आखिरी समायोजित किए गए किसी भी विजेट की आईडी हो।

मैं इसे renderUI() कथन द्वारा उत्पन्न किए गए मामले सहित विजेट इनपुट की मनमानी संख्या के लिए काम करना चाहता हूं। तो प्रत्येक विजेट के लिए एक अलग reactive() कथन बनाना एक विकल्प नहीं है। हालांकि, अगर प्रतिक्रियाशील कथन को सभी विजेट नामों (या ऐसा कुछ) पर लूप की आवश्यकता होती है तो मैं निश्चित रूप से इसके साथ काम कर सकता हूं। और कई प्रतिक्रियाशील कथन ठीक है, जब तक यह एक निश्चित राशि है, और विजेट की संख्या का एक कार्य नहीं है।

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

उत्तर

7

यहाँ एक समाधान है कि काम करता है, हालांकि यह एक नेस्टेड observe() की वजह से थोड़ा अजीब लग रहा है है। मुझे यकीन नहीं है कि एक बेहतर तरीका क्या होगा, लेकिन कुछ अच्छा हो सकता है।

असल में, सभी उपलब्ध इनपुटों पर लूप के लिए observe() का उपयोग करें, और प्रत्येक इनपुट के लिए, observe() का उपयोग करें जो केवल उस इनपुट को बदलते समय ट्रिगर करेगा और इनपुट के आईडी में एक चर सेट करेगा।

runApp(shinyApp(
    ui = shinyUI(
    fluidPage(
     textInput('txt_a', 'Input Text A'), 
     textInput('txt_b', 'Input Text B'), 
     uiOutput('txt_c_out'), 
     verbatimTextOutput("show_last") 
    ) 
), 
    server = function(input, output, session) { 
    output$txt_c_out <- renderUI({ 
     textInput('txt_c', 'Input Text C') 
    }) 

    values <- reactiveValues(
     lastUpdated = NULL 
    ) 

    observe({ 
     lapply(names(input), function(x) { 
     observe({ 
      input[[x]] 
      values$lastUpdated <- x 
     }) 
     }) 
    }) 

    output$show_last <- renderPrint({ 
     values$lastUpdated 
    }) 
    } 
)) 
0

आप अंतिम उपयोग किए गए विजेट का नाम संग्रहीत करने के लिए reactiveValues() के साथ बनाए गए एक प्रतिक्रियाशील मान का उपयोग कर सकते हैं। बाद में प्रत्येक विजेट की गतिविधि का ट्रैक रखने के लिए एक पर्यवेक्षक का उपयोग करें और अंतिम उपयोग किए गए विजेट के नाम से प्रतिक्रियाशील मान अपडेट करें।

folowing उदाहरण में, अंतिम उपयोग किए गए विजेट का नाम last_updated_widget$v में जमा हो जाती है और हर बार यह परिवर्तन होगा सक्रिय verbatimTextOutput। आप सर्वर में किसी भी स्थान पर last_updated_widget$v का उपयोग कर सकते हैं।

library(shiny) 
    runApp(list(
     ui = shinyUI(
      fluidPage(
       textInput('txt_a', 'Input Text A'), 
       textInput('txt_b', 'Input Text B'), 
       verbatimTextOutput("showLast") 
      ) 
     ), 
     server = function(input, output, session) { 
      last_updated_widget <- reactiveValues(v = NULL) 
      observe ({ 
       input$txt_a 
       last_updated_widget$v <- "txt_a" 
      }) 
      observe ({ 
       input$txt_b 
       last_updated_widget$v <- "txt_b" 
      }) 
      output$showLast <- renderPrint({ 
       last_updated_widget$v 
      }) 
     } 
    )) 
+1

मुझे नहीं लगता कि वह/वह उस तरह एक मैनुअल समाधान चाहता है, मूल प्रश्न कहना है कि वह आदानों की एक मनमाना संख्या –

+0

daatali सही है साथ owrk चाहिए, लेकिन मैं प्रश्न में है कि विस्तार का संपादन किया। यदि जियोवानी पहले से ही इसे संपादित करने से पहले जवाब दे रहा था, तो मैं – Bridgeburners

+1

से माफी माँगता हूं, मुझे खेद है, मैं प्रश्न अपडेट करने से पहले नमूना कोड लिख रहा था, इसलिए मैंने प्रतिबंध नहीं देखा और बस कोड पेस्ट किया। यह सुविधा उपयोगी होगी, शायद चमकदार कोर के साथ आंतरिक रूप से काम करना बेहतर होगा। वैसे @daattali आपकी shinyjs लाइब्रेरी बहुत उपयोगी है। – Geovany

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

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