如何在RStudio中调试(放置断点等)已安装的R包?
-
20-12-2019 - |
题
我需要逐行运行一个函数来了解它是如何工作的。但是该功能是已安装软件包的一部分,不知道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
声明,并逐步完成结果。
其他提示
我想当你打字的时候
install.packages('MultiPhen')
你会得到一个二进制版本的包。我认为没有办法设置断点并使用该版本的包逐步执行代码。所有R软件包都是开源的,源代码可在软件包的CRAN页面上找到。例如, 这 是MultiPhen的CRAN页面。如果您点击文本"包源:"旁边的链接,您将下载源。
在你有来源时该怎么做方面:所有R包具有相同的目录结构。对于您的情况来说,重要的是包的所有R代码都在名为"R"的目录中。
我建议从RStudio卸载软件包,并在目录"R"中采购代码,设置断点并按照您认为合适的方式逐步执行代码。
请让我们知道,如果这解决了你的问题。
我找到了一种简单的方法来做这件事。首先,编写一个脚本来调用函数,然后设置断点。运行脚本,它在断点停止。然后,您可以看到运行代码有不同的选项。下一行,进入函数,继续,停止......现在您可以按行运行代码行,并运行到您的功能。