2012-01-07 28 views
14

में एक लूप के दौरान प्लॉटिंग मैं आर (अनुरूपित एनीलिंग) में ट्रैवलिंग सेल्समैन समस्या (टीएसपी) के लिए एक समाधान लागू कर रहा हूं और मैं समय-समय पर वर्तमान सर्वोत्तम पथ को आउटपुट करना चाहता हूं। मैंने for लूप के दौरान भूखंडों को आउटपुट करने के लिए काफी कुछ खोजा है और इस प्रकार अब तक असफल रहा है।RStudio

मैं RStudio का उपयोग करता हूं, और ग्राफ उत्पन्न होने के रूप में देखना चाहता हूं। यदि आपने कभी टीएसपी सॉल्वर अपनी बात की है, तो आप समझेंगे कि यह देखना कितना अच्छा है। यहां ग्राफिक्स आउटपुट का एक नमूना है जिसे मैं http://www.staff.science.uu.nl/~beuke106/anneal/anneal.html

मुझे नहीं लगता कि स्मृति उपयोग एक समस्या होगी (लगभग 500,000 पुनरावृत्तियों के दौरान, मुझे केवल 50-100 भूखंडों की उम्मीद है)।

Plotz <- function(iter = 1000000, interval = 100000) { 
    x <- 1:10 
    for(i in 1:iter){ 
    y <- runif(10) 
    if(i %% interval == 0) { 
     plot(x, y) 
    } 
    } 
    return(c(x, y)) 
} 
Plotz() 

जब मैं इस चलाने के लिए, सब मैं देख अंतिम साजिश (RStudio में) का उत्पादन किया है: यहाँ एक नमूना समारोह, जहां हम समय समारोह चलाता दौरान 10 विभिन्न भूखंडों को देखने के लिए उम्मीद करेंगे है। प्लॉट्स को जेनरेट किए जाने के बाद मैं कैसे देख सकता हूं?

इसके अलावा: मैं उबंटू पर हूं (जो भी नवीनतम स्थिर रिलीज है)। पता नहीं है कि यह प्रासंगिक है या नहीं।

सभी को अग्रिम धन्यवाद।

संपादित करें: प्रति कैप्टन मर्फी के सुझाव के अनुसार, मैंने इसे लिनक्स टर्मिनल में चलाने की कोशिश की, और ग्राफिक्स दिखाई दिए। मुझे अभी भी लगता है कि "RStudio में यह कैसे करें?" हालांकि, अभी भी प्रासंगिक है। यह इतना अच्छा कार्यक्रम है, तो हो सकता है कि किसी को यह पता चल जाए कि इसे काम करने के लिए क्या किया जा सकता है?

EDIT2: जैसा कि थिलो ने कहा, यह Rstudio में एक ज्ञात बग है। अगर किसी के पास सॉफ्टवेयर को ठीक किए बिना हल करने के लिए कोई अन्य विचार है, तो अभी भी चर्चा करने के लिए कुछ है। अन्यथा, इस सवाल को हल करने पर विचार करें।

+1

मानक आर कंसोल (आर स्टूडियो नहीं) में अपना कोड आज़माएं। प्रतीत होता है कि पुनरावृत्त भूखंड मेरे लिए दिखाई देते हैं, न केवल अंत में। –

+1

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

+4

मेरे पास आपके लिए पूर्ण उत्तर नहीं है, लेकिन शायद कुछ जानकारी: ऐसा लगता है कि यह 2011 में RStudio में एक बग है (था?)। Http://support.rstudio.org/help/discussions/suggestions/214- भूखंड-चाहिए-अपडेट-इन-रीयल-टाइम-ओएसएक्स – Thilo

उत्तर

8

एक बात आप कर सकते हैं वहाँ में एक X11 खिड़की और साजिश खोलने है:

x11() 
Plotz() 

कि टर्मिनल में इसे चलाने के रूप में ही काम करना चाहिए।

1
Plotz <- function(iter = 1000, interval = 100) { 
    x <- 1:10 
    p <- 0 #plot number 
    for(i in 1:iter){ 
    y <- runif(10) 
    if(i %% interval == 0) { 
     p <- p + 1; plot(x, y) 
     readline("Please press the Enter key to see the next plot if there is one.") 
    } 
    } 
    return(c(x, y)) 
} 
Plotz() 
1

तुम भी भूखंडों को देखने के लिये RStudio इंटरफ़ेस के निचले बाएँ फलक के भूखंडों टैब पर वापस तीर का उपयोग कर सकते हैं।

16

कॉलिंग Sys.sleep (0) को साजिश खींचने का कारण बनना चाहिए। एक्स 11 समाधान के विपरीत, यह RStudio के सर्वर संस्करणों पर भी काम करेगा।

(मैं हैरान था कि dev.flush() परिणाम आप के लिए उम्मीद कर रहे थे, कि एक बग हो सकता है हार नहीं मानी।)

+1

यह भी एक अच्छा समाधान है। इस और @ सचा के बीच का अंतर यह है कि यदि हम एक छोटी अवधि में कई भूखंड पैदा कर रहे हैं, तो यह एक (कम से कम मेरे सिस्टम पर) सभी भूखंडों को हमेशा नहीं दिखाएगा यदि वे बहुत जल्दी उत्पन्न हो रहे हैं। यह जरूरी नहीं है कि आप सभी भूखंडों को देखना चाहते हैं या यदि आपका लक्ष्य सिर्फ सामान्य विचार है कि टीएसपी प्रणाली की वर्तमान स्थिति क्या है। मेरे उद्देश्यों के लिए, x11() समाधान बेहतर काम करता है, लेकिन यह भी एक महान है। – Rguy

2

आप भूखंडों को बचाने के लिए और साथ ही आप बस एक नया खोल सके चाहते हैं लूप में डिवाइस और बाद में इसे बंद करें।

Plotz <- function(iter = 1000, interval = 100) { 
    x <- 1:10 

    p <- 0 #plot number 

    for(i in 1:iter){ 

    y <- runif(10) 
    if(i %% interval == 0) { 
     png(file=paste(i,"png",sep=".")) 
     p <- p + 1; plot(x, y) 
     dev.off() 
    } 
    } 
return(c(x, y)) 
} 
7

@ JoeCheng के जवाब पर और @ कि जवाब पर RGuy की टिप्पणी अप के बाद: के रूप में मैं worked out with the RStudio folks, समस्या मुख्य रूप से पैदा होती है जब बहुत ज्यादा अंकन बहुत छोटा एक समयावधि में हो रहा है लगता है। समाधान दो गुना है:

  • Sys.sleep(0) प्लॉटिंग विंडो में अपडेट को मजबूर करने में मदद करता है।
  • हर लूप की बजाय प्रत्येक W वें पाश अपडेट को प्लॉट करना।वास्तविक समय में

    N <- 1000 
    x <- rep(NA,N) 
    plot(c(0,1)~c(0,N), col=NA) 
    for(i in seq(N)) { 
        Sys.sleep(.01) 
        x[i] <- runif(1) 
        iseq <- seq(i-99,i) 
        points(x[i]~i) 
        Sys.sleep(0) 
    } 
    

    निम्नलिखित कोड अद्यतन, एक ही होने के बावजूद:

उदाहरण के लिए, अपने कंप्यूटर (i7, RStudio सर्वर) पर, निम्नलिखित कोड तक पाश पूरा करता अपडेट नहीं करता अंकों की संख्या साजिश रची जा करने के लिए:

N <- 1000 
x <- rep(NA,N) 
plot(c(0,1)~c(0,N), col=NA) 
for(i in seq(N)) { 
    Sys.sleep(.01) 
    x[i] <- runif(1) 
    iseq <- seq(i-99,i) 
    if(i%%100==0) { 
    points(x[iseq]~iseq) 
    Sys.sleep(0) 
    } 
} 

दूसरे शब्दों में, यह कोई बात करने के लिए लगता है कि कॉल plot की संख्या, नहीं डेटा की मात्रा साजिश रची जा करने के लिए है।

+1

मेरी समस्या यह है कि जब मैं टीसीएल टीके विंडो में साजिश करना चाहता हूं? मुझे अपनी खिड़की को अपडेट करने का तरीका नहीं मिल रहा है। जब मैं 'Sys.sleep (0)' करता हूं, तो यह अद्यतन हो रहा है लेकिन जब तक मैं शीर्षक पट्टी को पकड़कर और स्थानांतरित करके खिड़की (सचमुच) स्थानांतरित नहीं करता तब तक मैं परिवर्तन नहीं देख सकता। – David

0

आप अपने प्लॉट को एक जीआईएफ में ले जाने के लिए एनिमेट पैकेज का उपयोग कर सकते हैं।

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