使用源行号分析已安装的 R 包?

Profiling an installed R package with source line numbers?

我想使用 Rprof()line.profiling=TRUE 分析已安装 R 包 (data.table) 中的函数。安装包一般都是字节编译的,字节编译包是没有行号的。使用 Rprof() 进行线路分析的常用说明需要使用 source()eval(parse()),以便存在 srcref 属性。

如何加载 data.table 以便行号处于活动状态?我天真的尝试首先用 library(data.table) 加载包然后 source('data.table.R') 失败了,因为当我尝试使用包时找不到一些编译的 C 函数,大概是因为 library() 使用了一个不同的命名空间。也许有某种方法可以 source() 进入正确的命名空间?

或者,也许我可以构建一个未字节编译的 data.table 的修改版本,然后以保留行号的方式加载它?我必须进行哪些更改,然后如何加载它?我从设置 ByteCompile: FALSE 开始,然后尝试 R CMD INSTALL -l ~/R/lib --build data.table,但这似乎仍然是字节编译的。

我很想完成这项工作,并会寻求任何建议。我是 运行 Linux 上的 R 3.2.1,可以完全控制机器,并且可以安装任何其他需要的东西。

编辑:

我试图解决的问题(及其解决方案)的更完整描述在这里:https://github.com/Rdatatable/data.table/issues/1249

我最终基本上按照 Joshua 的建议做了:在描述中使用 "KeepSource: TRUE" 重新编译包。出于我的目的,我还发现 "ByteCompile: FALSE" 很有帮助,尽管这可能并不普遍适用。我还更改了版本号,以便可以看到我使用的是修改后的版本。

然后我用 "R CMD INSTALL data.table -l ~/R/lib" 安装到不同的位置,并用 "library(data.table, lib='~/R/lib')" 加载。当与 link 中给出的补丁一起使用时,我得到了我想要的分配行号。但是,如果有人知道不需要重新编译的解决方案,我相信如果您分享,其他人会很感激。

即使程序包是按字节编译的,您也应该能够获得行号。但是,正如 ?Rprof 中所说(强调):

Individual statements will be recorded in the profile log if line.profiling is TRUE, and if the code being executed was parsed with source references. See parse for a discussion of source references. By default the statement locations are not shown in summaryRprof, but see that help page for options to enable the display.

这意味着您需要在 DESCRIPTION 文件中或通过 --with-keep.source 参数将 KeepSource: TRUE 设置为 R CMD INSTALL