我想调试以下函数,但是假设在调试器中查看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")
这些调用的文本表示在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)
| 归档时间: |
|
| 查看次数: |
185 次 |
| 最近记录: |