我想为debug()
函数编写一个包装器,以便在需要时删除所有调试标志。
对于搜索路径中的功能,它很简单。
.debugged <- NULL
debug.wrapper <- function(fun){
f <- deparse(substitute(fun))
.debugged <<- unique(c(.debugged, f))
debug(f)
}
debug.wrapper.off <- function() {
z=sapply(.debugged, undebug)
.debugged <<- NULL
}
它有效,因为我可以使用函数符号的字符版本。
f <- function() print("hello")
debug.wrapper(f)
isdebugged(f)
# [1] TRUE
debug.wrapper.off()
isdebugged(f)
# [1] FALSE
无论如何,对于名称空间,它不起作用:
debug.wrapper(tools:::psnice)
# Error in debug(f) could not find function "tools:::psnice"
此外:
debug(substitute(tools:::psnice))
# Error in debug(fun, text, condition) : argument must be a function
如何存储功能符号以供日后重用?
答案 0 :(得分:1)
似乎连接函数符号会创建一种“软指针”而不是副本,即:
x <- c(tools:::psnice, identity)
采取第一个功能,我们得到:
x[[1]]
# function (pid = Sys.getpid(), value = NA_integer_)
# {
# res <- .Call(ps_priority, pid, value)
# if (is.na(value))
# res
# else invisible(res)
# }
# <bytecode: 0x00000000189f1f80>
# <environment: namespace:tools>
字节码和环境与tools:::psnice
相同
因此un/debug(x[[1]])
就像un/debug(tools:::psnice)
鉴于上述说明,解决方案是微不足道的。 Debug包装器定义为:
.debugged <- NULL
debug.wrapper <- function(fun){
.debugged <<- unique(c(.debugged, fun))
debug(fun)
}
debug.wrapper.off <- function() {
z=sapply(.debugged, undebug)
.debugged <<- NULL
}
使用它们带来:
f <- function() print("hello")
debug.wrapper(f)
debug.wrapper(tools:::psnice)
isdebugged(f)
# [1] TRUE
isdebugged(tools:::psnice)
# [1] TRUE
debug.wrapper.off()
isdebugged(f)
isdebugged(tools:::psnice)
.debugged
# NULL
当然,当传递fun
是一个字符串时,可以添加管理案例的条件。
感谢@Rich Scriven,他提供了有用的见解。