我有一个根代码里面有很多脚本。在运行了前4个脚本之后,我可能需要取消从第4个脚本获得的环境中的对象。有可能吗?另一种选择是m(),但这样我就必须重新运行所有脚本,这需要一段时间,因为我有大量的数据。


定义一个函数rm_new() (在你的"根代码"中):

rm_new=function( old ) {
    current=ls(,envir=parent.frame())
    to_delete = current[!(current %in% old)]
    rm( list=to_delete,envir=parent.frame() )
}

当你到达你的"根代码"的末尾时,记住你想要保存的对象:

obj_to_keep=c("obj_to_keep",ls())

现在您可以添加您喜欢的任何东西,并使用rm_新()删除它当您完成它:

a=1:100
obj_to_keep=c("obj_to_keep",ls())

b=1:50
ls()
# [1] "a"           "b"           "obj_to_keep" "rm_new"   

rm_new( old=obj_to_keep )
ls()
# [1] "a"           "obj_to_keep" "rm_new"  

如果第4脚本中的对象共享一些共同的东西,比如名称前缀,你可以尝试ls(pattern = "prefix") .如果不是,你还可以ls 在每个剧本之后rm 只移除新的物体。

为什么不运行不想在函数中保留对象的脚本呢?这样,它们将保存在不同的环境中,并在函数完成时被销毁。只返回您想要保存的对象。