Remove objects in .GlobalEnv from within a function

人盡茶涼 提交于 2020-01-01 02:08:22

问题


I would like to create a function (CleanEnvir) which basically calls remove/rm and which removes certain objects from .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()

回答1:


ls() needs to look in the correct place. By default it looks in the current frame, that of the function CleanEnvir in your case and hence was only finding "pattern" in your original.

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

Which gives:

> 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"



回答2:


You need to do your search in the Global Env as well as the removal there:

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



回答3:


Shortest code solution I got for this is this one:

remove a specific variable:

y <- TRUE

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

CleanEnvir(y)
y

deparse substitute to paste the variable name rather than its value, and indeed pos = ".GlobalEnv" works, but you can also simply use envir=.GlobalEnv

SOLUTION 2: This actually allows for pattern matching. (I STRONGLY recommend against this because you could possibly remove stuff you don't want to remove by accident. I.e. you want to remove tmp1 and tmp2 but you forgot that there is another variable that is called Global.tmp and localtmp as in temperature for example.

remove by pattern:

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)

cheers.



来源:https://stackoverflow.com/questions/4837477/remove-objects-in-globalenv-from-within-a-function

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!