我正在尝试在R中保存已修剪的GLM对象(即将所有"非必要"特征设置为NULL,例如残差,先前权重,qr $ qr)。
作为一个例子,看看我需要做的最小的对象:
print(object.size(glmObject))
168992 bytes
save(glmObject, "FileName.RData")
在全局环境中分配此对象并保存导致大约6KB的RData文件。
但是,我实际上需要在函数内创建和保存glm对象,函数本身就是一个函数。所以代码看起来像:
subFn <- function(DT, otherArg, ...){
glmObject <- glm(...)
save(glmObject,"FileName.RData")
}
mainFn <- function(DT, ...){
subFn(DT, otherArg, ...)
}
mainFn(DT, ...)
这导致了大约20 MB的更大,更大的RData文件,尽管对象本身大小相同。
所以我理解这是一个环境问题,但我正在努力确切地指出它是如何以及为什么会发生的。生成的文件大小似乎变化很大。我尝试过使用saveRDS,同样我尝试通过&lt;&lt; - 来分配glmObject以使其全局化,但似乎没有任何帮助。
我对R中环境的理解显然不是很好,如果有人能提出解决方法的话,我会非常感激。感谢。
答案 0 :(得分:4)
公式附有环境。如果那是全局环境或包环境,则不会保存,但如果它不是可以重建的,则会保存。
glm
结果通常包含公式,因此它们可以包含附加到该公式的环境。
您不需要glm
来证明这一点。试试这个:
formula1 <- y ~ x
save(formula1, file = "formula1.Rdata")
f <- function() {
z <- rnorm(1000000)
formula2 <- y ~ x
save(formula2, file = "formula2.Rdata")
}
f()
当我运行上面的代码时,formula1.Rdata
最终为114字节,而formula2.Rdata
最终为7.7 MB。这是因为后者捕获了它创建的环境,并且包含大向量z
。
要避免这种情况,请在保存公式之前清理创建公式的环境。不要删除公式引用的内容(因为glm
可能需要这些内容),但删除不相关的内容(例如我的示例中的z
)。参见:
g <- function() {
z <- rnorm(1000000)
formula3 <- y ~ x
rm(z)
save(formula3, file = "formula3.Rdata")
}
g()
这给出了144个字节的formula3.Rdata
。
答案 1 :(得分:2)
在您对save
的调用中命名参数时,您是否发现存在同样的问题?
我用过:
subFn <- function(y, x){
glmObject <- glm(y ~ x, family = "binomial")
save(list = "glmObject", file = "FileName.RData")
}
mainFn <- function(y, x){
subFn(y, x)
}
mainFn(y = rbinom(n = 10, size = 1, prob = 1 / 2), x = 1:10)
我看到文件“FileName.RData”是在我的工作目录中创建的。它的尺寸为6.6 kb。
然后我使用:
load("FileName.RData")
将内容glmObject
加载到我的全局环境中。