在调试器中调用debug(myfun1)

时间:2014-12-21 23:01:41

标签: r rstudio

说我的代码如下所示

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]>  

我在这里有两个问题:

  1. 首先,为什么允许这样的递归调试(在单独的选项卡中)?怎么 它有用吗?

  2. 其次,为什么我在这里浏览[4] ?因为我们现在才2,所以我希望得到Browse [3]。

1 个答案:

答案 0 :(得分:2)

您可能希望Browse[n]表示当前调用堆栈的深度。它几乎是真的。请参阅?browser的文档条目:

  

浏览器提示的格式为Browse [n]>:此处var {n}表示“浏览器级别”。浏览时可以调用浏览器(通常是在使用调试时),每次递归调用都会增加数量。 (实际数字是上下文堆栈中'contexts'的数量:对于外部浏览级别通常为2,在调试器中检查转储时为1。)

请注意,您从Browser[2]开始(如上面帮助段落的最后一句中所述),即单个调用会创建2个'上下文'。这就是递归调用创建另一个2并且总数为4而不是3的原因。

现在,为什么允许这样做?答案是为什么不。当你站在browser()内时,基本上可以使用完整的R功能做任何你想做的事情。比如,您手动打印或转储变量,检查它们以查看发生了什么。如果您使用debug(print)进行调试,禁止打印某些内容会很奇怪,不是吗?更重要的是,在语境中禁止递归调用似乎不是一项非常简单的任务,而且我们显然缺乏可靠的理由。