如何分析 R 包中的底层 C 代码?

Posted

技术标签:

【中文标题】如何分析 R 包中的底层 C 代码?【英文标题】:How do I profile the underlying C-code in an R package? 【发布时间】:2019-05-06 14:22:14 【问题描述】:

我对 C 有很好的了解,但对 R 却知之甚少。我在 Windows7 上的 R-studio 中从源代码安装了一个 R-package (coxme),其中包括将几个 C 文件编译成一个 .dll。这个包不是独立的,它依赖于至少 2 个其他包(可能更多)。它运行得太慢了,所以我想看看是否可以通过先对其进行分析来加快速度。我使用 R 包“profvis”来分析 R 代码,但它只告诉我 98% 的时间被“coxme”包使用,而没有提供任何进一步的细节。对 R 包的调用类似于:

frail.xg=coxme(Surv(y.vec,delta.vec)~x.mat+g.vec+(1|fiid.vec),varlist=list(K.mat))

整个包没有名为coxme(...)的函数,所以我不知道我如上所示调用这个包后发生了什么。我标记了包的“src”目录中的每个函数以打印(附加)到文件中,但只有init() 函数在注册包时在安装时触发。一旦我从 R-Studio 中运行 coxme,其他功能都不会打印到该文件。除了init() 函数之外,当我调用coxme(...) 时,似乎包中的所有C 函数都没有被执行。我的做法是这样的:

remove.packages("coxme")

在 coxme“src”目录中操作 C 代码以打印到某个外部文件“我是函数 XYZ 等”。创建 coxme.tar.gz

install.packages('E:/Workdir/AOO/R/coxme/coxme.tar.gz', repos = NULL, type="source")
library("coxme")
frail.xg=coxme(Surv(y.vec,delta.vec)~x.mat+g.vec(1|fiid.vec),varlist=list(K.mat))

这会产生一些预期的结果。 但是似乎没有一个 C 函数受到影响,我的分析代码也没有。所以我的问题是:

    究竟执行了什么? 我如何着手并找出 coxme 包中大部分时间消耗的内容?

【问题讨论】:

也许可以先回答一个更直接的问题:***.com/help/formatting coxme 调用 coxme.fit 调用 C 函数:github.com/cran/coxme/blob/master/R/coxme.fit.R#L152 好的,这很有趣。谢谢! 也许这会有所帮助how to find the source of a function 也许这会有所帮助:jimhester.com/2018/08/22/debugging-rstudio 【参考方案1】:

主要问题是 Rstudio(至少在 Windows7 上)在加载后不会更新任何 .dll。所以我对 C 代码的编辑从未生效,因为旧的 .dll 从未被替换,即使我通过 install.packages() 卸载并重新编译也是如此。我不得不完全退出 Rstudio 并手动删除包目录(coxme)。然后从我编辑的源代码中重新启动安装中的 Rstudio。现在,我的编辑提供了预期的结果。

【讨论】:

您可以尝试Build 窗格中的More > Clean & Rebuild 选项来强制删除.o/.so 对象,然后再重新安装 您是否成功加速了coxme 包?我正在使用它,估计 2500 个人需要 3 秒,这对我来说太慢了。我必须引导它。

以上是关于如何分析 R 包中的底层 C 代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 android 包中的资源 id 获取 Drawable 对象?

R闪亮包中的父/子行

使用 Rcpp 在 R 包中添加外部库

r3.4.1的caret包中没有traincontrol函数,怎么回事

R ranger 包中的预测概率

如何在 r 汽车包中的后续情节的完整性中以适当的格式在 x 轴上绘制日期?