【问题标题】:R Global Function to Clear Workspace and Dump StorageR 全局函数清除工作区和转储存储
【发布时间】:2020-11-04 03:52:15
【问题描述】:

我希望创建一个全局函数来清除我的工作空间并转储我的内存。我将我的函数称为“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()

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

【问题讨论】:

  • 清洁器()?还是cleanerFile()?
  • 糟糕,我附上了错误的屏幕截图。但结果相同。
  • 别介意我之前的评论,它不会做你想要的。做你想做的最好的方法是重新启动 R,但我不知道运行命令行的好方法。在 RStudio 中,您将使用快捷键 Ctrl(或 Cmd)+ Shift + F10,或单击 Session -> Restart R
  • 当我执行 Ctrl + Shift + F10 并重新启动时,我的环境中仍然有我的所有变量、df、函数等。谷歌搜索这表明这是由于自动保存我的 .RData,我宁愿不禁用它。我有一个用于清除工作区的键盘快捷键,但我想知道是否可以创建一个也执行 gc() 的命令,因为没有键盘快捷键。这是两行代码,所以根本没有太多工作,但现在我只是想知道为什么我上面的函数不起作用。
  • 可能是因为您正在保存 .RData,我建议您不要这样做。 onunicornsandgenes.blog/2017/04/02/…

标签: r function global-functions


【解决方案1】:

对此有两个想法:您的代码不会删除所有对象,也可以删除隐藏的对象

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() 列出所有更高级别的堆栈帧来构建一些东西,如果确实需要也可以避免这个问题)

【讨论】:

  • 谢谢,我不知道隐藏文件。您的代码效果很好,我可以将其运行为 3 行,但是真的没有办法制作像更清洁
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
相关资源
最近更新 更多