如何删除选定的R变量而不必键入其名称

时间:2014-02-10 12:59:36

标签: r variables reset clear

在使用随机生成的输入数据测试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

(事后看来,我应该使用固定的种子来生成随机输入数据,这样可以清除所有内容,然后重新运行测试......)

4 个答案:

答案 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()

你也可以使用你希望保留的行号向量,并在循环中浏览向量,但如果添加要删除的粗略工作,它将不会像动态一样。