从函数中删除.GlobalEnv中的对象

时间:2011-01-29 14:48:37

标签: r environment

我想创建一个函数(CleanEnvir),它基本上调用remove / rm并从.GlobalEnv中删除某些对象。

  CleanEnvir <- function(pattern = "tmp"){
      rm(list = ls()[grep("tmp", ls())], envir = globalenv())
  }

  keep <- 1
  tmp.to.be.removed <- 0
  ls()

  ## does not work
  CleanEnvir()
  ls()

  ## does work
  rm(list = ls()[grep("tmp", ls())], envir = globalenv())
  ls()

3 个答案:

答案 0 :(得分:19)

ls()需要找到正确的位置。默认情况下,它会查看当前帧,即您案例中函数CleanEnvir的值,因此只会在原始文件中找到"pattern"

CleanEnvir <- function(pattern = "tmp") {
    objs <- ls(pos = ".GlobalEnv")
    rm(list = objs[grep("tmp", objs)], pos = ".GlobalEnv")
}

给出了:

> CleanEnvir <- function(pattern = "tmp") {
+     objs <- ls(pos = ".GlobalEnv")
+     rm(list = objs[grep("tmp", objs)], pos = ".GlobalEnv")
+ }
> ls()
[1] "CleanEnvir"        "foo"               "keep"             
[4] "tmp.to.be.removed"
> CleanEnvir()
> ls()
[1] "CleanEnvir" "foo"        "keep"

答案 1 :(得分:8)

您需要在全球环境中进行搜索以及在那里删除:

CleanEnvir <- function(pattern = "tmp"){
      rm(list = ls(envir=globalenv())[
             grep("tmp", ls(envir=globalenv()))], envir = globalenv())
  }

答案 2 :(得分:2)

我得到的最短代码解决方案就是这个:

删除特定变量:

y <- TRUE

CleanEnvir <- function(x) {rm(list=deparse(substitute(x)),envir=.GlobalEnv)}

CleanEnvir(y)
y

deparse替换来粘贴变量名而不是它的值, 确实是pos =&#34; .GlobalEnv&#34;有效,但您也可以使用envir = .GlobalEnv

解决方案2:这实际上允许模式匹配。 (我强烈建议不要这样做,因为你可能会删除你不想意外删除的东西。你想要删除tmp1和tmp2,但是你忘了还有另一个名为Global.tmp和localtmp的变量。温度,例如。

按模式删除:

myvar1 <- TRUE
myvar2 <- FALSE 

Pat.clean.Envir <- function(x) { rm(list = ls(.GlobalEnv)[grep(deparse(substitute(x)), ls(.GlobalEnv))], envir = .GlobalEnv) }

Pat.clean.Envir(myvar)

欢呼声。