我需要逐行运行一个函数来了解它是如何工作的。但是该功能是已安装软件包的一部分,不知道R将已安装软件包的源存储在哪里(例如MultiPhen)。我正在Ubuntu12(64it)中使用RStudio0.98.501和R3.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页面上找到。例如, 是MultiPhen的CRAN页面。如果您点击文本"包源:"旁边的链接,您将下载源。

  3. 在你有来源时该怎么做方面:所有R包具有相同的目录结构。对于您的情况来说,重要的是包的所有R代码都在名为"R"的目录中。

我建议从RStudio卸载软件包,并在目录"R"中采购代码,设置断点并按照您认为合适的方式逐步执行代码。

请让我们知道,如果这解决了你的问题。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top