用于清除工作区和转储存储的 R 全局函数

R Global Function to Clear Workspace and Dump Storage

我希望创建一个全局函数来清除我的工作区并转储我的内存。我将我的函数称为“cleaner”并希望它执行以下代码:

remove(list = ls())
gc()

我尝试在全局环境中创建函数,但是当我 运行 它时,控制台只打印函数的文本。在我要获取的函数文件中:

cleaner <- function(){
    remove(list = ls())
    gc()
    #I tried adding return(invisible()) to see if that helped but no luck
}

cleaner()

即使我在脚本中创建函数时我希望它 运行(通过采购消除任何潜在的错误),存储转储似乎有效,但它仍然没有清除工作区。

对此有两个想法:您的代码不会删除所有对象,要删除隐藏的对象,请使用

rm(list = ls(all.names = TRUE))

还有命令 gctorture(),它 在(几乎)每个内存分配上引发垃圾收集 (如手册页所述)。它旨在供 R 开发人员找出内存保护错误:

cleaner <- function(){
    # Turn it on
    gctorture(TRUE)

    # Clear workspace
    rm(list = ls(all.names = TRUE, envir=sys.frame(-1)),
       envir = sys.frame(-1))

    # Turn it off (important or it gets very slow)
    gctorture(FALSE)
}

如果在函数内使用此过程,则会出现以下问题:由于函数有自己的栈帧,因此只会删除此栈帧内的对象。它们仍然存在于外部。因此,必须用sys.frame(-1)单独指定,只考虑高层栈帧。然后,仅在调用 cleaner() 的函数内和退出函数时在 cleaner 本身中删除变量。

但这也意味着只能从顶层调用该函数才能正常运行(您可以使用 sys.frames() 列出所有更高级别的堆栈帧来构建也可以避免此问题的东西如果真的有必要的话)