2011-08-13 9 views
12

आर के पुराने संस्करणों में, संस्करण 2.9 वैसे भी, मैं rterm.exe का उपयोग करके बैच से एक आर प्रोग्राम चलाने में सक्षम था और एक ग्राफिक्स विंडो बना सकता था जिसे उपयोगकर्ता पीछे और पीछे स्क्रॉल कर सकता था और ग्राफ देखें।getGraphicsEvent एक noninteractive सत्र के लिए कुंजी बोर्ड पढ़ने के लिए

kbd <- function(key) { 
if (key == "q") { "Quit" } else NULL } 
getGraphicsEvent(" ", onKeybd = kbd) 

यह आयोजित ग्राफिक्स खुला व्यूअर जब तक उपयोगकर्ता "q" कुंजी दबाने: मुझे लगता है कि जैसे कुछ आर कोड का उपयोग करके ऐसा करने में सक्षम था। आर के नए संस्करणों में, ऐसा लगता है कि चूंकि यह बैच से शुरू होता है (Rterm.exe का उपयोग करके गैर-इंटरैक्टिव), मुख्य मान हमेशा शून्य होता है और ग्राफिक्स विंडो बस चमकती है और बंद हो जाती है। मेरा सवाल यह है कि अगर कोई तरीका है कि मैं किसी भी तरह से आर सिस्टम को समझ सकता हूं कि मैं अर्ध-इंटरैक्टिव सत्र चला रहा हूं और getGraphicsEvent का व्यवहार तुरंत प्राप्त नहीं कर सकता हूं?

+0

क्या आप समस्या को पूरी तरह से प्रदर्शित करने के लिए कुछ और कोड प्रदान कर सकते हैं? 'Rterm.exe' में 'getgraphicsEvent'' का उदाहरण मेरे लिए काम करता है। –

+0

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

उत्तर

0

यहाँ getGraphicsEvent के लिए स्रोत कोड है:

 
function (prompt = "Waiting for input", onMouseDown = NULL, onMouseMove = NULL, 
    onMouseUp = NULL, onKeybd = NULL, consolePrompt = prompt) 
{ 

    if (!interactive()) 
     return(NULL) 
    if (!missing(prompt) || !missing(onMouseDown) || !missing(onMouseMove) || 
     !missing(onMouseUp) || !missing(onKeybd)) { 
     setGraphicsEventHandlers(prompt = prompt, onMouseDown = onMouseDown, 
      onMouseMove = onMouseMove, onMouseUp = onMouseUp, 
      onKeybd = onKeybd) 
    } 
    .External2(C_getGraphicsEvent, consolePrompt) 
} 

आप देख सकते हैं क्यों यह NULL भेजता है, क्योंकि ऐसा करना if (!interactive()) return(NULL) साथ स्पष्ट किया है। यह आपकी मूल कोड में डाल प्रयास करें:

 

getGraphicsEvent2 = function (prompt = "Waiting for input", onMouseDown = NULL, onMouseMove = NULL, 
    onMouseUp = NULL, onKeybd = NULL, consolePrompt = prompt) 
{ 

    # if (!interactive()) 
    #  return(NULL) 
    if (!missing(prompt) || !missing(onMouseDown) || !missing(onMouseMove) || 
     !missing(onMouseUp) || !missing(onKeybd)) { 
     setGraphicsEventHandlers(prompt = prompt, onMouseDown = onMouseDown, 
      onMouseMove = onMouseMove, onMouseUp = onMouseUp, 
      onKeybd = onKeybd) 
    } 
    .External2(C_getGraphicsEvent, consolePrompt) 
} 
environment(getGraphicsEvent2) = environment(grDevices::getGraphicsEvent) 

dragplot(rnorm(1000), rnorm(1000)) 


kbd = function(key) { 
if (key == "q") { "Quit" } else NULL } 
getGraphicsEvent2("Waiting for input", onKeybd = kbd) 

यह (अर्थात् मैं ग्राफिक्स उपकरण के रूप में X11 के साथ पर OSX साजिश में हेरफेर नहीं कर सके) कार्यक्षमता खो रहा है, लेकिन कम से कम भूखंड ऊपर रहता है। इस फ़ंक्शन के लिए आंतरिक कोड पर कॉल हाल ही में बदला गया है (पुष्टि करने के लिए, दो संस्करणों में आर के लिए स्रोत कोड देखें - R 2.6.2 में इस फ़ंक्शन के लिए कोड, उदाहरण के लिए R-2.6.2/src/library/grDevices पर है /R/gevents.R)।

1

आप कर सकते हैं नकली एक में एक इंटरैक्टिव सत्र उस विकल्प

--ess 
विंडोज पर

, या

--interactive 
यूनिक्स प्रतिमूर्तियाँ पर

साथ Rterm शुरू करने से के रूप में गैर-सहभागी पता लगाया जा होगा।

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