2011-01-29 11 views
10

Vorrei creare una funzione (CleanEnvir) che in pratica chiama remove/rm e che rimuove determinati oggetti da .GlobalEnv.Rimuovere oggetti in .GlobalEnv dall'interno di una funzione

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

risposta

17

ls() ha bisogno di guardare nel posto giusto. Per impostazione predefinita appare nel fotogramma corrente, quello della funzione CleanEnvir nel tuo caso e, quindi, è stato solo trovare "pattern" nella vostra originale.

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

che dà:

> 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

Grazie, funziona! Ho completamente ignorato la ls() - parte ... –

6

Hai bisogno di fare la ricerca nel Env globale, nonché la rimozione là:

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

Grazie non ho mai considerato le ls() - parte come problematica BTW, il secondo ls() in grep() ha anche bisogno. per essere sostituito da ls (envir = globalenv()). –

+0

OK. Suona bene, quindi ha aggiunto, ma sembrava a lavorare quando ho provato in precedenza. –

2

soluzione di codice più breve ho ottenuto per questo è questo:

rimuovere una variabile specifica:

y <- TRUE 

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

CleanEnvir(y) 
y 

sostituto Deparse per incollare la variabile nome piuttosto che il suo valore, e infatti pos = ".GlobalEnv" funziona , Ma è anche possibile utilizzare semplicemente envir = .GlobalEnv

SOLUZIONE 2: In questo modo in realtà per il pattern matching. (I suggerisca vivamente contro questo, perché si potrebbe eventualmente rimuovere cose che non si vuole rimuovere per caso. Vale a dire che si desidera rimuovere tmp1 e tmp2, ma si è dimenticato che c'è un'altra variabile che si chiama Global.tmp e localtmp come in temperatura per ..! esempio

rimuovere dal modello:

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) 

applausi

+0

Questo * è * più corto delle altre risposte, ma non consente la corrispondenza parziale degli argomenti come suggerito nell'OP. – BenBarnes

+0

Ok ho modificato una soluzione che lo fa. Tuttavia, l'utente non ha mai chiesto la corrispondenza del modello nel titolo o nel questionario descrittivo. Solo nel suo codice c'è un approccio che coinvolge il pattern Matching. Come spiegato nella mia risposta, raccomando fortemente contro il pattern pattern parziale, perché se lo fai male rimuoverai la variabile sbagliata. Esegui per divertimento con il modello di 1 lettera: "a" per errore, e l'80% delle tue variabili sono sparite. – Mark

Problemi correlati