2012-12-01 9 views
8

कभी-कभी आप डीबग करने के लिए एक समारोह में एकाधिक browser s फेंक देते हैं। मुझे पता है कि आप Q के साथ पूरे शेबैंग से बाहर निकल सकते हैं, लेकिन यदि आप दूसरे ब्राउज़र से बाहर निकलना चाहते हैं (नीचे कोड देखें) और ब्राउज़र के पहले स्तर पर वापस आएं? मैंने c टाइप किया है लेकिन यह दूसरे स्तर browser से बाहर नहीं निकलता है।वर्तमान ब्राउज़र से बाहर निकलें (एक स्तर लौटें)

FUN <- function() { 
browser()      #first one 
    lapply(1:10, function(x) { 
browser()      #second one 
     return(x) 
    }) 
} 

FUN() 
+1

मैं जोड़ने 'qwer' में आने के लिए (या कुछ और) दूसरे ब्राउज़र के ठीक बाद। मैं मैन्युअल रूप से कोड के माध्यम से फ्लिप करता हूं और जब मैं दूसरे ब्राउज़र से बाहर निकलना चाहता हूं, तो मैं बस 'c' दबाता हूं। यह एक त्रुटि फेंकता है कि 'qwer' ऑब्जेक्ट मौजूद नहीं है, लेकिन मैं पहले से ही बाहर हूं, मेरे पैंट घर पर और मेरे रास्ते पर है। :) –

+0

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

उत्तर

7

मैं जोश के साथ सहमत हैं और अपने वर्तमान कोड में ये दो विकल्प का सुझाव चाहते हैं:

1) debugonce: यदि हम foo फोन अपने भीतर के समारोह, तो debugonce(foo) डिबगर केवल पहली बार का शुभारंभ करेंगे foo कहा जाता है, जब x==1

FUN <- function() { 
    browser() 
    foo <- function(x)return(x) 
    debugonce(foo) 
    lapply(1:10, foo) 
} 

2) debug और undebug। आप debug(foo) चलाने के बाद, डिबगर हर बार foo कहा जाता है का शुभारंभ किया जाएगा, और जब तक आप undebug(foo) चलाएँ:

FUN <- function() { 
    browser() 
    foo <- function(x)return(x) 
    debug(foo) 
    lapply(1:10, foo) 
} 

आप c से टकराने से पहले foo, प्रकार undebug(foo) डिबगिंग रोकने के लिए चाहते हैं और यह आप पर वापस ले लेगा पहला स्तर ब्राउज़र।

+0

बहुत गहन और विचारशील उत्तर। इन कार्यों के बारे में नहीं पता था। धन्यवाद। +1 –

+0

+1 'ब्राउज़रसेट डेबग' भी है, जो आपको 'ब्राउज़र' सत्र के दौरान कॉल स्टैक को स्थानांतरित करने देता है। हालांकि, यह सही काम नहीं लगता है जब 'ब्राउज़र' सत्र लॉन्च करने वाला फ़ंक्शन 'lapply' के भीतर से बुलाया जाता है। –

+0

मुझे यकीन नहीं है कि मुझे 'शर्त' तर्क क्या है।सबसे पहले मैंने सोचा कि यह 'ब्राउज़र 'के लिए' expr' तर्क 'जैसा हो सकता है, यह निर्धारित कर रहा है कि ब्राउज़र का आह्वान किया गया है या नहीं, लेकिन यह नहीं है ... –

8

टाइप cकरता बाहर निकलने के मौजूदा ब्राउज़र संदर्भ।

आपका कोड, हालांकि, इसके निष्पादन के दौरान एक "प्रथम स्तर" और 10 विशिष्ट "द्वितीय-स्तर" ब्राउज़र कॉल निष्पादित करता है। नतीजतन, जब आप एक द्वितीय-स्तर के ब्राउज़र से बाहर निकलते हैं, तो आपको लगभग अगले एक में तुरंत फेंक दिया जाता है, इसलिए ऐसा लगता है कि टाइपिंग c काम नहीं करती है।

c <RETURN> टाइप करें यह पुष्टि करने के लिए कि यह क्या हो रहा है।

> FUN() 
Called from: FUN() 
Browse[1]> c 
Called from: FUN(1:10[[1L]], ...) 
Browse[1]> c 
Called from: FUN(1:10[[2L]], ...) 
Browse[1]> c 
Called from: FUN(1:10[[3L]], ...) 
Browse[1]> c 
Called from: FUN(1:10[[4L]], ...) 
Browse[1]> c 
Called from: FUN(1:10[[5L]], ...) 
Browse[1]> c 
Called from: FUN(1:10[[6L]], ...) 
Browse[1]> c 
Called from: FUN(1:10[[7L]], ...) 
Browse[1]> c 
Called from: FUN(1:10[[8L]], ...) 
Browse[1]> c 
Called from: FUN(1:10[[9L]], ...) 
Browse[1]> c 
Called from: FUN(1:10[[10L]], ...) 
Browse[1]> c 
4

मैं दूसरे ब्राउज़र के ठीक बाद qwer (या कुछ अन्य वस्तु जो मौजूद नहीं है) जोड़ता हूं। मैं मैन्युअल रूप से कोड के माध्यम से फ्लिप करता हूं और जब मैं दूसरे ब्राउज़र से बाहर निकलना चाहता हूं, तो मैं बस c दबाता हूं। यह एक त्रुटि फेंकता है कि वस्तु मौजूद नहीं है। आपको पहले ब्राउज़र कॉल पर वापस फेंक दिया जाएगा।

+0

यह एक महान चाल है –

+0

@ रिकार्डोस्पोर्टा - मुझे यह चाल समझ में नहीं आती है, और मेरी इच्छा है। क्यूवर कहां जाता है, और यह आपको केवल जब आप चाहें तो अंदर-द-लूप ब्राउज़र कॉल के अनुक्रम से बचने की अनुमति देता है? –

+1

@ जोशो'ब्रायन, मैंने उपयोग किया: 'लापरवाही (सीईसी (100), फ़ंक्शन (i) {ब्राउज़र(); quer})' यह आपको एक से अधिक पुनरावृत्ति के माध्यम से प्राप्त करने की अनुमति नहीं देगा (यदि एक पुनरावृत्त संदर्भ में कॉल करना है, बेशक)। लेकिन यह आपको केवल एक संदर्भ स्तर –

0

रन undebug (yourFunction) इस डिबगिंग समाप्त, लेकिन अभी भी होगा ब्राउज़र शीघ्र पर बने रहने के बाद c टाइप करें और (शायद दो बार) वापस नियमित रूप से कमांड प्रॉम्प्ट

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