2014-07-02 22 views
10

मैं एक चमकदार एप्लिकेशन बना रहा हूं, जहां मैं क्लाइंट बंद होने पर (स्थानीय) सर्वर को रोकना चाहता हूं। इस लक्ष्य को हासिल करने के लिए एक आसान तरीका shinyServer समारोह में यह शामिल करने के लिए है:सत्र समाप्त होने पर समय की घटनाएं

session$onSessionEnded(function() { 
    stopApp() 
}) 

इस दृष्टिकोण के लिए एक नकारात्मक पक्ष यह उपयोगकर्ता ताज़ा हिट करने का फैसला करता है, तो अनुप्रयोग मर जाता है।

मैंने उदाहरण के लिए विभिन्न कामकाज की कोशिश की है। कुछ अंतराल पर कनेक्शन की जांच के लिए reactiveTimer/invalidateLater। हालांकि, ये एक सत्र संदर्भ लेते हैं (वे सत्र के लिए विशिष्ट हैं), और onSessionEnded के बाद कुछ भी निष्पादित नहीं होगा।

क्या कोई "ग्लोबल" सर्वर टाइमर है जो नियमित रूप से निष्पादित करता है, और सक्रिय कनेक्शन की जांच करता है? या स्वचालित एप्लिकेशन शट-डाउन प्राप्त करने का एक और तरीका है लेकिन जो पृष्ठ के रीफ्रेश के लिए अनुमति देता है?

+0

अच्छा सवाल शायद rstudio से लोगों में से एक को – jdharrison

उत्तर

4

आप बटन पर क्लिक होने पर ऐप को रोकने के लिए actionButton और सर्वर पर कुछ कोड जोड़ सकते हैं। उदाहरण के लिए:

runApp(list(
    ui = bootstrapPage(
    actionButton('close', "Close app") 
), 
    server = function(input, output) { 
    observe({ 
     if (input$close > 0) stopApp() 
    }) 
    } 
)) 

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

runApp(list(
    ui = bootstrapPage(
    tags$button(
     id = 'close', 
     type = "button", 
     class = "btn action-button", 
     onclick = "setTimeout(function(){window.close();},500);", 
     "Close window" 
    ) 
), 
    server = function(input, output) { 
    observe({ 
     if (input$close > 0) stopApp() 
    }) 
    } 
)) 

बेशक, जब उपयोगकर्ता विंडो को किसी अन्य तरीके से बंद करता है तो यह ऐप को नहीं रोक देगा। मेरा मानना ​​है कि ब्राउज़र में विंडो बंद घटनाओं का पता लगाना भी संभव है, और फिर आप उस समय एक इनपुट मान (जो सर्वर पर जाता है) सेट करने में सक्षम हो सकते हैं, लेकिन मुझे नहीं पता कि यह सर्वर पर पहुंच जाएगा या नहीं खिड़की बंद होने से पहले और जावास्क्रिप्ट चलना बंद कर देता है।

+0

आगे बढ़ने के तरीके पर एक संभाल होगा, मैंने इस समाधान पर विचार किया था; लेकिन ऐसा करने का प्राथमिक कारण यह है कि (कुछ) उपयोगकर्ताओं को ताज़ा बटन का उपयोग करके ताज़ा पृष्ठों और बंद खिड़कियों की आदत है। दोनों के साथ सौदा करना मुश्किल है। तो यह सुविधा के रूप में नहीं है, "गार्ड" के रूप में अधिक ... सर्वर को एक छोटे से स्थानीय (पोर्टेबल) आर के रूप में चलाया जाता है, जो उपयोगकर्ता से छिपा हुआ है। ग्राहक एक पोर्टेबल क्रोम है। जब यह बंद हो जाता है, तो सर्वर को खुद को रोकना चाहिए और अच्छी तरह से छोड़ देना चाहिए। लेकिन अगर उपयोगकर्ता "पेज" को रीफ्रेश नहीं करता है। – Stefan

+0

जब मैं आर कंसोल में पहला कोड खंड चलाता हूं, तो यह ऐप बंद कर देता है। जब मैं यह दूसरा कोड खंड चलाता हूं, तो मुझे ब्राउज़र टैब बंद करने के लिए मिलता है; लेकिन यह ऐप को रोकता नहीं है। सुझाव? –

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