gpt4 book ai didi

r - 返回和保存时如何清理函数闭包(环境)?

转载 作者:行者123 更新时间:2023-12-04 10:09:55 26 4
gpt4 key购买 nike

我有一个这样的计算(请注意,这只是非常简化的、缩减版的、最小的可重现示例!):

computation <- function() # simplified version!
{
# a lot of big matrices here....
big_matrix <- matrix(rnorm(2000*2000), nrow = 2000, ncol = 2000)

exp.value <- 4.5
prior <- function (x) rep(exp.value, nrow(x))

# after computation, it returns the model
list(
some_info = 5.18,
prior = prior
)
}

此函数拟合并返回一个模型,我想将其保存到磁盘:
m <- computation()
save(m, file = "tmp.Rdata")
file.info("tmp.Rdata")$size
# [1] 30713946

不幸的是,正如你所看到的,文件太大了,因为它包含了函数 prior() 的整个闭包。 ,并且这个闭包包含来自 computation() 的所有数据函数,包括 big_matrix (在我的完整代码中有很多)。

现在,我尝试通过使用 environment(prior) <- list2env(list(exp.value = exp.value)) 重新定义先验函数的环境(闭包)来修复它。 :
exp.value <- 4.5
environment(m$prior) <- list2env(list(exp.value = exp.value))
save(m, file = "tmp.Rdata")
file.info("tmp.Rdata")$size
# [1] 475

这按预期工作!不幸的是,当我将此清理代码放入计算()函数时(实际上,当我将此代码放入任何函数时),它停止工作!看:
computation <- function() # simplified version!
{
# a lot of big matrices here....
big_matrix <- matrix(rnorm(2000*2000), nrow = 2000, ncol = 2000)

exp.value <- 4.5
prior <- function (x) rep(exp.value, nrow(x))
environment(prior) <- list2env(list(exp.value = exp.value)) # this is the update

# after computation, it returns the model
list(
some_info = 5.18,
prior = prior
)
}
m <- computation()
save(m, file = "tmp.Rdata")
file.info("tmp.Rdata")$size
# [1] 30713151

文件又大了,关闭没有正确清理。
  • 我不明白这是怎么回事?为什么清理代码在任何函数之外运行时有效,而在函数中停止工作?
  • 如何使它在函数内工作?
  • 最佳答案

    解决问题的一种方法是在返回之前从环境中删除大变量。

    computation <- function() 
    {
    big_matrix <- matrix(rnorm(2000*2000), nrow = 2000, ncol = 2000)

    exp.value <- 4.5
    prior <- function (x) rep(exp.value, nrow(x))

    rm(big_matrix) ## remove variable

    list(
    some_info = 5.18,
    prior = prior
    )
    }

    您的问题 list2env方法是默认情况下它指向当前环境作为新环境的父环境,因此无论如何您都在捕获函数内的所有内容。您可以改为将全局环境指定为基础环境
    computation <- function() 
    {
    big_matrix <- matrix(rnorm(2000*2000), nrow = 2000, ncol = 2000)

    exp.value <- 4.5
    prior <- function (x) rep(exp.value, nrow(x))
    # explicit parent
    environment(prior) <- list2env(list(exp.value = exp.value), parent=globalenv())

    list(
    some_info = 5.18,
    prior = prior
    )
    }

    (如果你指定 emptyenv() 那么你将无法找到像 rep() 这样的内置函数)

    关于r - 返回和保存时如何清理函数闭包(环境)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58866842/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com