说我的代码如下所示
myfun1 = function()
{
print("This is myfun1, before calling the myfun2()")
myfun2()
print("This is myfun1, after calling the myfun2()")
}
myfun2 = function()
{
print("This is myfun2, before calling the myfun3()")
myfun3()
print("This is myfun2, after calling the myfun3()")
}
myfun3 = function()
{
print("This is myfun3(), before calling the myfun3()")
myfun4()
print("This is myfun3(), after calling the myfun3()")
}
myfun4 = function()
{
print("This is myfun4()")
}
我已经采购了它,并且正在调试它,
> source('~/Desktop/foo1.R')
> debug(myfun1)
> myfun1()
debugging in: myfun1()
debug at ~/Desktop/foo1.R#2: {
print("This is myfun1, before calling the myfun2()")
myfun2()
print("This is myfun1, after calling the myfun2()")
}
Browse[2]>
请注意,我在浏览[2],因为我开始使用myfun1()并使用'n'单步执行代码,它会带我浏览[3],浏览[ 4]和浏览[5]分别为myfun2(),myfun3()和myfun4()。没关系。
然而,在浏览[2]中,如果我再次调用myfun1(),而不是使用'n'步进,这就是我得到的
Browse[2]> myfun1()
debugging in: myfun1()
debug at ~/Desktop/foo1.R#2: {
print("This is myfun1, before calling the myfun2()")
myfun2()
print("This is myfun1, after calling the myfun2()")
}
Browse[4]>
我在这里有两个问题:
首先,为什么允许这样的递归调试(在单独的选项卡中)?怎么 它有用吗?
其次,为什么我在这里浏览[4] ?因为我们现在才2,所以我希望得到Browse [3]。
答案 0 :(得分:2)
您可能希望Browse[n]
表示当前调用堆栈的深度。它几乎是真的。请参阅?browser
的文档条目:
浏览器提示的格式为Browse [n]>:此处var {n}表示“浏览器级别”。浏览时可以调用浏览器(通常是在使用调试时),每次递归调用都会增加数量。 (实际数字是上下文堆栈中'contexts'的数量:对于外部浏览级别通常为2,在调试器中检查转储时为1。)
请注意,您从Browser[2]
开始(如上面帮助段落的最后一句中所述),即单个调用会创建2个'上下文'。这就是递归调用创建另一个2并且总数为4而不是3的原因。
现在,为什么允许这样做?答案是为什么不。当你站在browser()
内时,基本上可以使用完整的R功能做任何你想做的事情。比如,您手动打印或转储变量,检查它们以查看发生了什么。如果您使用debug(print)
进行调试,禁止打印某些内容会很奇怪,不是吗?更重要的是,在语境中禁止递归调用似乎不是一项非常简单的任务,而且我们显然缺乏可靠的理由。