2015-01-25 20 views
6

Ich habe viele verschiedene Objekte in meiner globalen Umgebung geladen. Wie kann ich nur die Datenframes ausschließen und die anderen Objekte behalten? Beispiel:Ausschließen bestimmter Objekttypen aus der globalen Umgebung

DF1 <- data.frame(rnorm(10)) 
DF2 <- data.frame(rnorm(10)) 
DF3 <- data.frame(rnorm(10)) 

list1 <- list("a", "b", "c") 
list2 <- list("a", "b", "c") 
tf <- tempfile() 
td <- tempdir() 

Die Lösung, die ich im Sinne hatte, sah so etwas wie diese (natürlich es hat nicht funktioniert)

remove(pattern="*.Rdata") 

Antwort

8

Hier ist eine Funktion, die ich für Aufgaben wie diese verwendet werden. rmSome() tut genau das, entfernt nur einige der Objekte aus einer Umgebung. Dies geschieht durch Anwenden der Funktion, die in ihrem ersten Argument gegeben ist (d. H. Eine is*-Funktion wie is.data.frame() für Datenrahmen, is.list() für Listen usw.) zu der Liste von Objekten in der gegebenen Umgebung und zum Ausfiltern der Ergebnisse.

rmSome <- function(FUN, env = globalenv(), negate = FALSE) { 
    fun <- match.fun(FUN) 
    if(negate) fun <- Negate(fun) 
    objget <- mget(ls(envir = env), envir = env) 
    rmnames <- names(Filter(fun, objget)) 
    rm(list = rmnames, envir = env) 
} 

Zum Beispiel können Sie alle Datenrahmen aus der globalen Umwelt mit

rmSome(is.data.frame) 

Also für Ihr gegebenes Beispiel entfernen, können Sie die alle Datenrahmen wie folgt entfernen:

## -- rm(list=ls()) here -- 
## Define rmSome() here 
DF1 <- data.frame(rnorm(10)) 
DF2 <- data.frame(rnorm(10)) 
DF3 <- data.frame(rnorm(10)) 
list1 <- list("a", "b", "c") 
list2 <- list("a", "b", "c") 
tf <- tempfile() 
td <- tempdir() 

## remove all data frames 
rmSome(is.data.frame) 
ls() 
# [1] "list1" "list2" "rmSome" "td"  "tf"  

Auf der anderen Seite, wenn Sie alle Datenrahmen behalten und alles andere entfernen möchten, würden Sie das Entfernen von Datenrahmen wie folgt negieren:

rmSome(is.data.frame, negate = TRUE) 

Bisher habe ich keine Probleme bei der Verwendung der anderen Funktionen wie is.numeric(), is.environment() usw. zum Entfernen von Numerik, Umgebungen, etc. Aber die Funktion ist derzeit nicht eingerichtet zu handhaben mehr als ein Objekttyp gefunden zu einer Zeit.

Update 1/28/2015:eapply() kann auch zum Anwenden einer Funktion auf eine Umgebung verwendet werden. Hier ist eine zweite Funktion, die Sie verwenden könnten, wenn Sie mget() nicht mögen. Es kann genau wie die oben genannten Aufrufe verwendet werden und ist wahrscheinlich der bessere Weg.

rmSome2 <- function(FUN, env = globalenv(), negate = FALSE) { 
    fun <- match.fun(FUN) 
    if(negate) fun <- Negate(fun) 
    ue <- unlist(eapply(env, fun)) 
    rm(list = names(ue)[ue], envir = env) 
} 
Verwandte Themen