R中的'debug()'级别

R中的'debug()'级别,r,debugging,R,Debugging,通常,当我对R中的某个函数调用debug()时,它只是逐步遍历该函数,但有时它会跟随调用堆栈向下。我不明白为什么一个会发生另一个 例如,如果我有 f <- function(x){ print(x) } 只会显示 function(x) print(x) 有时它会进入print方法本身的代码中,我看到方法的分派和 function (x, digits = NULL, quote = TRUE, na.print = NULL, print.gap = NULL, right

通常,当我对R中的某个函数调用
debug()
时,它只是逐步遍历该函数,但有时它会跟随调用堆栈向下。我不明白为什么一个会发生另一个

例如,如果我有

f <- function(x){
  print(x)
}
只会显示

function(x) print(x)
有时它会进入print方法本身的代码中,我看到方法的分派和

function (x, digits = NULL, quote = TRUE, na.print = NULL, print.gap = NULL, 
  right = FALSE, max = NULL, useSource = TRUE, ...) 
{
  noOpt <- missing(digits) && missing(quote) && missing(na.print) && 
    missing(print.gap) && missing(right) && missing(max) && 
    missing(useSource) && missing(...)
  .Internal(print.default(x, digits, quote, na.print, print.gap, 
            right, max, useSource, noOpt))
}
函数(x,digits=NULL,quote=TRUE,na.print=NULL,print.gap=NULL,
右=假,最大=空,useSource=真,…)
{

noOpt
debug
本身永远不会进入调用堆栈-它准确地显示了您正在调试的那些函数,没有更多,也没有更少

在这种特殊情况下,有两个原因使您发现自己处于另一个功能中:

  • 您意外地
    debug
    也忽略了该函数,即调用了
    debug(print.default)
  • 在调试过程中,您进入了该功能。在R控制台中,当您按s而不是n(“进入”而不是“下一步”)时,会发生这种情况。在RStudio中,有相应的按钮用于任一操作

  • 如果正确设置了
    options(error)
    ,或者函数包含对
    browser()的显式调用,则可能会发生其他可能导致您在另一个函数中发现自己的情况

    debug
    本身永远不会进入调用堆栈-它准确地向您显示您正在调试的那些函数,没有更多,也没有更少

    在这种特殊情况下,有两个原因使您发现自己处于另一个功能中:

  • 您意外地
    debug
    也忽略了该函数,即调用了
    debug(print.default)
  • 在调试过程中,您进入了该功能。在R控制台中,当您按s而不是n(“进入”而不是“下一步”)时,会发生这种情况。在RStudio中,有相应的按钮用于任一操作
  • 当适当设置了
    选项(错误)
    时,或者当函数包含对
    浏览器()
    的显式调用时,可能会发生其他可能导致在另一个函数中发现自己的情况

    function (x, digits = NULL, quote = TRUE, na.print = NULL, print.gap = NULL, 
      right = FALSE, max = NULL, useSource = TRUE, ...) 
    {
      noOpt <- missing(digits) && missing(quote) && missing(na.print) && 
        missing(print.gap) && missing(right) && missing(max) && 
        missing(useSource) && missing(...)
      .Internal(print.default(x, digits, quote, na.print, print.gap, 
                right, max, useSource, noOpt))
    }