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

Ass*_*him 6 variables r 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
Run Code Online (Sandbox Code Playgroud)

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

Hon*_*dha 6

有一个更简单、更直接的解决方案:

vars.to.remove <- ls()
vars.to.remove <- temp[c(1,2,14:15)]
rm(list = vars.to.remove)
Run Code Online (Sandbox Code Playgroud)

或者,更好的是,如果您擅长变量命名方案,则可以使用以下模式匹配策略:

例如,我用起始字符串“Temp”命名所有临时变量。... 所以,你可以有 Temp.Names、Temp.Values、Temp.Whatever

以下生成与此模式匹配的变量列表

ls(pattern = "^Temp\\.")
Run Code Online (Sandbox Code Playgroud)

所以,你可以使用删除所有不需要的变量ONE行代码,如下所示:

rm(list = ls(pattern = "^Temp\\."))
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。


Bro*_*ieG 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
) ) )
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我将删除所有以"a"开头的矩阵对象.通过修改此处pattern使用的参数和函数sapply,您可以非常精确地控制删除的内容,而无需指定多个名称.

如果您担心这可能会删除您不想删除Filter(...的内容,则可以将操作结果存储在变量中,查看内容,然后执行rm(list=...)命令.