如何在 RStudio 中调试(放置断点等)已安装的 R 包



我需要逐行运行一个函数来了解它是如何工作的。但是该函数是已安装软件包的一部分,我不知道 R 将已安装软件包的源代码存储在哪里(例如 MultiPhen)。我在 Ubuntu 12 (64it) 中使用 RStudio 0.98.501 和 R 3.0.2。显然没有存储已安装软件包的源代码,对吧?对不起,如果这是一个幼稚的问题,我是R的新手。如果没有存储源代码,是否有任何方法可以重新安装带有源代码的软件包并对其进行调试(基本上放置一个断点)。

谢谢

凯汉

看看trace . 下面是在基本包函数 var 中的第四条语句处添加断点的示例。 在这里,我们要求trace调用第六条语句中browser的函数:

> trace(var, browser, at=6)
Tracing function "var" in package "stats"
[1] "var"
> var(1:10)
Tracing var(1:10) step 6 
Called from: eval(expr, envir, enclos)
Browse[1]> n
debug: if (is.data.frame(y)) y <- as.matrix(y) else stopifnot(is.atomic(y))
Browse[2]> n
debug: stopifnot(is.atomic(y))
Browse[2]> n
debug: .Call(C_cov, x, y, na.method, FALSE)
Browse[2]> n
[1] 9.166667

完成后记得untrace。 你可以用trace做相当复杂的事情,尽管在大多数情况下trace(fun.name, browser)可能就足够了。

或者,您可以只加载包并在命令行上键入函数的名称,如下所示:

> var
function (x, y = NULL, na.rm = FALSE, use) 
{
    if (missing(use)) 
        use <- if (na.rm) 
            "na.or.complete"
        else "everything"
    na.method <- pmatch(use, c("all.obs", "complete.obs", "pairwise.complete.obs", 
        "everything", "na.or.complete"))
    if (is.na(na.method)) 
        stop("invalid 'use' argument")
    if (is.data.frame(x)) 
        x <- as.matrix(x)
    else stopifnot(is.atomic(x))
    if (is.data.frame(y)) 
        y <- as.matrix(y)
    else stopifnot(is.atomic(y))
    .Call(C_cov, x, y, na.method, FALSE)
}
<bytecode: 0x000000000928ad30>
<environment: namespace:stats>

然后,您可以将其复制到编辑器中并使用它,添加browser语句,然后逐步浏览结果。

  1. 我认为当你输入install.packages('MultiPhen')时,你会得到一个二进制版本的包。 我认为没有办法使用该版本的包设置断点并逐步执行代码。

  2. 所有 R 包都是开源的,源代码可在该包的 CRAN 页上找到。 例如,这是多芬的 CRAN 页面。 如果单击文本"包源:"旁边的链接,您将下载源。

  3. 关于拥有源代码时要执行的操作:所有 R 包都具有相同的目录结构。 对于您的情况来说,重要的是包的所有 R 代码都在名为"R"的目录中。

我建议从 RStudio 卸载软件包并在目录"R"中获取代码,设置断点并根据需要逐步执行代码。

如果这解决了您的问题,请告诉我们。

我找到了一个简单的方法来做到这一点。首先编写脚本来调用函数,然后设置断点。运行脚本,它会在断点处停止。然后,您可以看到运行代码有不同的选项。下一行,进入函数,继续,停止...现在,您可以逐行运行代码,并运行到您的函数。

最新更新