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

要求R调试器不要截断堆栈调用,r,debugging,R,Debugging,我想调试以下函数,但假设在调试器中查看moreajaj的参数等于什么(假设不像这个人为的示例中那么明显)是有用的。我可以在调试器框架中打印它,但在每个参数的每个框架中都这样做很烦人。在宣布每个帧时,如何使完整参数调用print in debugger options(error = dump.frames) #### suppose I do not see the function definitions, only see debugger below some_function <

我想调试以下函数,但假设在调试器中查看moreajaj的参数等于什么(假设不像这个人为的示例中那么明显)是有用的。我可以在调试器框架中打印它,但在每个参数的每个框架中都这样做很烦人。在宣布每个帧时,如何使完整参数调用print in debugger

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: 
选项(错误=dump.frames)
####假设我没有看到函数定义,只看到下面的调试器

调试器()
之前,可以执行一些函数:

注意,
last.dump
(由
debugger()
使用)中的转储被截断为终端的宽度:

> getOption("width")
[1] 80
因此,您还可以修改它(不确定是否方便),并重新生成
last.dump

> options(width = 1000)
> outerFunction()
> 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")

查看这次输出没有被截断的原因。

在对
dump.frames()
进行求值期间,这些调用的文本表示将被其调用
limitedLabels()
截断

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

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

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: 

你在用RStudio吗?如果是这样,“显示回溯”显示完整的行。伟大的答案!是否有
limitedLabels
功能的文档或介绍?G**gle找不到多少…@RYoda谢谢!我不知道它是否真的被记录在任何地方。我猜这主要是因为它不是一个广泛使用的实用函数,而且足够短,代码本身就是最好的文档。
## 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()
}
options(error=my.dump.frames)
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: