Подтвердить что ты не робот

Удалить объекты в .GlobalEnv из функции

Я хотел бы создать функцию (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()
4b9b3361

Ответ 1

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"

Ответ 2

Вам нужно выполнить поиск в Global Env, а также там:

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

Ответ 3

Самое короткое решение для кода, которое я получил для этого:

удалить определенную переменную:

y <- TRUE

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

CleanEnvir(y)
y

заменитель deparse, чтобы вставить имя переменной, а не ее значение, и действительно pos = ".GlobalEnv" работает, но вы также можете просто использовать 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)

приветствий.