我已经写了这个R包,需要花费很多时间(> 10s,有时长达20-30s!)
每次加载软件包时,例如在步骤"** testing if installed package can be loaded"
上构建软件包或直接调用library("my.package")
时,20秒钟都不会发生任何事情。
这使开发过程中的所有事情都非常缓慢:构建文档,构建软件包,运行R检查...
我当然有怀疑(看着你,狡猾的依赖性),但我需要在消除之前收集证据。
是否有一种方法可以分析包裹的装载情况,以便找出原因?或更笼统地说,我如何弄清楚到底发生了什么?
答案 0 :(得分:2)
因此,使用@ davide-lorino的detach方法存在的一个问题是,如果纠缠了depends
或imports
,它将失败,并且很难失败。
更好的方法是使用一个future
后端,它在干净的R会话中加载每个import
,并花费多长时间通过library
加载它们。 / p>
我在一个可能对其他人有用的软件包中实现了此目的:https://github.com/rmflight/importedPackageTimings
答案 1 :(得分:0)
您可以通过对调用测试基准来加载哪个库,以确定哪个库需要最长的加载时间。
关键是要确保卸载库。如果在重新加载库之前保持它们已加载,则library()
函数将确定该库已加载并返回。在典型的100次运行基准测试中,其中1个代表加载库所需的时间,其余99个代表library()
确定加载库所花费的时间。然后,结果(持续时间)将是100次运行的总和,得出的结果很小,结果之间几乎没有差异,就像这样:
当您真正想要的东西看起来像:
为我们的努力提供了不那么令人惊讶的结果。
P.s。 detach_package()
函数的实现方式如下:
detach_package <- function(pkg, character.only = FALSE)
{
if(!character.only)
{
pkg <- deparse(substitute(pkg))
}
search_item <- paste("package", pkg, sep = ":")
while(search_item %in% search())
{
detach(search_item, unload = TRUE, character.only = TRUE)
}
}