在R中的函数内保存单个对象:RData文件大小非常大

我试图在R中保存修剪下来的GLM对象(即将所有“非必要”特征设置为NULL,例如残差,prior.weights,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,同样我也尝试通过<< - 分配glmObject使其成为全局的,但似乎没有任何帮助。

我对R环境的理解显然不是很好,如果有人能提出解决方法,我会非常感激。 谢谢。


公式有附加的环境。 如果这是全球环境或包装环境,则不会保存,但如果它不是可以重建的,则会被保存。

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


当您在电话中命名参数以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加载到我的全局环境中。

链接地址: http://www.djcxy.com/p/38305.html

上一篇: Saving a single object within a function in R: RData file size is very large

下一篇: Rshiny gives error after loading rpart.object type using .RData file