2012-03-21 5 views
14

फ़ंक्शन डिबग करते समय, मैं मूल फ्रेम पर जाना चाहता हूं और वहां कुछ चर देख सकता हूं। मैं यह कैसे करु?एक फ्रेम को ऊपर ले जाएं, आर पर्यावरण को डीबग करें

f <- function() { 
    x <-1 
    g(x+1) 
} 
g <- function(z) { 
    y = z+2 
    return(y) 
} 

मैं तो debug("g") और debug("f") का उपयोग कर दोनों कार्यों डिबग:

यहां एक नमूना है। जब मैं g में Browser> पर समाप्त होता हूं, तो मैं x की जांच करने के लिए f पर वापस जाना चाहता हूं।

धन्यवाद

उत्तर

11

आर शब्दावली में, आप g() के मूल्यांकन पर्यावरण की मूल फ्रेम (अर्थात वातावरण में g कहा जाता था) की जांच के लिए इच्छुक रहे हैं। ऐसा करने के लिए कार्य ?sys.parent के लिए सहायता पृष्ठ में दस्तावेज किए गए हैं।

एक बार आपका ब्राउज़र इंगित करता है कि आप 'debugging in g(x + 1)' हैं, तो आप निम्न कार्य कर सकते हैं। (where सुझाव कॉल स्टैक में लोगों स्थिति का पता करने में मदद करने के लिए यहोशू उलरिच के लिए धन्यवाद।)

# Confirm that you are where you think you are 
where 
# where 1 at #3: g(x + 1) 
# where 2: f() 

# Get a reference to g()'s parent frame (an environment object) 
pframe <- parent.frame() 
pframe 
# <environment: 0x019b9174> 

# Examine the contents of the parent frame 
ls(env=pframe) 
# [1] "x" 

# Get the value of 'x' in the parent frame 
get("x", env = pframe) 
# [1] 1 

संपादित: ?sys.parent में वर्णित कार्यों के संग्रह को समझने के लिए, यह शायद ध्यान देने योग्य बात यह है कि parent.frame() लायक है (मूल रूप से) sys.frame(sys.parent(1)) के लिए शॉर्टेंड। यदि आप खुद को एक मूल्यांकन स्टैण्ड में एक कॉल स्टैक से आगे पाते हैं (उदाहरण के लिए where द्वारा खुलासा किया गया है), तो आप parent.frame(2) या sys.frame(sys.parent(2)) द्वारा कॉल स्टैक (दो चरणों को ऊपर बताएं) के पीछे वातावरण में पहुंच सकते हैं।

+4

टाइपिंग 'कहां' ब्राउज़र में ऐसा लगता है कि यह निर्धारित करने में सहायक होगा कि आपको कितने फ्रेम वापस जाने की आवश्यकता है। –

+0

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

+0

उत्कृष्ट उत्तरों के लिए सभी को धन्यवाद। – Alex

24

आप recover उपयोग कर सकते हैं (यह अक्सर डिबग कोड के लिए एक वास्तविक त्रुटि के बाद, के माध्यम से options(error=utils::recover), प्रयोग किया जाता है, लेकिन यह सीधे कहा जा सकता है)।

> f() 
debugging in: g(x + 1) 
debug at #1: { 
    y = z + 2 
    return(y) 
} 
Browse[2]> ls() 
[1] "z" 
Browse[2]> recover() 

Enter a frame number, or 0 to exit 

1: f() 
2: #3: g(x + 1) 

Selection: 1 
Called from: top level 
Browse[3]> ls() 
[1] "x" 
Browse[3]> x 
[1] 1 
Browse[3]> 
+3

बहुत अच्छा। यह मेरे लिए कभी नहीं हुआ था कि 'पुनर्प्राप्त() 'को पारस्परिक रूप से बुलाया जा सकता है। कभी-कभी मुझे लगता है कि मुझे बस बैठना चाहिए और बाकी सभी को सवालों के जवाब देना चाहिए, और इस तरह के मणि वास्तव में क्यों है। –

+1

ग्रेट, इसके लिए धन्यवाद .. बहुत उपयोगी। – Alex