在使用随机生成的输入数据测试R中的模拟时,我发现并修复了一些错误,现在想要使用相同的数据重新运行模拟,但删除了所有中间变量以确保它是干净的测试。
有没有办法从工作区中删除数十个手动选择的变量,而不必:
a)破坏整个工作空间,例如rm(list=ls())
,或b)键入每个变量名称,例如remove(name1, name2, ...)
?
理想的解决方案是使用ls()
来检查定义,然后选择我要删除的索引,例如。
ls() # inspect definitions
delme <- c(3,5,7:9,11,13) # names selected for removal
remove(ls()[delme]) # DESIRED SOLUTION -- doesn't quite work this way
(事后看来,我应该使用固定的种子来生成随机输入数据,这样可以清除所有内容,然后重新运行测试......)
答案 0 :(得分:5)
阿萨德,虽然我认为问题的实际答案在评论中,但我建议将这种模式作为更广泛的解决方案:
rm(list=
Filter(
Negate(is.na), # filter entries corresponding to objects that don't meet function criteria
sapply(
ls(pattern="^a"), # only objects that start with "a"
function(x) if(is.matrix(get(x))) x else NA # return names of matrix objects
) ) )
在这种情况下,我将删除所有以“a”开头的矩阵对象。通过在此处修改pattern
参数和sapply
使用的函数,您可以很好地控制删除的内容,而无需指定多个名称。
如果您担心这可能会删除您不想删除的内容,可以将Filter(...
操作的结果存储在变量中,查看内容,然后执行rm(list=...)
命令。
答案 1 :(得分:3)
有一个更简单,更直接的解决方案:
vars.to.remove <- ls()
vars.to.remove <- temp[c(1,2,14:15)]
rm(list = vars.to.remove)
或者,更好的是,如果你擅长变量命名方案,你可以使用以下模式匹配策略:
E.g。我用起始字符串命名所有临时变量&#34; Temp。&#34; ...所以,你可以拥有Temp.Names,Temp.Values,Temp.Whatever
以下内容生成与此模式匹配的变量列表
ls(pattern = "Temp.")
因此,您可以使用 ONE 代码行删除所有不需要的变量,如下所示:
rm(list = ls(pattern = "Temp."))
希望这会有所帮助。
答案 2 :(得分:0)
尝试
的eval(解析(文本=膏( “RM(” 膏(LS()[代尔姆],九月= “ ”),“)”)))
答案 3 :(得分:0)
我有类似的要求。我将所需的所有元素都列入了一个列表:
varsToPurge = as.list(ls())
然后我重新分配我希望保留的新变量名的几个值,这些变量名不在变量varsToPurge中。之后我循环了元素
for (j in 1:length(varsToPurge)){
rm(list = as.character(varsToPurge[j]))
}
进行一些垃圾收集,并在编写代码时保持干净的环境。
gc()
你也可以使用你希望保留的行号向量,并在循环中浏览向量,但如果添加要删除的粗略工作,它将不会像动态一样。