如何在R代码块运行后自动清除其中创建的所有对象?
自动清除R代码块创建对象的方案
一、单代码块手动运行时的解决办法
直接用local()把代码块包起来,就能让里面创建的对象只存在于临时局部环境,执行完自动被垃圾回收清掉,不用手动rm:
local({ ##### 初始化对象 listDfForML <- list( data.frame(value=rnorm(100), group=rep(c("A", "B"), each=50)), data.frame(value=rnorm(100), group=rep(c("C", "D"), each=50)) ) ##### 执行分析 lapply(listDfForML, function(x) mean(x$value)) })
- 原理:
local()会生成一个临时小环境,代码里的所有对象都只在这个小环境里存在,代码跑完这个环境就被R自动回收,不会占用全局环境的资源。 - 如果要把分析结果存到全局环境,要么用
result <- local({ ... })把返回值存起来,要么用<<-赋值(不建议滥用,必要时再用)。
二、knit文档时的自动清理方案
如果是在R Markdown/Quarto里knit,有两种实现方式:
方式1:给单个代码块指定临时环境
在代码块参数里加envir = new.env(),让代码在独立环境里运行,knit完成后这个环境会被自动销毁:
##### 初始化对象 listDfForML <- list( data.frame(value=rnorm(100), group=rep(c("A", "B"), each=50)), data.frame(value=rnorm(100), group=rep(c("C", "D"), each=50)) ) ##### 执行分析 lapply(listDfForML, function(x) mean(x$value))
方式2:全局钩子批量处理所有代码块
如果想让所有代码块都自动清理对象,在文档开头的setup代码块里添加knitr钩子:
knitr::knit_hooks$set(clean = function(before, options, envir) { if (!before) { rm(list = ls(envir), envir = envir) } })
之后只要在需要自动清理的代码块参数里加clean=TRUE即可:
##### 初始化对象 listDfForML <- list( data.frame(value=rnorm(100), group=rep(c("A", "B"), each=50)), data.frame(value=rnorm(100), group=rep(c("C", "D"), each=50)) ) ##### 执行分析 lapply(listDfForML, function(x) mean(x$value))
- 原理:这个钩子会在代码块执行完成后,自动清空该代码块所在环境里的所有对象。
内容的提问来源于stack exchange,提问作者Yacine Hajji
相关产品推荐
相关产品推荐

