gpt4 book ai didi

debugging - 列出在 R 中设置了调试标志的函数

转载 作者:行者123 更新时间:2023-12-03 23:48:20 25 4
gpt4 key购买 nike

我试图找到一个全局对应的 isdebugged()在 R 中。我的情况是我有函数调用其他函数,所有这些都是我写的,我正在转向 debug()在我的调试过程中打开和关闭不同的功能。但是,我可能会忘记要调试哪些函数。当我忘记并开始一个循环时,我可能会得到更多的输出(令人讨厌,但并不可怕),或者在需要某些输出时我可能没有输出(不好)。

我目前的做法是使用一个类似于下面的函数,我可以用 listDebugged(ls()) 调用它。或列出已加载库中的项目(以下示例)。这可能就足够了,但它要求我使用工作区或加载的包中的每个函数的列表来调用它。我可以包装另一个获得这些的函数。似乎应该有一种更简单的方法来直接“询问”调试函数或查询环境中的某些模糊部分,在该部分中它隐藏​​了设置了调试标志的函数列表。

所以,一个两部分的问题:

  • 是否存在更简单的调用来查询设置了调试标志的函数?
  • 如果没有,那么是否有任何我忽略的技巧?例如,如果一个包中的一个函数屏蔽了另一个包,我怀疑我可能会返回一个误导性的结果。

  • 我意识到我可以尝试另一种方法,那就是包装 debugundebug在还维护一个隐藏的调试函数名称列表的函数中。我还不相信这是一件安全的事情。

    更新 (8/5/11):我搜索了 SO,没有找到更早的问题。但是,SO的“相关问题”列表显示 an earlier question that is similar ,尽管该问题的答案中的函数比@cbeleites 提供的函数更冗长也更慢。较旧的问题也没有提供任何代码,而我提供了。 :)

    编码:
    listDebugged    <- function(items){
    isFunction <- vector(length = length(items))
    isDebugged <- vector(length = length(items))

    for(ix in seq_along(items)){
    isFunction[ix] <- is.function(eval(parse(text = items[ix])))
    }

    for(ix in which(isFunction == 1)){
    isDebugged[ix] <- isdebugged(eval(parse(text = items[ix])))
    }
    names(isDebugged) <- items
    return(isDebugged)
    }

    # Example usage
    listDebugged(ls())
    library(MASS)
    debug(write.matrix)
    listDebugged(ls("package:MASS"))

    最佳答案

    这是我对 listDebugged 函数的抛出:

    ls.deb  <- function(items = search ()){
    .ls.deb <- function (i){
    f <- ls (i)
    f <- mget (f, as.environment (i), mode = "function",

    ## return a function that is not debugged
    ifnotfound = list (function (x) function () NULL)
    )

    if (length (f) == 0)
    return (NULL)

    f <- f [sapply (f, isdebugged)]
    f <- names (f)

    ## now check whether the debugged function is masked by a not debugged one
    masked <- !sapply (f, function (f) isdebugged (get (f)))

    ## generate pretty output format:
    ## "package::function" and "(package::function)" for masked debugged functions
    if (length (f) > 0) {
    if (grepl ('^package:', i)) {
    i <- gsub ('^package:', '', i)
    f <- paste (i, f, sep = "::")
    }

    f [masked] <- paste ("(", f [masked], ")", sep = "")

    f
    } else {
    NULL
    }
    }


    functions <- lapply (items, .ls.deb)
    unlist (functions)
    }
  • 我选择了不同的名称,因为输出格式只是调试的函数(否则我很容易得到数千个函数)
  • 输出格式为 package::function (或者更确切地说 namespace::function 但包很快就会有命名空间)。
  • 如果调试函数被屏蔽,输出为 "(package::function)"
  • 默认是查看整个搜索路径
  • 关于debugging - 列出在 R 中设置了调试标志的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6950602/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com