R:存储函数符号以供以后重用并创建全局“undebug()”

时间:2016-12-28 20:25:38

标签: r debugging symbols

我想为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

如何存储功能符号以供日后重用?

1 个答案:

答案 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,他提供了有用的见解。