采购后清理全局环境:如何在R中删除特定类型的对象

mcj*_*udd 4 r

我读了一个公共用途的数据集,该数据集在构建最终数据框的过程中创建了数十个临时向量。由于将在较大过程中分析此数据框,因此我计划source使用R脚本来创建该数据框,但不想让自己或将来的用户陷入混乱的全球环境。

我知道我可以ls用来列出全局环境中的当前对象,也可以rm用来删除某些对象,但是我不确定如何一起使用这两个函数来删除除由某个脚本创建的数据帧以外的所有对象

为了澄清,这是一个可重现的示例:

脚本1,名为“ script1.R”

setwd("C:/R/project")
set.seed(12345)
var <- letters
for (i in var) {
  assign(i, runif(1))
}
df <- data.frame(x1 = a, x2 = b, x3 = c)
Run Code Online (Sandbox Code Playgroud)

剧本2

source("script1.r")
Run Code Online (Sandbox Code Playgroud)

这将是很容易的,除去来自所有矢量source通过一些组合d脚本rmlspattern = letters或类似的东西,但我想要做的就是创建一个通用功能,能够消除一定的脚本创建的所有载体和只保留数据帧(在这个例子中df)。

这里这里都有类似的问题,但是我觉得我的与众不同,因为它更具体地涉及多脚本项目中的采购和清理)。

更新资料 在环顾四周时,以下链接为我提供了不错的解决方法:

如何在保留某些对象的同时整洁地清理我的R工作区?

具体来说,用户@Fojtasek建议:

我将通过创建一个单独的环境来存储所有垃圾变量,使用with()创建数据框,然后将要保留的变量复制到主环境中来解决这个问题。这样的好处是整洁,而且还可以保留所有对象,以防您再次查看它们。

因此,我可以按如下所示追加创建数据框的源代码...

temp <- new.env()
with(temp, {
    var <- letters
for (i in var) {
  assign(i, runif(1))
}
df <- data.frame(x1 = a, x2 = b, x3 = c)
}
Run Code Online (Sandbox Code Playgroud)

...然后将所需的数据框(df)提取到我的全局环境中,但是我很好奇是否还有其他优雅的解决方案,或者我是否对此进行了错误思考。

谢谢。

Joe*_*Joe 6

作为一种替代方法(类似于@Ken在注释中的建议),以下代码允许您删除在特定点之后创建的所有对象,但指定的一个(或多个)对象除外:

freeze <- ls() # all objects created after here will be deleted
var <- letters
for (i in var) {
    assign(i, runif(1))
}
df <- data.frame(x1 = a, x2 = b, x3 = c)
rm(list = setdiff(ls(), c(freeze, "df"))) #delete old objects except df
Run Code Online (Sandbox Code Playgroud)

这里的主力是setdiff(),它将返回一个列表,该列表列出了出现在第一个列表中而不是第二个列表中的项目。在这种情况下,所有项目都在freezeexcept 之后创建df。另外,freeze这里也删除了它。