要求R调试器不截断堆栈调用

Xu *_*ang 4 debugging r

我想调试以下函数,但是假设在调试器中查看moreajaj的参数等于(假设在这个设计示例中不那么明显)是很有用的.我可以在调试器框架中打印它,但是在每个参数的每一帧中都这样做很烦人.在宣布每个帧时,怎样才能使完整的参数在调试器中调用print?

options(error = dump.frames)

#### suppose I do not see the function definitions, only see debugger below
some_function <- function(...) {
  stop('give error')
}

willGiveError <- function() {
  some_function(alongargument = "some long kind of default", anotherlongargument = "more long default something as example", moreajaj = "kdjflksdjf")
}

outerFunction <- function() willGiveError()

outerFunction()

# Error in some_function(alongargument = "some long kind of default", anotherlongargument = "more long default something as example",  : 
#   give error
> debugger()
# Message:  Error in some_function(alongargument = "some long kind of default", anotherlongargument = "more long default something as example",  : 
#   give error
# Available environments had calls:
# 1: outerFunction()
# 2: #1: willGiveError()
# 3: #2: some_function(alongargument = "some long kind of default", another
# 4: #2: stop("give error")
# 
# Enter an environment number, or 0 to exit  Selection: 
Run Code Online (Sandbox Code Playgroud)

正如您在调试器输出中看到的那样,它在第2帧中的"另一个"之后被切断,我希望看到 anotherlongargument = "more long default something as example", moreajaj = "kdjflksdjf")

Jos*_*ien 6

这些调用的文本表示在dump.frames()通过调用的评估期间被截断limitedLabels().

一个简单的解决方案是编写一个类似的函数,该函数的不同之处仅在于提供(足够大的值)maxwidth=参数limitedLabels().

## Identical to dump.frames _except_ for addition of maxwidth=10000 argument
my.dump.frames <- 
function (dumpto = "last.dump", to.file = FALSE) 
{
    calls <- sys.calls()
    last.dump <- sys.frames()
    names(last.dump) <- limitedLabels(calls, maxwidth=10000)  # <-- edited line
    last.dump <- last.dump[-length(last.dump)]
    attr(last.dump, "error.message") <- geterrmessage()
    class(last.dump) <- "dump.frames"
    if (dumpto != "last.dump") 
        assign(dumpto, last.dump)
    if (to.file) 
        save(list = dumpto, file = paste(dumpto, "rda", sep = "."))
    else assign(dumpto, last.dump, envir = .GlobalEnv)
    invisible()
}
Run Code Online (Sandbox Code Playgroud)

然后设置它,而不是dump.frames当错误中断R的评估时要运行的函数.

options(error=my.dump.frames)
Run Code Online (Sandbox Code Playgroud)

使用该集,运行提供的代码,然后输入调试器,可以得到您希望的结果:

debugger()
# Message:  Error in some_function(alongargument = "some long kind of default", anotherlongargument = "more long default something as example",  : 
#   give error
# Available environments had calls:
# 1: outerFunction()
# 2: #1: willGiveError()
# 3: #2: some_function(alongargument = "some long kind of default", anotherlongargument = "more long default something as example", moreajaj = "kdjflksdjf")
# 4: #2: stop("give error")
# 
# Enter an environment number, or 0 to exit  Selection: 
Run Code Online (Sandbox Code Playgroud)