2011-01-29 12 views
10

Me gustaría crear una función (CleanEnvir) que básicamente llama a eliminar/rm y que elimina ciertos objetos de .GlobalEnv.Eliminar objetos en .GlobalEnv desde dentro de una función

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

Respuesta

17

ls() tiene que buscar en el lugar correcto. Por defecto, se ve en el cuadro actual, el de la función CleanEnvir en su caso y, por lo tanto, solo encontró "pattern" en su original.

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

cual da:

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

Gracias, eso funciona! Ignoré por completo el ls() - parte ... –

6

que tiene que hacer su búsqueda en el Env Mundial, así como la eliminación ahí:

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

Gracias nunca consideró las ls() - parte como problemáticos por cierto, el segundo ls() en grep() también necesita. para ser reemplazado por ls (envir = globalenv()). –

+0

OK. Suena bien, así que se agregó, pero pareció funcionar cuando lo probé antes. –

2

solución de código más corta que tengo para esto es la siguiente:

eliminar una variable específica:

y <- TRUE 

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

CleanEnvir(y) 
y 

sustituto deparse para pegar la variable nombre en lugar de su valor, y de hecho pos = ".GlobalEnv" funciona , pero también puede usar simplemente envir = .GlobalEnv

SOLUCIÓN 2: Esto realmente permite la coincidencia de patrones. (Recomiendo enfáticamente que esto no sea posible porque es posible que pueda eliminar cosas que no desea eliminar por accidente. Es decir, desea eliminar tmp1 y tmp2, pero olvidó que hay otra variable que se llama Global.tmp y localtmp como temperatura para ..! ejemplo

quite por patrón:

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) 

aplausos

+0

Este * es * más corto que las otras respuestas, pero no permite la coincidencia parcial de argumentos como se sugiere en el PO. – BenBarnes

+0

Ok, edité una solución que hace eso. Sin embargo, el usuario nunca solicitó la coincidencia de patrones en el título o la pregunta descriptiva. Solo en su código hay un enfoque que implica un patrón de coincidencia. Como expliqué en mi respuesta, recomiendo encarecidamente que no se utilicen modelos parciales porque si lo hace incorrectamente, eliminará la variable incorrecta. Ejecútelo por diversión con un patrón de 1 letra: "a" por accidente, y el 80% de sus variables se han ido. – Mark

Cuestiones relacionadas