【发布时间】:2015-03-27 14:28:42
【问题描述】:
我阅读了一个公共数据集,该数据集在构建最终数据框的过程中创建了数十个临时向量。由于此数据框将作为更大流程的一部分进行分析,因此我计划 sourceing 创建数据框的 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)
脚本 2
source("script1.r")
通过rm、ls 与pattern = letters 或类似的组合,从sourced 脚本中删除所有向量很容易,但我想做的是创建一个通用函数删除由某个脚本创建的所有向量,只保留数据帧(在本例中为df)。
(注意:有类似here和here的问题,但我觉得我的不同之处在于更具体地用于多脚本项目上下文中的采购和清理)。
更新 在环顾四周时,以下链接给了我一个很好的解决方法:
How can I neatly clean my R workspace while preserving certain objects?
具体来说,用户@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)
}
...然后将所需的数据帧 (df) 提取到我的全局环境中,但我很好奇是否还有其他优雅的解决方案,或者我是否错误地考虑了这一点。
谢谢。
【问题讨论】:
-
您是否真的像本例中那样存储了要删除的变量的名称(通过
var)? -
我无法测试这个 atm,因为我不在我的 R 终端前面,但由于
ls返回一个向量,你可以在 @987654340 之前和之后做一个ls@,然后遍历并删除除数据框之外的差异。 -
@Dason 不,我没有。它们都是以不同的方式创建的。我只是用它作为一个例子来展示你如何在你的全局环境中拥有多个用于创建数据框的向量。
-
这有帮助吗? stackoverflow.com/questions/28142088/… 好像和你做的一样
-
创建一个新环境,只导入你想要的,然后将所需的对象传递给全局环境,最好是从函数中返回它,这可能更有意义。
标签: r