我读到了一个公共数据集,该数据集在构建最终数据帧的过程中创建了数十个临时向量。由于该数据框将作为更大流程的一部分进行分析,因此我计划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)
Script 2
source("script1.r")
从向量中删除所有向量是很容易的source
d 脚本通过某种组合rm
, ls
with pattern = letters
或类似的东西,但我想做的是创建一个通用函数,删除由某个脚本创建的所有向量并只保留数据帧(在本例中,df
).
(NOTE: 有类似的问题here https://stackoverflow.com/questions/2914792/what-ways-are-there-for-cleaning-an-r-environment-from-objects and here https://stackoverflow.com/questions/28142088/how-to-exclude-only-the-data-frames-from-the-global-environment-in-r,但我觉得我的不同之处在于它更具体于多脚本项目背景下的采购和清理)。
Update在环顾四周时,以下链接给了我一个很好的解决方法:
如何在保留某些对象的同时整齐地清理 R 工作区? https://stackoverflow.com/questions/2822532/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
)到我的全球环境,但我很好奇是否还有其他优雅的解决方案,或者我是否错误地思考了这个问题。
Thanks.