我编写了几种方法来生成网络类型对象,其中包含用于定义与公式或模型列表的关系的选项。在尝试调用我的打印方法时,我看到列表生成的对象与公式生成的对象之间的速度完全不同
setRepositories(ind=1:2)
#* Requires that you have JAGS installed
devtools::install_github("nutterb/HydeNet", ref="devel-brom")
library(HydeNet)
data(PE, package='HydeNet')
#* Object based on a formula
autoNet <- HydeNetwork(~ wells
+ pe | wells
+ d.dimer | pregnant*pe
+ angio | pe
+ treat | d.dimer*angio
+ death | pe*treat,
data = PE)
#* Object based on a list of models
g1 <- lm(wells ~ 1, data=PE)
g2 <- glm(pe ~ wells, data=PE, family="binomial")
g3 <- lm(d.dimer ~ pe + pregnant, data=PE)
g4 <- xtabs(~ pregnant, data=PE)
g5 <- glm(angio ~ pe, data=PE, family="binomial")
g6 <- glm(treat ~ d.dimer + angio, data=PE, family="binomial")
g7 <- glm(death ~ pe + treat, data=PE, family="binomial")
bagOfModels <- list(g1,g2,g3,g4,g5,g6,g7)
bagNet <- HydeNetwork(bagOfModels)
这些对象所基于的PE
数据集本身相当大,而在网络的列表版本(bagNet
)中,PE
在所有七个模型对象。这肯定是气球的大小:
> object.size(autoNet)
397344 bytes
> object.size(bagNet)
26969592 bytes
现在,当我尝试打印对象时,执行打印所需的时间差别很大。 (我知道system.time
,但它没有显示隐式打印的执行时间,所以我正在使用丑陋的工作,抱歉)
#* time to print autoNet
> a <- Sys.time()
> autoNet
> b <- Sys.time()
> b-a
Time difference of 0.172601 secs
#* Time to print bagNet
> a <- Sys.time()
> bagNet
> b <- Sys.time()
> b-a
Time difference of 33.53736 secs
#* Time to print bagNet explicitly
> a <- Sys.time()
> print(bagNet)
> b <- Sys.time()
> b-a
Time difference of 0 secs
在R-devel上有一个brief discussion,但它并没有说它是对象的大小正在减慢打印速度。我的假设是否正确?我只是想知道是否应该在我的软件包文档中推荐使用显式打印。
答案 0 :(得分:1)
是的,但仅限于当前的R版本,而不是R-devel,它将在4月份作为R 3.2.0发布。直到最近,自动打印的实现以一种方式完成,当通过方法分派处理打印时导致对象被复制。现在已经解决了这个问题。